O trabalho consiste em duas partes:
- Implementar em C um método de tradução de uma linguagem de montagem simples para uma representação de código objeto e IA-32;
- Implementar um programa em C um arquivo executável em formato ELF32 (Bônus).
- Davi Rabbouni - 15/0033010
- Versão do gcc: gcc version 6.2.0 20161005 (Ubuntu 6.2.0-5ubuntu12)
- Sistema Operacional: Ubuntu 16.10 (64-bit) "yakkety"
- Lucas Santos - 14/0151010
- Versão do gcc: gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4)
- Sistema Operacional: elementary OS 0.4 Loki (64-bit) Built on "Ubuntu 16.04.2 LTS"
A compilação do projeto é feita por meio de um Makefile dentro da pasta src. A seguir seguem as opções disponíveis para o mesmo:
make
# Realiza a compilação do tradutor
make clean
# Limpa os arquivos objeto
make traduzir asm_file=
# Realiza a traducao de um arquivo asm (Assembly hipotetico) para um arquivo s (Assembly IA-32)
# Possui o argumento:
# asm_file, que deve ser o nome do arquivo .asm, sem extensão
O programa ligador (tradutor.c) deve receber um arquivo (arquivo.asm) como argumento. Este arquivo deve estar na linguagem Assembly Hipotética vista em sala de aula, separado em seções de dados e códigos. Não será feita detecção de erros léxicos, semânticos ou sintáticos. A linguagem Assembly Hipotética é formada por um conjunto de instruções e diretivas mostradas na tabela a seguir:
Figura 1: Tabela de instruções e diretivas da linguagem Assembly Hipotética.
O programa deve entregar como saída um arquivo em formato texto (arquivo.s) que deve ser a tradução do programa de entrada em Assembly IA-32.
Realizar um programa carregador, chamado montador ia32.c, que receba o arquivo de saída da parte 1 e gere um arquivo binário (arquivo.bin). O arquivo binário deve conter instruções (Opcodes) da linguagem Assembly IA-32. Esse arquivo deve ser um arquivo executável em formato ELF32 capaz de ser executado em qualquer máquina INTEL 386 ou superior, rodando SO LINUX. Para isso recomenda-se o uso da biblioteca libelf para a criação do arquivo ELF32.
Instrução | Argumentos | Opcode Primário | Campo Registrador/Opcode |
---|---|---|---|
PUSH | REG(16/32) | 50+NREG | |
POP | REG(16/32) | 58+NREG | |
PUSH | LABEL | 68 | |
JE | LABEL | 74 | |
JL | LABEL | 7C | |
JG | LABEL | 7F | |
ADD | REG(16/32),[LABEL] | 81 | 0 |
SUB | REG(16/32),[LABEL] | 81 | 5 |
MOV | [LABEL],REG(16/32) | 89 | R |
MOV | REG(16/32),[LABEL] | 8B | R |
MOV | REG(16/32),IMM(16/32) | B8+NREG | |
INT | IMM(8) | CD | |
CALL | LABEL | E8 | |
JMP | LABEL | EB | |
IMUL | [LABEL] | F7 | 5 |
IDIV | [LABEL] | F7 | 7 |
Tabela 1: Tabela de instruções traduzidas da linguagem Assembly Hipotética para a linguagem Assembly IA-32, sem as instruções de INPUT e OUTPUT.