Professional Documents
Culture Documents
Na primeira parte do seu trabalho, voc deve implementar o emulador de MIC-1 seguindo sua
especificao detalhada no captulo 4 do livro (seo 4.1). Para testar seu emulador, considere os
seguintes arquivos:
- prog.exe : programa binrio para executar em MAC-1. Como o microprograma de MIC-1 simula
MAC-1, MIC-1 capaz de executar tal programa quando carregado na memria principal.
A linguagem assembly de MAC-1 definida no captulo 4, seo 4.2. Voc dever implementar
um montador que gera o cdigo binrio (bytecode) de um programa escrito com tal conjunto de
instrues, seguindo cuidadosamente sua especificao. Assim, voc poder escrever um programa
em assembly MAC-1, montar e executar em seu emulador MIC-1.
As instrues MAC-1 (especificadas na tabela 4.11, pg.205 da sexta edio) fazem referncias a
endereos do armazenamento de controle que contm o primeiro microcdigo do microprograma
que implementa a respectiva instruo MAC-1. Estes so os bytes (ou seja, os endereos) de cada
instruo disponvel (bytes diferentes dos expostos pelo livro por convenincia de implementao):
* Instrues em vermelho ainda no foram testadas. Logo, erros podem existir nos respectivos
trechos que as implementam no microprograma de controle. No aconselho testar seu montador
com programas assembly que utilizem tais instrues. Voc mesmo pode fazer o teste dessas outras
instrues quando tiver certeza que seu montador est funcionando corretamente.
memory[4] = 0x0006; //(CPP inicia com o valor 0x0006 guardado na palavra 1 bytes 4 a 7.)
memcpy(&(memory[8]), &tmp, 4); //(LV inicia com o valor de tmp guardado na palavra 2 bytes
8 a 11)
memcpy(&(memory[12]), &tmp, 4); //(PC inicia com o valor de tmp guardado na palavra 3 bytes
12 a 15)
//A base da pilha LV e ela j comea com algumas variveis empilhadas (dependendo do
programa).
//Cada varivel gasta uma palavra de memria. Por isso a soma de LV com num_of_vars.
memcpy(&(memory[16]), &tmp, 4); //(SP inicia com o valor de tmp guardado na palavra 4 bytes
16 a 19)
Perceba que, embora o programa a ser gravado pelo montador no arquivo comece no byte 20, no
momento de abrir e ser lido para a memria do emulador para ser executado, ele deve ser colocado
a partir do byte 0x0401, ou seja, a partir de PC+1 (o microprograma sempre comea incrementando
PC antes de puxar o endereo de microprograma da memria principal; pelo mesmo motivo a
instruo init fica no byte 1 e no no byte 0 da memria principal). O trecho de inicializao fica
nas posies originais normalmente.
Alm disso, antes da memria propriamente dita, o arquivo executvel gerado pelo montador
possui um valor Q de 4 bytes (um unsigned int) indicando o tamanho completo do programa a ser
carregado (inicializao + programa propriamente dito). Assim, se o programa propriamente dito
tem P bytes de tamanho, Q = (20 + P). Isso permite uma cpia em lote de toda uma sequncia de
bytes, evitando, na hora de abrir, de ter que copiar o arquivo em um lao byte a byte at eof.
Como no existe instruo de declarao de variveis, uma primeira lida no cdigo assembly deve
ser feita para determinar quantas variveis diferentes existem. Seus endereos sero determinados
em sequncia a partir de LV e o microprograma j faz esse controle relativo. Assim, se as variveis
que aparecem so i, j e k, nessa ordem, seus endereos quando montadas sero 0x00, 0x01 e 0x02,
respectivamente. O microprograma faz o trabalho de somar esses valores a LV quando alguma
instruo de referncia a varivel chamado (istore ou iload).
* Caso tenha curiosidade em ver como feita a montagem do microprograma de controle, aqui est
o cdigo fonte do programa que gera o arquivo microprog.rom: microassembler.cpp .
Crie outros pequenos programas em assembly MAC-1, monte com o seu assembler e execute com
o seu emulador de MIC-1.