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

definições para o gerador de código assembly x86-64. More...

Functions

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.
 

Detailed Description

definições para o gerador de código assembly x86-64.

este arquivo define a interface pública do módulo responsável por traduzir a representação intermediária (ir) para o código assembly final da arquitetura x86-64 (sintaxe at&t).

Function Documentation

◆ 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.

esta função percorre a lista encadeada de instruções da ir e escreve o código assembly x86-64 correspondente em um arquivo de saída.

Parameters
ir_heado ponteiro para a primeira instrução da lista de ir.
pilhaa pilha de tabelas de símbolos (para consultar offsets).
nome_arquivo_saidao nome do arquivo .s onde o assembly será escrito.
Returns
0 em caso de sucesso, -1 em caso de erro (ex: falha ao abrir arquivo).

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).