Trabalho 1: Montador para a arquitetura do computador IAS


Avisos

Nesta seção serão apresentados os avisos importantes referentes ao trabalho 1.


Introdução

Como já visto em aula, um montador (assembler) é uma ferramenta que converte código em linguagem de montagem (assembly) para código em linguagem de máquina. Neste trabalho, você irá implementar um montador para a linguagem de montagem do computador IAS, que produza como resultado um mapa de memória para ser utilizado no simulador do IAS (o simulador pode ser encontrado em http://www.ic.unicamp.br/~edson/disciplinas/mc404/2015-1s/ab/anexos/ias).

Especificações do montador

Nesta seção serão apresentadas as especificações gerais do montador, da linguagem de montagem aceita por ele e da linguagem de máquina que o montador deve produzir.

Especificações gerais

O arquivo de saída do montador é um mapa de memória que contém linhas no formato:

AAA DD DDD DD DDD

Na linha acima, AAA é uma sequência de 3 dígitos hexadecimais que representa o endereço de memória, totalizando 12 bits. Já DD DDD DD DDD é uma sequência de 10 dígitos hexadecimais, que totaliza 40 bits e representa um dado ou duas instruções do IAS, conforme já visto em aula. Note que existem caracteres de espaço na linha, num total de exatos 4 espaços - é importante que seu montador produza um mapa de memória EXATAMENTE nesse formato para permitir a execução dos casos de teste. Não deve haver caracteres extras ou linhas em branco, apenas linhas no formato acima.

O arquivo de entrada do montador deve ser um arquivo de texto tal que cada linha deve ser como uma das seguintes:

 [rotulo:] [instrucao] [@ comentario]
ou
 [rotulo:] [diretiva] [@ comentario]

Nas linhas acima, os colchetes determinam elementos opcionais - ou seja, qualquer coisa é opcional, podendo então haver linhas em branco no arquivo de entrada, ou apenas linhas de comentário, ou linhas só com uma instrução, etc. É possível que haja múltiplos espaços em branco no início ou fim da linha ou entre os elementos. Como exemplo, as seguintes linhas são válidas num arquivo de entrada para o montador:

vetor:
vetor:   .word 10
vetor:   .word 10 @ Comentario apos diretiva

.word 10
.word 10  @ Comentario apos diretiva
@ Comentario sozinho  

vetor: ADD M[0x0000000100]
vetor: ADD M[0x0000000100] @ Comentario apos instrucao

ADD M[0x0000000100]
e as seguintes linhas são inválidas:
vetor: outro_vetor: mais_um_vetor: 

vetor: .word 10 ADD M[0x000000000100]

.word 10 .align 5

vetor: ADD M[0x000000000100] .word 10

ADD M[0x000000000100] ADD M[0x000000000100]

Algumas regras gerais do montador:

As próximas seções descrevem as regras referentes à linguagem de montagem.

Comentários

Comentários são cadeias de caracteres que servem para documentar ou anotar o código. Essas cadeias devem ser desprezadas durante a montagem do programa. Todo texto à direita de um caractere "@" (arroba) é considerado comentário.

Rótulos

Rótulos são compostos por caracteres alfanuméricos e podem conter o caractere "_" (underscore). Um rótulo é definido como uma cadeia de caracteres que deve ser terminada com o caractere ":" (dois pontos) e não pode ser iniciada com um número. Exemplos de rótulos válidos são:

varX:
var1:
_varX2:
laco_1:
__DEBUG__:
Exemplos de rótulos inválidos são:
varx::
:var1
1var:
laco

Diretivas

Todas as diretivas da linguagem de montagem do IAS começam com o caractere "." (ponto). As diretivas podem ter um ou dois argumentos - tais argumentos podem ser dos seguintes tipos:

HEX um valor na representação hexadecimal. Estes valores possuem exatamente 12 dígitos, sendo os dois primeiros '0' e 'x' e os 10 últimos dígitos hexadecimais, ou seja, 0-9, a-f ou A-F. Ex: 0x0a0Ef217D0
DEC(min:max) valores numéricos na representação decimal. Apenas valores no intervalo (min:max) são válidos e seu montador deve realizar esta verificação. Caso o valor não esteja no intervalo [min:max], o montador deve emitir uma mensagem de erro na saída de erro e interromper o processo de montagem sem produzir o mapa de memória na saída padrão (stdout ou no arquivo de saída.
ROTcaracteres alfanuméricos e "_" (underscore) - não pode começar com número (veja a descrição de rótulos acima).
SYMcaracteres alfanuméricos e "_" (underscore) - não pode começar com número.

A Tabela 1, abaixo, apresenta a sintaxe das diretivas de montagem e os tipos de seus argumentos.

SintaxeArgumento 1Argumento 2
.set SYMHEX | DEC(0:231-1)
.org HEX | DEC(0:1023)
.align DEC(0:1023)
.wfill DEC(1:1023)HEX | DEC(-231:231-1) | ROT | SYM
.word HEX | DEC(0:232-1) | ROT | SYM
Tabela 1: Sintaxe das diretivas de montagem e os tipos dos argumentos.

O caractere "|" separa as opções. Por exemplo: a diretiva .org pode receber como argumento um valor hexadecimal (HEX) ou decimal no intervalo (0:1023). Dessa forma, as linhas do seguinte programa são válidas:

	.org 0x0000000000
	.org 0x000000000f
	.org 100
enquanto que as seguintes linhas são inválidas
	.org 0x0000000000 | 10
	.org -10
	.org 0x000 20
	.org

A descrição do comportamento de cada uma das diretivas está na apostila de programação do computador IAS (programando_o_IAS.pdf) ou nos slides das aulas.

Instruções

As instruções que requerem um endereço podem ser descritas utilizando-se qualquer um dos seguintes formatos:

As instruções que nao requerem o campo endereço possuem o seguinte formato:

Note que no segundo campo é possível usar um endereço em hexadecimal (HEX) ou decimal (DEC), ou um rótulo. Caso seja usado endereço em hexadecimal ou decimal, esse deve ser informado dentro de colchetes, após a letra "M" - como exemplo, "M[0x0000000200]". No caso de se utilizar rótulo, esse deve ser informado diretamente, por exemplo "ADD varX".

Algumas instruções não requerem o campo endereço (RSH, por exemplo). Se o programa especificar o campo endereço para estas instruções, seu montador deve emitir uma mensagem de erro e interromper a montagem. Para as instruções que não requerem o campo endereço seu montador deve preencher os bits referentes ao campo endereço no mapa de memória com zeros.

A Tabela 2, abaixo, apresenta os mnemônicos válidos e as instruções que devem ser emitidas para cada um dos casos.

MnemônicoInstrução a ser emitida
load LOAD M(X)
load_neg LOAD -M(X)
load_abs LOAD |M(X)|
load_mqLOAD MQ
load_mq_mx LOAD MQ,M(X)
store STOR M(X)
jump JUMP M(X,0:19) se X for o endereço de uma instrução à esquerda de uma palavra.
JUMP M(X,20:39) se X for o endereço de uma instrução à direita de uma palavra.
jump+ JUMP+M(X,0:19) se X for o endereço de uma instrução à esquerda de uma palavra.
JUMP+M(X,20:39) se X for o endereço de uma instrução à direita de uma palavra.
addADD M(X)
add_absADD |M(X)|
subSUB M(X)
sub_absSUB |M(X)|
mulMUL M(X)
divDIV M(X)
lshLSH
rshRSH
store_addr STOR M(X,8:19) se X for o endereço de uma instrução à esquerda de uma palavra.
STOR M(X,28:39) se X for o endereço de uma instrução à direita de uma palavra.
Tabela 2: Mnemônicos válidos e as instruções que devem ser emitidas para cada um dos casos.

Valores de retorno do montador

Se o montador executar corretamente, ele deve retornar o valor 0 (valor a ser retornado pela função main). Caso haja algum erro, ele deve retornar o valor "-1". Este valor pode ser retornado pela função main, ou pela chamada de sistema exit (-1).

Tratamento de erros

Seu montador deve tratar erros. Sempre que houver um erro, seu montador deve emitir uma mensagem de erro na saída de erros (stderr) e terminar a execução sem produzir o mapa de memória, ou seja, sem escrever o mapa de memória no arquivo de saída ou na saída padrão.

As mensagens de erro devem seguir o seguinte padrão:

ERROR on line XX
mensagem!
onde XX é o número da linha do arquivo de entrada que causou o erro e "mensagem" é a mensagem de erro. Esta mensagem deve estar na linha subsequente à primeira. Exemplos:
ERROR on line 3
addu is not a valid mnemonic!
ERROR on line 56
0x00$02 is not a valid hex number!

Requisitos/informações da entrega

Dicas

Perguntas Frequentes e Outras Dúvidas