IAS Emulator
Trabalho de Arquitetura e Organização de Computadores 1
Uso
Cada linha de instrução deve iniciar com opcode, seguido de seus operandos. Pode-se utilizar separadores como , - / \ ou não utilizar nenhum.
É possivel escrever cada instrução direto na memória, mas lembre-se, a CPU começa a executar as instruções a partir da posição de memória 0x00. Para informar uma posição de memória pode-se utilizar o prefixo "m" ou não utilizar nenhum. Cada posição de memória é representado em hexadecimal.
Exemplo: busca o conteudo da memória 0x05 e armazena no registrador R3.
ld r3, m05
ld r3- m5
ld r3/ 5
ld r3 05
ld r3 m05
Objetivo
O objetivo deste trabalho é compreender como o ciclo de instrução da Máquina de von Neumann. Implementando um “simulador” de uma CPU com o conjunto de instruções (ISA – Instruction Set Architecture), o conjunto de registradores arquiteturais e o formato de instrução. Esse simulador deve mostrar o conteúdo dos registradores no fim de cada ciclo, quando haverá uma pausa até apertar uma tecla para iniciar o próximo ciclo.
Características
Cada posição de mémoria tem comprimento 32bits, os dados também possuem largura de 32 bits. A CPU apenas processa numeros inteiros. Não há nenhuma operação com ponto-flutuante e, embora o formato de instrução permita endereçar até 2 25 = 33.554.432 palavras de 32 bits na memória, considere uma memória com apenas 100 posições, de 0 (0x000000) a 99 (0x000063). Não é implementado nenhuma representação de aritmética sinalizada.
Função dos Registradores
MBR – Memory Buffer Register – contém a palavra a ser armazenada na memória. Também é o registrador usado para receber uma palavra lida da memória. Todo o tráfego de e para a memória RAM deve passar pelo MBR;
MAR – Memory Address Register – especifica o endereço de memória a ser lida da ou escrita na memória. Todo endereço de memória deve ser indicado nesse registrador antes da operação;
IR – Instruction Register – contém o opcode da instrução sendo executada;
RO0 – Register Operand 0 – contém o primeiro operando registrador da instrução;
RO1 – Register Operand 1 – contém o segundo operando registrador da instrução;
RO2 – Register Operand 2 – contém o terceiro operando registrador da instrução;
IMM – Immediate – contém o operando imediato da instrução;
PC – Program Counter – contém o endereço da próxima palavra de memória com uma instrução a ser buscada. Caso não haja nenhum desvio condicional (conditional jumps), o PC deve ser incrementado em cada ciclo de instrução;
R0…R3 – registradores de propósito geral utilizados para manter temporariamente os operandos na ALU;
Hexadecimal Registradores
Registrador | Hex |
---|---|
R0 | 0x0 |
R1 | 0x1 |
R2 | 0x2 |
R3 | 0x3 |
Opcode Hex | Mnemônico | Descrição |
---|---|---|
0x00 | hlt | HALT – faz o processador terminar o ciclo de instrução. Deve-se colocar no fim do programa. |
0x01 | ld | LOAD – carrega para o registrador X uma palavra da memória no endereço Y. |
0x02 | st | STORE – armazena no endereço de memória Y o conteúdo do registrador X. |
0x03 | add | ADD - Soma o valor de um registrador pelo outro. |
0x04 | sub | SUBTRACT - Subtrai o valor de um registrador pelo outro |
0x05 | mul | MULTIPLY - Multiplica o valor de um registrador pelo outro. |
0x06 | div | DIVIDE - Divide o valor de um registrar pelo outro. |
0x07 | lsh | LEFT SHIFT – desloca a palavra no registrador X em imm bits à esquerda. |
0x08 | rsh | RIGHT SHIFT – desloca a palavra no registrador X em imm bits à direita. |
0x09 | cmp | COMPARE – compara a palavra no registrador X com a palavra no registrador Y e preenche os registradores internos E, L e G - Se reg0 = reg1, então E = 1; senão E = 0; - Se reg0 < reg1, então L = 1; senão L = 0; - Se reg0 > reg1, então G = 1; senão G = 0. |
0x0a | je | JUMP IF EQUAL – muda o registrador PC para o endereço de memória X caso E = 1 |
0x0b | jne | JUMP IF NOT EQUAL TO – muda o registrador PC para o endereço de memória X caso E = 0. |
0x0c | jl | JUMP IF LOWER – muda o registrador PC para o endereço de memória X caso L = 1. |
0x0d | jle | JUMP IF LOWER OR EQUAL – muda o registrador PC para o endereço de memória X caso E = 1 ou L = 1 |
0x0e | jg | JUMP IF GREATER – muda o registrador PC para o endereço de memória X caso G = 1. |
0x0f | jge | JUMP IF GREATER OR EQUAL – muda o registrador PC para o endereço de memória X caso E = 1 ou G = 1. |
0x10 | jmp | JUMP – muda o registrador PC para o endereço de memória X. |
0x11 | movih | MOVE IMMEDIATE HIGHER - Move os 16 bits menos significativos (0:15) do imediato para a parte superior (16:31) do registrador X. |
0x12 | movil | MOVE IMMEDIATE LOWER - Move os 16 bits menos significativos (0:15) do imediato para a parte inferior (0:15) do registrador X. |
0x13 | addi | ADD IMMEDIATE - Soma o valor do registrador pelo valor do imediato |
0x14 | subi | SUBTRACT IMMEDIATE - Subtrai o valor do registrador pelo valor do imediato. |
0x15 | muli | MULTIPLY IMMEDIATE - Multiplica o valor do registrador pelo valor do imediato. |
0x16 | divi | DIVIDE IMMEDIATE - Divie o valor do registrador pelo valor do imediato. |
0x17 | movrr | MOVE REGISTERS - Move o valor de um registrar para outro. |