Extract parser and add x64 assembly emission

This commit is contained in:
Krzosa Karol
2026-05-13 22:48:57 +02:00
parent 4cffa1f69a
commit f41560c5e7
6 changed files with 339 additions and 274 deletions

34
emit_asm_x64.c Normal file
View File

@@ -0,0 +1,34 @@
void emit_expr(FILE *file, Ast *n) {
switch (n->kind) {
case AST_INT: {
fprintf(file, " mov rax, %lu\n", n->u);
} break;
case AST_BINARY: {
emit_expr(file, n->l);
fprintf(file, " push rax\n");
emit_expr(file, n->r);
fprintf(file, " pop rcx\n");
if (n->op == TOK_PLUS) {
fprintf(file, " add rax, rcx\n");
} else if (n->op == TOK_STAR) {
fprintf(file, " imul rax, rcx\n");
} else if (n->op == TOK_MINUS) {
fprintf(file, " mov rdx, rax\n");
fprintf(file, " mov rax, rcx\n");
fprintf(file, " sub rax, rdx\n");
} else {
panicf("error");
}
} break;
default: panicf("error");
}
}
void emit_program(FILE *file, Ast *n) {
fprintf(file, ".intel_syntax noprefix\n");
fprintf(file, ".global main\n");
fprintf(file, "main:\n");
emit_expr(file, n);
fprintf(file, " ret\n");
}