Trabalho 1: Montador para a arquitetura do computador IAS

Perguntas e respostas sobre o trabalho

P 1: Professor, fiquei com uma dúvida com relação à diretiva ".align". Se eu uso
um .align 20, a próxima palavra estará no endereço 20, mas e a palavra que vem
logo após, estará no endereço 21 ou 40?
  
R: A diretiva ".align N" informa ao montador que a partir deste momento a
posição atual de montagem deve ser ajustada para o lado esquerdo da próxima
palavra de memória associada a um endereço múltiplo de N. Se a posição já
estiver apontando para o lado esquerdo de um endereço que é múltiplo de N, então
ela não terá nenhum efeito, caso contrário, a "posição" será modificada.  Após
ajustar a posição, a montagem segue normalmente, uma palavra após a outra.

  Exemplos:

  Se a posição atual for : 20/esq

  .align 20 não faz nada
  .align 2 também não faz nada
  .align 3 atualiza a posição para 21/esq (próxima posição múltipla de 3)

  Se a posição atual for : 20/dir

  .align 20 atualiza a posição para 40/esq

P 2: O montador deve ou não ser case sensitive? É dito no tratamento dos números
que não deve diferenciar letras maiúsculas de minúsculas, mas e quanto ao resto
do código?

R: O montador não deve ser sensível ao caso no tratamento de mnemônicos.  Isso
se estende para as outras construções da linguagem: 0xab, 0XAB, 
Rotulo == ROTULO, .ALIGN, etc...
P 3: No tratamento de números é dito que se tiver um valor incompatível com a
base o programa deve levantar um erro. Mas como seria o levantamento desse erro?
Apenas gerar uma frase e parar a execução? A frase tem que seguir algum padrão
por causa do Susy?
	
R: No susy não existe caso de teste que apresentem errors, então seu programa
não sera julgado incorreto pelo susy devido a mensagens de erro. Contudo é
aconselhável que você inclua tal tratamento (com as mensagens que achar
apropriado) no seu montador pois isso sera considerado no momento em que o
código for avaliado manualmente.
P 4: Instruções JMP, JMPP e STM: Aparentemente o campo endereço M(endereço) deve
conter somente um número ou o nome de um rótulo. Caso seja passado um rótulo, o
jump será para a esquerda ou direita, de acordo com o endereço do rótulo.  Caso
seja passado um endereço, porém, podemos passar o mesmo como M(0x100,0:19) para
referenciar a instrução a esquerda e M(0x100,20:39) para a direita, ou devemos
passar somente o M(0x100) e adotar a convenção que com endereços numéricos a
instrução alvo será sempre a esquerda?

R: As instrucoes em linguagem de montagem nao utilizarao indicacao de
esquerda/direita como operando. Apenas rotulos/enderecos.
P 5: Espaço em branco: Posso assumir que não averá espaços desnecessários no
código fonte (por exemplo no começo da linha, ou dois espaços entre a instrução
e o campo endereço), ou devo fazer o tratamento para que o meu montador ignore
qualquer espaço em branco?

R: Em relacao a isso eu nao criei casos de teste para complicar. Porem o
programador acaba usando esses detalhes (espaco, tab, linha em branco, etc) para
facilitar a leitura do codigo. Entao, sim, existem casos de teste com linhas em
branco, com linhas que comecam com espaco, com tabulacao etc.  Se voce usar
scanf(" %s", xxxx) veja o espaco antes do percento acredito que ja resolva boa
parte dos casos. Porque dessa forma scanf vai ignorar qualquer espaco que vier
antes do comeco da string.
P 6: Tamanho dos comentários e rótulos: Posso assumir um tamanho máximo para as
strings de comentários e rótulos? Se sim, qual? Se não tiver um máximo eu teria
que alocar muito espaço para os vetores de char onde vou colocar essas strings
(ou então complicar muito a coisa com malloc/realloc).

R: Nao ha testes com tamanhos absurdos. Por exemplo, tamanhos dos rotulos nao
devem passar de 50 caracteres (exagerando). Comentarios provavelmente nao passam
de 200 caracteres - uma linha de descricao. Os testes nao foram feitos para
penalizar esse tipo de coisa.
P 7: Case-sensitive: posso tratar todo o código fonte como case insensitive,
incluindo rótulos, diretivas, endereços e instruções?

O seu programa deve ser case-INsensitive em relacao a toda a
linguagem. Novamente, todos os casos de testes sao "montáveis".
P 8: No mapa de memória a ordem dos comandos é crescente sempre?  Por exemplo,
eu primeiro dou um comando .org 0x000 depois em outro trecho dou .org 0x200 e
depois um .org 0x005.

O que vem depois do .org 0x005 deve vir antes do 0x200 no mapa de memória correto?

R. Sim a ordem deve ser sempre crescente.
P 9: Qual tipo de variável devo usar para guardar os dados? Eu estou usando long
long int, mas está dando overflow em alguns números. O Susy é uma máquina de 64
bits? Se sim, acredito que não terei problemas, então.

R. Lembre-se que podem haver constantes de 40 bits. Entao usar variaveis de 32
bits torna a codificacao mais complicada.