From 74338083207a85a84bc5f087e0eb094b782b8fbc Mon Sep 17 00:00:00 2001 From: MCorange Date: Mon, 7 Jul 2025 21:39:53 +0300 Subject: [PATCH] Forgor int --- a.s | 7 +++++ src/compiler/targets/x86_64-linux-nasm.c | 39 ++++++++++++++---------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/a.s b/a.s index 5a934f4..eef4bfc 100644 --- a/a.s +++ b/a.s @@ -7,11 +7,18 @@ _start: mov rdi, 0 syscall morph_f_main: + ; -- PUSH_INT -- + mov rax, 34 + push rax + ; -- PUSH_INT -- + mov rax, 35 + push rax ; -- OP_ADD -- pop rax pop rbx add rax, rbx push rax + ; -- PUSH_STR -- mov rax, morph_str_0 push rax mov rax, 10 diff --git a/src/compiler/targets/x86_64-linux-nasm.c b/src/compiler/targets/x86_64-linux-nasm.c index 1e4829e..610342f 100644 --- a/src/compiler/targets/x86_64-linux-nasm.c +++ b/src/compiler/targets/x86_64-linux-nasm.c @@ -17,8 +17,12 @@ int write_op(ast_op_t* aop, FILE* f, comp_state_t state) { token_t op = aop->op; switch (op.type) { case (TT_PUSH_INT): { + fprintf(f, " ; -- PUSH_INT --\n"); + fprintf(f, " mov rax, %zu\n", op.int_v); + fprintf(f, " push rax\n"); }; break; case (TT_PUSH_STR): { + fprintf(f, " ; -- PUSH_STR --\n"); fprintf(f, " mov rax, morph_str_%zu\n", dynarray_length(state.strings)); fprintf(f, " push rax\n"); fprintf(f, " mov rax, %zu\n", strlen(op.str_v)); @@ -26,19 +30,23 @@ int write_op(ast_op_t* aop, FILE* f, comp_state_t state) { dynarray_push(state.strings, op.str_v); }; break; case (TT_PUSH_CSTR): { + fprintf(f, " ; -- PUSH_CSTR --\n"); fprintf(f, " mov rax, morph_str_%zu\n", dynarray_length(state.strings)); fprintf(f, " push rax\n"); dynarray_push(state.strings, op.str_v); }; break; case (TT_PUSH_BOOL): { + fprintf(f, " ; -- PUSH_BOOL --\n"); fprintf(f, " mov rax, %d\n", (int)op.bool_v); fprintf(f, " push rax\n"); }; break; case (TT_PUSH_CHAR): { + fprintf(f, " ; -- PUSH_CHAR --\n"); fprintf(f, " mov rax, %d ; '%c'\n", (int)op.char_v, op.char_v); fprintf(f, " push rax\n"); }; break; case (TT_PUSH_FLOAT): { + fprintf(f, " ; -- PUSH_FLOAT --\n"); // TODO: do this }; break; case (TT_OP): { @@ -277,7 +285,7 @@ int write_op(ast_op_t* aop, FILE* f, comp_state_t state) { case (OP_LOAD64): { fprintf(f, " ; -- OP_LOAD64 --\n"); fprintf(f, " pop rax\n"); - fprintf(f, " xor rbx, rbx\n"); + fprintf(f, " xor rbx, rbx\n"); fprintf(f, " mov rbx, qword [rax]\n"); fprintf(f, " push rbx\n"); }; break; @@ -356,7 +364,7 @@ int write_op(ast_op_t* aop, FILE* f, comp_state_t state) { case (OP_ARGV): { }; break; case (OP_HERE): { - char* pos = malloc(1024*2); + char* pos = malloc(1024 * 2); snprintf(pos, 2048, "%s:%d:%d", op.loc.file, op.loc.line, op.loc.col); fprintf(f, " mov rax, str_%zu\n", dynarray_length(state.strings)); fprintf(f, " push rax\n"); @@ -416,14 +424,13 @@ int compile_x86_64_linux_nasm(args_t* args, program_t* prog) { fprintf(f, " ret\n"); } - fprintf(f, "section .bss\n"); for (int i = 0; i < dynarray_length(prog->memories); i++) { memory_t mem = prog->memories[i]; fprintf(f, "morph_memory_%d: resb %zu ; Memory %s\n", i, mem.size, mem.name); } fprintf(f, "section .rodata\n"); - + for (int i = 0; i < dynarray_length(state.strings); i++) { fprintf(f, "morph_str_%d: db \"%s\"\n", i, state.strings[i]); } @@ -431,18 +438,18 @@ int compile_x86_64_linux_nasm(args_t* args, program_t* prog) { const_t* v = &prog->const_vars[i]; fprintf(f, "morph_const_%d: ", i); switch (v->val.type) { - case (TT_PUSH_INT): { - fprintf(f, "dq %zu\n", v->val.int_v); - }; break; - case (TT_PUSH_CSTR): - case (TT_PUSH_STR): { - fprintf(f, "db %s\n", v->val.str_v); - }; break; - case (TT_PUSH_CHAR): - fprintf(f, "db %c\n", v->val.char_v); - case (TT_PUSH_BOOL): - fprintf(f, "db %d\n", (int)v->val.bool_v); - default: + case (TT_PUSH_INT): { + fprintf(f, "dq %zu\n", v->val.int_v); + }; break; + case (TT_PUSH_CSTR): + case (TT_PUSH_STR): { + fprintf(f, "db %s\n", v->val.str_v); + }; break; + case (TT_PUSH_CHAR): + fprintf(f, "db %c\n", v->val.char_v); + case (TT_PUSH_BOOL): + fprintf(f, "db %d\n", (int)v->val.bool_v); + default: } } return 0;