|
Micro C Compiler - MCC
|
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 IROperand * | param_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. | |
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.
|
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.
|
static |
gera o prólogo da função (cria o stack frame).
todo início de função em assembly deve configurar sua pilha.
|
static |
escreve uma linha de instrução assembly formatada, com indentação.
usado para instruções de máquina (ex: movl, addl, jmp).
| format | a string de formato (como em printf). |
| ... | os argumentos variáveis para a string de formato. |
|
static |
escreve uma linha de assembly formatada no arquivo de saída, sem indentação.
usado para labels e diretivas (ex: .text, main:).
| format | a string de formato (como em printf). |
| ... | os argumentos variáveis para a string de formato. |
| 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.
| ir_head | Ponteiro para a primeira instrução da lista de IR. |
| pilha | Pilha de Tabelas de Símbolos (para consulta de offsets). |
| nome_arquivo_saida | Nome do arquivo .s onde o assembly será escrito. |
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).
|
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.
| op | o operando da ir (ex: um OPERAND_CONST com valor 10). |
|
static |
Buffer estático global para construir strings de operandos formatados.
usado internamente pela funcao get_operand_asm().
|
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).
|
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.
|
static |
Contador de itens no buffer de parâmetros.
|
static |
Contador global para o número de parâmetros.
Utilizado para rastrear quantos argumentos foram empilhados (pushq).