Um simulador de um computador "hóspede" é um programa escrito para um computador "hospedeiro" capaz de ler, carregar e executar programas escritos para o computador "hóspede" sobre o "hospedeiro". O simulador pode ser considerado uma forma de máquina virtual.
O problema da simulação está na velocidade de execução dos programas do "hóspede". Dependendo da abordagem utilizada, o programa "hóspede" pode executar até 500 vezes menos instruções por segundo do que se estivesse executando em uma máquina real de mesmo poder computacional.
Neste trabalho, você irá praticar a implementação de um simulador de computador implementando um simulador do IAS escrito completamente em linguagem de montagem ARM.
Para ajudá-lo no início, o laço principal de seu simulador será fornecido. Você deverá implementar as funções que atendem às chamadas do laço principal. O simulador deve ler comandos do usuário e tomar uma ação em resposta ao comando. A tabela a seguir os apresenta.
| Comando | Exemplo de Uso | Descrição |
| si (step instruction) | si | Executa uma instrução |
| sn # (step n instructions) | sn 7 | Executa N instruções, onde N é um número decimal |
| c (continue) | c | Continua a execução até o fim |
| stw <end> <dado> (store word) | stw 008 1122334455 | Armazena um dado na memória da máquina virtual IAS. Todos os números devem usar a notação hexadecimal. |
| ldw <end> (load word) | ldw 008 | Carrega um dado da memória da máquina virtual IAS e a imprime na saída padrão. O número correspondente ao endereço deve usar a notação hexadecimal. |
| pr | pr | Imprime os registradores da máquina virtual IAS |
Um comando sempre é finalizado por <newline> (apertar enter na entrada padrão). Uma linha de comando pode ser considerada reconhecida se as iniciais são iguais às iniciais de qualquer comando apresentado acima. Apenas os comandos acima devem ser esperados na entrada, isto é, mensagens de erro não serão avaliadas.
O simulador deve suspender a interpretação sempre que encontrar uma instrução não identificada e imprimir a mensagem:
Instrução à esquerda não identificada no endereço <end>
ou
Instrução à direita não identificada no endereço <end>
Em que <end> é um número hexadecimal que sempre terá 3 algarismos, mesmo quando houver casas à esquerda com o valor zero.
O simulador deve encerrar a execução assim que a entrada padrão indicar fim de arquivo (EOF) - isto acontece quando o arquivo de entrada não possui mais comandos ou, se a entrada padrão estiver ligada a um teclado, quando se pressiona CTRL+D.
a) O formado de saída do comando ldw deve ser:
<end> : <dado>
Em que <end> é um número hexadecimal que sempre terá 3 algarismos, mesmo quando houve casas à esquerda com o valor zero. <dado> é um número hexadecimal que sempre terá 10 algarismos, da mesma forma.
b) O formato de saída do comando pr deve ser:
AC: 0x[10 dígitos hexadecimais]
MQ: 0x[10 dígitos hexadecimais]
Exemplo:
AC: 0x00A0B17810
MQ: 0x0000000006
Conforme mencionado anteriormente, parte do código com o laço principal é fornecido. A tarefa deste código é aguardar um comando digitado pelo usuário e despachar a execução do comando para funções implementadas por você. As funções são:
| Código | Comando |
| 0 | Comando não identificado |
| 1 | EOF (a entrada padrão atingiu fim de arquivo, não há mais comandos para ler) |
| 2 | Erro ao tentar ler comando |
| 3 | step instruction |
| 4 | step n instructions |
| 5 | continue |
| 6 | load word |
| 7 | store word |
| 8 | print registers |
a) A memória do IAS será representada por um vetor com 1024 * 5 bytes com o rótulo ias_mem no arquivo ias-mem.s (a ser fornecido). Este arquivo deve conter apenas este vetor.
b) Sugestões:
tar xjvf t2-1s12.tar.bz2
O pacote contém um Makefile já pronto. Entretanto, esse Makefile produz um executável para rodar no simulador ARM. Caso você vá rodar diretamente na plataforma Linux-ARM do IC, você precisa compilar usando o compilador nativo da placa (chamando pelos comandos 'as', 'ld'). No momento de ligar, não use o sys.o fornecido nem use a flag -Ttext=0 do linker.