Forgor int
This commit is contained in:
parent
e59f6a31ac
commit
7433808320
7
a.s
7
a.s
|
@ -7,11 +7,18 @@ _start:
|
||||||
mov rdi, 0
|
mov rdi, 0
|
||||||
syscall
|
syscall
|
||||||
morph_f_main:
|
morph_f_main:
|
||||||
|
; -- PUSH_INT --
|
||||||
|
mov rax, 34
|
||||||
|
push rax
|
||||||
|
; -- PUSH_INT --
|
||||||
|
mov rax, 35
|
||||||
|
push rax
|
||||||
; -- OP_ADD --
|
; -- OP_ADD --
|
||||||
pop rax
|
pop rax
|
||||||
pop rbx
|
pop rbx
|
||||||
add rax, rbx
|
add rax, rbx
|
||||||
push rax
|
push rax
|
||||||
|
; -- PUSH_STR --
|
||||||
mov rax, morph_str_0
|
mov rax, morph_str_0
|
||||||
push rax
|
push rax
|
||||||
mov rax, 10
|
mov rax, 10
|
||||||
|
|
|
@ -17,8 +17,12 @@ int write_op(ast_op_t* aop, FILE* f, comp_state_t state) {
|
||||||
token_t op = aop->op;
|
token_t op = aop->op;
|
||||||
switch (op.type) {
|
switch (op.type) {
|
||||||
case (TT_PUSH_INT): {
|
case (TT_PUSH_INT): {
|
||||||
|
fprintf(f, " ; -- PUSH_INT --\n");
|
||||||
|
fprintf(f, " mov rax, %zu\n", op.int_v);
|
||||||
|
fprintf(f, " push rax\n");
|
||||||
}; break;
|
}; break;
|
||||||
case (TT_PUSH_STR): {
|
case (TT_PUSH_STR): {
|
||||||
|
fprintf(f, " ; -- PUSH_STR --\n");
|
||||||
fprintf(f, " mov rax, morph_str_%zu\n", dynarray_length(state.strings));
|
fprintf(f, " mov rax, morph_str_%zu\n", dynarray_length(state.strings));
|
||||||
fprintf(f, " push rax\n");
|
fprintf(f, " push rax\n");
|
||||||
fprintf(f, " mov rax, %zu\n", strlen(op.str_v));
|
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);
|
dynarray_push(state.strings, op.str_v);
|
||||||
}; break;
|
}; break;
|
||||||
case (TT_PUSH_CSTR): {
|
case (TT_PUSH_CSTR): {
|
||||||
|
fprintf(f, " ; -- PUSH_CSTR --\n");
|
||||||
fprintf(f, " mov rax, morph_str_%zu\n", dynarray_length(state.strings));
|
fprintf(f, " mov rax, morph_str_%zu\n", dynarray_length(state.strings));
|
||||||
fprintf(f, " push rax\n");
|
fprintf(f, " push rax\n");
|
||||||
dynarray_push(state.strings, op.str_v);
|
dynarray_push(state.strings, op.str_v);
|
||||||
}; break;
|
}; break;
|
||||||
case (TT_PUSH_BOOL): {
|
case (TT_PUSH_BOOL): {
|
||||||
|
fprintf(f, " ; -- PUSH_BOOL --\n");
|
||||||
fprintf(f, " mov rax, %d\n", (int)op.bool_v);
|
fprintf(f, " mov rax, %d\n", (int)op.bool_v);
|
||||||
fprintf(f, " push rax\n");
|
fprintf(f, " push rax\n");
|
||||||
}; break;
|
}; break;
|
||||||
case (TT_PUSH_CHAR): {
|
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, " mov rax, %d ; '%c'\n", (int)op.char_v, op.char_v);
|
||||||
fprintf(f, " push rax\n");
|
fprintf(f, " push rax\n");
|
||||||
}; break;
|
}; break;
|
||||||
case (TT_PUSH_FLOAT): {
|
case (TT_PUSH_FLOAT): {
|
||||||
|
fprintf(f, " ; -- PUSH_FLOAT --\n");
|
||||||
// TODO: do this
|
// TODO: do this
|
||||||
}; break;
|
}; break;
|
||||||
case (TT_OP): {
|
case (TT_OP): {
|
||||||
|
@ -277,7 +285,7 @@ int write_op(ast_op_t* aop, FILE* f, comp_state_t state) {
|
||||||
case (OP_LOAD64): {
|
case (OP_LOAD64): {
|
||||||
fprintf(f, " ; -- OP_LOAD64 --\n");
|
fprintf(f, " ; -- OP_LOAD64 --\n");
|
||||||
fprintf(f, " pop rax\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, " mov rbx, qword [rax]\n");
|
||||||
fprintf(f, " push rbx\n");
|
fprintf(f, " push rbx\n");
|
||||||
}; break;
|
}; break;
|
||||||
|
@ -356,7 +364,7 @@ int write_op(ast_op_t* aop, FILE* f, comp_state_t state) {
|
||||||
case (OP_ARGV): {
|
case (OP_ARGV): {
|
||||||
}; break;
|
}; break;
|
||||||
case (OP_HERE): {
|
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);
|
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, " mov rax, str_%zu\n", dynarray_length(state.strings));
|
||||||
fprintf(f, " push rax\n");
|
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, " ret\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fprintf(f, "section .bss\n");
|
fprintf(f, "section .bss\n");
|
||||||
for (int i = 0; i < dynarray_length(prog->memories); i++) {
|
for (int i = 0; i < dynarray_length(prog->memories); i++) {
|
||||||
memory_t mem = 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, "morph_memory_%d: resb %zu ; Memory %s\n", i, mem.size, mem.name);
|
||||||
}
|
}
|
||||||
fprintf(f, "section .rodata\n");
|
fprintf(f, "section .rodata\n");
|
||||||
|
|
||||||
for (int i = 0; i < dynarray_length(state.strings); i++) {
|
for (int i = 0; i < dynarray_length(state.strings); i++) {
|
||||||
fprintf(f, "morph_str_%d: db \"%s\"\n", i, 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];
|
const_t* v = &prog->const_vars[i];
|
||||||
fprintf(f, "morph_const_%d: ", i);
|
fprintf(f, "morph_const_%d: ", i);
|
||||||
switch (v->val.type) {
|
switch (v->val.type) {
|
||||||
case (TT_PUSH_INT): {
|
case (TT_PUSH_INT): {
|
||||||
fprintf(f, "dq %zu\n", v->val.int_v);
|
fprintf(f, "dq %zu\n", v->val.int_v);
|
||||||
}; break;
|
}; break;
|
||||||
case (TT_PUSH_CSTR):
|
case (TT_PUSH_CSTR):
|
||||||
case (TT_PUSH_STR): {
|
case (TT_PUSH_STR): {
|
||||||
fprintf(f, "db %s\n", v->val.str_v);
|
fprintf(f, "db %s\n", v->val.str_v);
|
||||||
}; break;
|
}; break;
|
||||||
case (TT_PUSH_CHAR):
|
case (TT_PUSH_CHAR):
|
||||||
fprintf(f, "db %c\n", v->val.char_v);
|
fprintf(f, "db %c\n", v->val.char_v);
|
||||||
case (TT_PUSH_BOOL):
|
case (TT_PUSH_BOOL):
|
||||||
fprintf(f, "db %d\n", (int)v->val.bool_v);
|
fprintf(f, "db %d\n", (int)v->val.bool_v);
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user