O objetivo desse trabalho era fazer um montador para um assembly inventado visto em aulas na disciplina. A especificação do trabalho feita pelo professor encontra-se em docs/especificacao.pdf.
Para compilar o código é necessário executar este comando:
g++ montador.cpp -std=c++17 -o montadorPara rodar basta executar o comando:
./montador <arquivo.asm> | <arquivo.pre>-
Compilação:
- O comando para compilar é
g++ montador.cpp -DTHROW_ERRORS=1 -std=c++17 -o montador. O argumento-DTHROW_ERRORS=1habilita o modo que finaliza o programa ao identificar um erro. Foi recomendado pelo professor que os erros fossem exibidos no output ao invés de finalizar o programa, portanto por default, -DTHROW_ERROS=0. - Ao rodar o programa com
-DTHROW_ERRORS=0, se uma LABEL não for identificada, o programa continuará sua execução, o que pode gerar erros como acesso a dados indefinidos. Por exemplo, se uma LABEL for indefinida, a posição de memória no arquivo.objserá possivelmente-1.
- O comando para compilar é
-
Pré-processamento:
- Ao fornecer um arquivo
.precomo input, o código não realizará novamente o pré-processamento. Isso significa que não serão removidos espaços, tabulações desnecessárias ou comentários. O arquivo.predeve estar corretamente formatado (em UPPERCASE e sem comentários ou espaços inúteis).
- Ao fornecer um arquivo
-
Otimização:
- O código não foi construído com foco primário em otimização, portanto podem existir trechos desnecessários ou mal otimizados.
-
Diretiva BEGIN:
- A diretiva
BEGINnão pode ser uma LABEL (e.g.,BEGIN: MOD_B). Ela sempre será interpretada como uma diretiva e deve estar no formato:MOD_B: BEGIN. - Esta escolha se deve à ideia de que, se
MOD_Bfor usado em outro módulo (PUBLIC MOD_B), ele é uma LABEL. Usar a declaraçãoBEGIN: MOD_Bfaz com queMOD_Bnão seja tratado como LABEL, o que pode levar a erros de montagem (veja os arquivos_codigo5.asme_codigo6.asmcomo exemplos).
- A diretiva
-
Operações aritméticas:
- Não é permitido que operações de aritmética (e.g., soma de ponteiros) sejam quebradas por linha, como:
Y + 2 - Apenas operações na mesma linha são permitidas, como
Y+2.
- Não é permitido que operações de aritmética (e.g., soma de ponteiros) sejam quebradas por linha, como:
-
Comentários:
- Comentários entre operações, labels, etc., não são permitidos. Assim que um comentário é identificado, aquela parte do código é desconsiderada.
-
Compatibilidade:
- Por enquanto, o programa não funciona no Windows devido ao uso de verificações de arquivos/diretórios como
./asm,./pree./obj.
- Por enquanto, o programa não funciona no Windows devido ao uso de verificações de arquivos/diretórios como
-
Estrutura do arquivo:
- Os arquivos
.asm/.preprecisam obrigatoriamente conterSECTION TEXTeSECTION DATA. - O programa assume que LABELS declaradas como variáveis (e.g.,
X: SPACE) estão naSECTION DATAe que instruções estão naSECTION TEXT, pois isso não foi explicitamente verificado no código.
- Os arquivos
-
Módulos:
- Caso a entrada seja um arquivo módulo (com diretivas
BEGIN/END), ambas devem estar presentes obrigatoriamente. - Se um arquivo módulo não possuir
BEGIN/END, ele será tratado como um arquivo comum e gerará a saída correspondente.
- Caso a entrada seja um arquivo módulo (com diretivas
-
Saída:
- A saída para arquivos
.asmserá sempre um arquivo.precom todos os caracteres convertidos para UPPERCASE, inclusive números hexadecimais (e.g.,0xAserá convertido para0XA). - Não há distinção entre
0xAe0XAdurante o processamento.
- A saída para arquivos
-
Hexadecimais:
- O programa interpreta números hexadecimais como sendo de 16 bits em complemento de 2 e os converte para inteiros durante a montagem (segunda passagem).
-
SPACE e limites de memória:
- O programa não verifica Out-of-Bounds/Segmentation Fault para operações de soma de ponteiros com
SPACE(e.g.,VAL: SPACE 3,VAL + 3pode resultar em transposição de memória, ultrapassando os limites permitidos).
- O programa não verifica Out-of-Bounds/Segmentation Fault para operações de soma de ponteiros com
-
MACROS
- O montador consegue identificar e expandir MACROS com até 4 argumentos, desde que respeite as seguintes estruturas:
- LABEL seguindo por ":" e a diretiva MACRO não sendo case sensitível
- Ao final da macro, deve existir a palavra ENDMACRO não sendo case sensitível
- O corpo da macro deve estar na linha seguinte APÓS a diretiva MACRO ou após os argumentos da macro
- Caso seja passados argumentos para a MACRO, esses arguementos DEVEM ser precedidos pelo caractere "&"
- As MACROS aceitam declaração de ATÉ UMA MACRO encadiada (nested)
- A expansão de MACROS é feita durante o processo de PRÉ-PROCESSAMENTO PASSAGEM ZERO, vistos em aula, utilizando as tabelas MNT e MDT.
- Durante a chama de uma MACRO, não deve ser passado argumentos em outras linhas, utilizar sempre a seguinte estrutura: MACRONAME ARG1, AGR2