Nossa máquina virtual (MV) tem CPU e Memória.
Considere a memória como um array contíguo de posições de memória. Cada posição de memória são 4 bytes. A memória tem
- 1024 posições.
- tamMemoria = 1024
- array mem[tamMemoria] of posicaoDeMemoria // adotamos 32 bits
O processador possui os seguintes registradores:
- um contador de instruções (PC)
- oito registradores, 0 a 7 O conjunto de instruções é apresentado na tabela a seguir, adaptado de [1]
Construa os seguintes programas para a nossa MV, no mínimo os que seguem:
- (fibonacci10) O programa escreve em posições sabidas de memórias os 10 números da sequência de fibonacci. Ou seja, ao final do programa a memória tem estes 10 números em posições convencionadas no programa.
- (fibonaccin) O programa lê um valor de uma determinada posição (carregada no inicio),
se o número for menor que zero coloca -1 no início da posição de memória para
saída;
Se for maior que zero este é o número de valores da sequencia de fibonacci a serem escritos em sequencia a partir de uma posição de memoria; - (fatorial) Dado um inteiro em alguma posição de memória,
se for negativo armazena -1 na saída;
se for positivo responde o fatorial do número na saída. - (bubblesort) para um N definido (5 por exemplo)
o programa ordena um vetor de N números em alguma posição de memória;
ordena usando bubble sort
loop ate que nao swap nada
passando pelos N valores
faz swap de vizinhos se da esquerda maior que da direita
Construa um shell, ou seja, um terminal interativo que:
- oferece um prompt ao usuário
- o usuário pode solicitar a execução de um programa
- a partir disso
- o programa é carregado
- executado
- ao acabar retorna controle para o shell
- para armazenar o programa, pode-se adotar
- um arquivo por programa, ou mesmo
- que existe uma estrutura em memória com os programas que são então carregados para a memória da VM.
Implemente: a MV descrita acima; o Shell; e rotinas necessárias.
Defina como acontece a carga do programa em memória e o início da execução.
Execute os programas P1 a P4 na MV.
Instrumente para ver o andamento do processamento na MV.
Cada palavra da memória é um objeto com os atributos necessários para codificar:
- OPCODE
- REG 1..8
- REG 1..8
- PARAMETRO K OU A
Escrito em .txt
ou
Codificado em Java como a criação de um vetor de objetos "Palavra"
Assim operações lógicas a nível de bit não são mais necessárias:
AND, OR, NOT, … SHIFT ….
EM CADA ITERACAO
CARREGA-SE A INSTRUCAO APONTADA POR PC
(A PALAVRA NA POSICAO DA MEMORIA INDEXADA POR PC)
EXECUTA-SE A INSTRUCAO CONFORME SEUS DADOS,
MODIFICANDO REGISTRADORES E POSICOES DE MEMORIA
QUANDO ENCONTRAR STOP O PROGRAMA PÁRA. \
A OPERACAO DE STORE EM UMA POSICAO DE MEMORIA ADOTA A
DEFINICAO QUE ARMAZENA O VALOR NA EM “PARAMETRO" DO OBJETO
“PALAVRA” QUE ESTA NAQUELA POSICAO DA MEMORIA.
ADOTA-SE UM OPCODE NOVO, CHAMADO DE “DADO”, QUE INDICA QUE NAQUELA
POSICAO TEMOS UM DADO E NAO UMA INSTRUCAO.
LÊ O PROGRAMA SEQUENCIALMENTE E CARREGA A PARTIR DA POSICAO 0 DA MEMÓRIA
(QUE É UM NOME DE PROGRAMA)
INVOCA O CARREGADOR, PASSANDO O NOME DO PROGRAMA COMO PARAMETRO
E LIBERA A MAQUINA VIRTUAL (ITEM 4) PARA EXECUTAR A PARTIR DA POSICAO 0