iasemulator_front

⚙️ Emulador de funcionamento de uma CPU

1 |

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.

Caracteristicas

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

RegistradorHex
R00x0
R10x1
R20x2
R30x3
Opcode HexMnemônicoDescrição
0x00hltHALT – faz o processador terminar o ciclo de instrução. Deve-se colocar no fim do programa.
0x01ldLOAD – carrega para o registrador X uma palavra da memória no endereço Y.
0x02stSTORE – armazena no endereço de memória Y o conteúdo do registrador X.
0x03addADD - Soma o valor de um registrador pelo outro.
0x04subSUBTRACT - Subtrai o valor de um registrador pelo outro
0x05mulMULTIPLY - Multiplica o valor de um registrador pelo outro.
0x06divDIVIDE - Divide o valor de um registrar pelo outro.
0x07lshLEFT SHIFT – desloca a palavra no registrador X em imm bits à esquerda.
0x08rshRIGHT SHIFT – desloca a palavra no registrador X em imm bits à direita.
0x09cmp

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.
0x0ajeJUMP IF EQUAL – muda o registrador PC para o endereço de memória X caso E = 1
0x0bjneJUMP IF NOT EQUAL TO – muda o registrador PC para o endereço de memória X caso E = 0.
0x0cjlJUMP IF LOWER – muda o registrador PC para o endereço de memória X caso L = 1.
0x0djleJUMP IF LOWER OR EQUAL – muda o registrador PC para o endereço de memória X caso E = 1 ou L = 1
0x0ejgJUMP IF GREATER – muda o registrador PC para o endereço de memória X caso G = 1.
0x0fjgeJUMP IF GREATER OR EQUAL – muda o registrador PC para o endereço de memória X caso E = 1 ou G = 1.
0x10jmpJUMP – muda o registrador PC para o endereço de memória X.
0x11movihMOVE IMMEDIATE HIGHER - Move os 16 bits menos significativos (0:15) do imediato para a parte superior (16:31) do registrador X.
0x12movilMOVE IMMEDIATE LOWER - Move os 16 bits menos significativos (0:15) do imediato para a parte inferior (0:15) do registrador X.
0x13addiADD IMMEDIATE - Soma o valor do registrador pelo valor do imediato
0x14subiSUBTRACT IMMEDIATE - Subtrai o valor do registrador pelo valor do imediato.
0x15muliMULTIPLY IMMEDIATE - Multiplica o valor do registrador pelo valor do imediato.
0x16diviDIVIDE IMMEDIATE - Divie o valor do registrador pelo valor do imediato.
0x17movrrMOVE REGISTERS - Move o valor de um registrar para outro.
Avatar DevBaraus Github Bruno de Araujo Alves devbaraus

Software Developer | Computer Science Student at IFG Campus Anápolis

40 seguidores · 50  seguindo

13 repositórios públicos

Sugestões
Veja meus outros repositórios
Ver mais