|
Micro C Compiler - MCC
|
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. | |
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).
| 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.
| ir_head | o ponteiro para a primeira instrução da lista de ir. |
| pilha | a pilha de tabelas de símbolos (para consultar offsets). |
| nome_arquivo_saida | o nome do arquivo .s onde o assembly será escrito. |
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).