Skip to content

LSantos06/IA-32

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

56 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Trabalho 2 de Software Básico 1/2017

O trabalho consiste em duas partes:

  1. 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;
  2. Implementar um programa em C um arquivo executável em formato ELF32 (Bônus).

Integrantes do grupo

  • 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"

Instruções de compilação

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  

Parte 1

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.

Parte 2

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.