IAS Emulator logotipo. Cover

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.
Página Inicial
Página Inicial

Sugestões
Ver meus outros projetos pessoais!
Ver mais