Micro C Compiler - MCC
Loading...
Searching...
No Matches
assembly.c File Reference

implementação do gerador de código assembly x86-64. More...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include "assembly.h"

Functions

static void asm_print (const char *format,...)
 escreve uma linha de assembly formatada no arquivo de saída, sem indentação.
 
static void asm_instr (const char *format,...)
 escreve uma linha de instrução assembly formatada, com indentação.
 
static char * get_operand_asm (IROperand *op)
 traduz um operando da ir para sua representação em assembly at&t. @detalhes esta é uma função crucial que mapeia os conceitos da ir (constante, símbolo, temporário) para a sintaxe específica do assembly.
 
static void asm_gen_prologue ()
 gera o prólogo da função (cria o stack frame).
 
static void asm_gen_epilogue ()
 gera o epílogo da função (destroi o stack frame e retorna).
 
int gerar_assembly (IR_Instruction *ir_head, PilhaTabelasSimbolos *pilha, const char *nome_arquivo_saida)
 função principal que gera o arquivo de assembly a partir da ir.
 

Variables

static FILE * outfile
 Ponteiro para o arquivo de saída onde o assembly será escrito.
 
static char asm_buffer [100]
 Buffer estático global para construir strings de operandos formatados.
 
static int param_count = 0
 Contador global para o número de parâmetros.
 
static IROperandparam_buffer [10]
 Buffer temporário para armazenar operandos de parâmetros.
 
static int param_buffer_count = 0
 Contador de itens no buffer de parâmetros.
 

Detailed Description

implementação do gerador de código assembly x86-64.

este módulo traduz a representação intermediária (ir) para o código assembly final da arquitetura x86-64, usando a sintaxe at&t.

Function Documentation

◆ asm_gen_epilogue()

static void asm_gen_epilogue ( )
static

gera o epílogo da função (destroi o stack frame e retorna).

todo fim de função em assembly deve limpar a pilha e retornar.

◆ asm_gen_prologue()

static void asm_gen_prologue ( )
static

gera o prólogo da função (cria o stack frame).

todo início de função em assembly deve configurar sua pilha.

◆ asm_instr()

static void asm_instr ( const char *  format,
  ... 
)
static

escreve uma linha de instrução assembly formatada, com indentação.

usado para instruções de máquina (ex: movl, addl, jmp).

Parameters
formata string de formato (como em printf).
...os argumentos variáveis para a string de formato.

◆ asm_print()

static void asm_print ( const char *  format,
  ... 
)
static

escreve uma linha de assembly formatada no arquivo de saída, sem indentação.

usado para labels e diretivas (ex: .text, main:).

Parameters
formata string de formato (como em printf).
...os argumentos variáveis para a string de formato.

◆ gerar_assembly()

int gerar_assembly ( IR_Instruction ir_head,
PilhaTabelasSimbolos pilha,
const char *  nome_arquivo_saida 
)

função principal que gera o arquivo de assembly a partir da ir.

percorre a lista encadeada de ir, traduzindo cada instrução (opcode) para sua sequência correspondente de assembly x86-64 at&t.

Parameters
ir_headPonteiro para a primeira instrução da lista de IR.
pilhaPilha de Tabelas de Símbolos (para consulta de offsets).
nome_arquivo_saidaNome do arquivo .s onde o assembly será escrito.
Returns
0 em caso de sucesso, -1 em caso de erro (ex: falha ao abrir arquivo).

traduz a instrução ir_label.

labels de função (ex: main) recebem diretivas .globl e o prólogo da função. labels de desvio (ex: l0) são apenas impressos.

traduz a instrução ir_assign (atribuição).

traduz result := arg1 (ex: x := t0). usa eax como registrador intermediário.

traduz operações aritméticas básicas.

traduz result := arg1 op arg2 para ADD, SUB, MUL. utiliza a estratégia Load-Operate-Store.

traduz operações de divisão e módulo.

usa a instrução idivl, que requer o dividendo em eax e a extensão de sinal (cdq) em edx. O quociente retorna em eax e o resto (módulo) retorna em edx.

traduz operações de comparação e relacionais.

traduz result := arg1 op arg2 para EQ, NEQ, LT, LEQ, GT, GEQ. usa as instruções cmpl (comparação) e setXX (que define o byte al para 0 ou 1, resultando no valor booleano da operação).

traduz as operações lógicas AND e OR.

implementa a lógica booleana completa (não bitwise) ao converter os operandos para 0 ou 1 (booleano) antes de aplicar andb ou orb e salvar o resultado final.

traduz a instrução ir_if_false (desvio condicional).

traduz if_false arg1 goto result (ex: if_false t0 goto l0).

traduz a instrução ir_goto (desvio incondicional).

traduz goto result (ex: goto l1).

traduz a instrução ir_param (passagem de parâmetro).

acumula parâmetros em um buffer para empilhar na ordem reversa durante o ir_call.

traduz a instrução ir_call (chamada de função).

empilha os parâmetros acumulados na ordem reversa, chama a função, limpa a pilha e salva o retorno.

traduz a instrução ir_return. @detalhes traduz return arg1 (ex: return z). o valor de retorno é movido para eax e o epílogo é gerado.

traduz a instrução ir_load (leitura de array). @detalhes traduz result := load arg1[arg2] (ex: t0 := v[i]). usa o endereçamento indexado do x86-64: [base + indice * escala]. rax armazena o endereço base do array (arg1). ebx armazena o índice (arg2). ecx armazena o valor carregado da memória.

traduz a instrução ir_store (escrita em array). @detalhes traduz store result[arg2] := arg1 (ex: v[i] := x). rax armazena o endereço base do array (result). ebx armazena o índice (arg2). ecx armazena o valor a ser guardado (arg1).

◆ get_operand_asm()

static char * get_operand_asm ( IROperand op)
static

traduz um operando da ir para sua representação em assembly at&t. @detalhes esta é uma função crucial que mapeia os conceitos da ir (constante, símbolo, temporário) para a sintaxe específica do assembly.

Parameters
opo operando da ir (ex: um OPERAND_CONST com valor 10).
Returns
uma string estática formatada para o assembly (ex: "$10", "-4(%rbp)").

Variable Documentation

◆ asm_buffer

static char asm_buffer[100]
static

Buffer estático global para construir strings de operandos formatados.

usado internamente pela funcao get_operand_asm().

◆ outfile

static FILE * outfile
static

Ponteiro para o arquivo de saída onde o assembly será escrito.

ponteiro para o arquivo onde o código Assembly será gravado (.s).

◆ param_buffer

static IROperand * param_buffer[10]
static

Buffer temporário para armazenar operandos de parâmetros.

Essencial para garantir que os argumentos sejam empilhados na ordem reversa (direita para esquerda) conforme a convencao C.

◆ param_buffer_count

static int param_buffer_count = 0
static

Contador de itens no buffer de parâmetros.

◆ param_count

static int param_count = 0
static

Contador global para o número de parâmetros.

Utilizado para rastrear quantos argumentos foram empilhados (pushq).