From 1df58ad7c3ffd16e712536ff9c07aa8ed3321e59 Mon Sep 17 00:00:00 2001 From: victor Date: Mon, 12 May 2025 10:10:23 +0200 Subject: [PATCH] simple function calls --- Makefile | 29 +++++-- core.lang | Bin 0 -> 104946 bytes src/core/mem/malloc.s | 2 + src/core/string/atoi.s | 15 ++++ src/global/function_table.s | 21 ++--- src/inc/expression.s | 2 +- src/inc/function_table.s | 2 +- src/lexer/func_boiler_plate.s | 26 ++++++ src/lexer/lex_func.s | 53 ++++++++++-- src/lexer/lexer.s | 19 ++++- src/lexer/program_prologue.s | 96 ++++++++++++++++++++++ src/lexer/vars/get_vars.s | 5 +- src/lexer/vars/insert_var.s | 36 ++++++-- src/parse/expression/create_expressions.s | 2 + src/parse/tokenizer.s | 4 +- src/start.s | 66 +++------------ test.c | 24 ------ test.lang | 4 + 18 files changed, 289 insertions(+), 117 deletions(-) create mode 100644 core.lang create mode 100644 src/core/string/atoi.s create mode 100644 src/lexer/func_boiler_plate.s create mode 100644 src/lexer/program_prologue.s delete mode 100644 test.c diff --git a/Makefile b/Makefile index 7ce8111..58dfed1 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,12 @@ +TARGET := langc + + +AFLAGS = -felf64 -F dwarf -g + +ifdef DEBUG + AFLAGS += -DDEBUG_BUILD +endif + SRCDIR := src COREDIR := $(SRCDIR)/core MATHDIR := $(COREDIR)/math @@ -43,7 +52,8 @@ EXPRSRC := $(addprefix $(EXPRDIR)/, $(addsuffix .s, \ create_expressions debug_expression \ )) LEXSRC := $(addprefix $(LEXDIR)/, $(addsuffix .s, \ - lexer lex_err lex_load lex_func \ + lexer lex_err lex_load lex_func program_prologue \ + func_boiler_plate \ )) VARSRC := $(addprefix $(VARDIR)/, $(addsuffix .s, \ get_vars insert_var \ @@ -59,26 +69,35 @@ SRC := $(SRCDIR)/start.s $(MATHSRC) $(STRSRC) $(PRINTSRC) $(FILESRC) $(VARSRC) $ OBJDIR := obj OBJ := $(patsubst $(SRCDIR)/%.s,$(OBJDIR)/%.o,$(SRC)) -all: debug +LIBOBJ := $(filter-out start.o, $(OBJ)) +LIBNAME := core.lang + +all: $(TARGET) + +lib: $(OBJ) + ar rcs $(LIBNAME) $(LIBOBJ) # Create output directories $(OBJDIR)/core/math $(OBJDIR)/core/string $(OBJDIR)/core/print $(OBJDIR)/core/mem $(OBJDIR)/core/syscall $(OBJDIR)/core/file $(OBJDIR)/parse/expression $(OBJDIR)/parse/token $(OBJDIR)/lexer $(OBJDIR)/lexer/vars $(OBJDIR)/global: mkdir -p $@ # Main target -debug: $(OBJDIR) $(OBJDIR)/core/math $(OBJDIR)/core/string $(OBJDIR)/core/print $(OBJDIR)/core/mem $(OBJDIR)/core/syscall $(OBJDIR)/core/file $(OBJDIR)/parse/expression $(OBJDIR)/parse/token $(OBJDIR)/lexer $(OBJDIR)/lexer/vars $(OBJDIR)/global $(OBJ) +$(TARGET): $(OBJDIR) $(OBJDIR)/core/math $(OBJDIR)/core/string $(OBJDIR)/core/print $(OBJDIR)/core/mem $(OBJDIR)/core/syscall $(OBJDIR)/core/file $(OBJDIR)/parse/expression $(OBJDIR)/parse/token $(OBJDIR)/lexer $(OBJDIR)/lexer/vars $(OBJDIR)/global $(OBJ) ld -g -o $@ $(OBJ) -nostdlib -static # Fix: Use a more specific pattern rule that preserves paths $(OBJDIR)/%.o: $(SRCDIR)/%.s mkdir -p $(dir $@) - nasm -felf64 -F dwarf -g $< -o $@ + nasm $(AFLAGS) $< -o $@ $(OBJDIR): mkdir -p $@ clean: - rm -rf $(OBJDIR) debug + rm -rf $(OBJDIR) + +fclean: clean + rm -rf $(TARGET) re: clean all diff --git a/core.lang b/core.lang new file mode 100644 index 0000000000000000000000000000000000000000..1d30553a43cf9ff9330fef3a0fd5caeaab126c18 GIT binary patch literal 104946 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 literal 0 HcmV?d00001 diff --git a/src/core/mem/malloc.s b/src/core/mem/malloc.s index 3688f44..736c6d0 100644 --- a/src/core/mem/malloc.s +++ b/src/core/mem/malloc.s @@ -50,6 +50,7 @@ malloc: ; RAX: long basic_malloc(RDI: size_t n) mov r8, rdi push rdi +%ifdef DEBUG_BUILD mov rdi, success call putstr mov rdi, r8 @@ -63,6 +64,7 @@ malloc: ; RAX: long basic_malloc(RDI: size_t n) mov rdi, str_bytecnt call putendl +%endif pop rax sub rax, rbx pop rbx diff --git a/src/core/string/atoi.s b/src/core/string/atoi.s new file mode 100644 index 0000000..2924bbd --- /dev/null +++ b/src/core/string/atoi.s @@ -0,0 +1,15 @@ +section .text + extern strlen + +atoi: ; rax: int (rdi: str*) + push rbp + mov rbp, rsp + sub rsp, 16 + xor rax, rax + xor rcx, rcx + push rdi + call strlen + mov [rbp - 8], rax +.loop: + +.done: diff --git a/src/global/function_table.s b/src/global/function_table.s index 31d416e..3794311 100644 --- a/src/global/function_table.s +++ b/src/global/function_table.s @@ -1,16 +1,17 @@ section .data - func_syms: db \ - "putnumber", 0 \ + putnumber_func: db "putnumber", 0 + exit_func: db "exit", 0 global ftable - ftable: dq 1, \ - func_syms - global func_prologue - func_prologue: db "push rdi", 0 + ftable: dq 2, \ + putnumber_func, \ + exit_func + + global func_call_prologue + func_call_prologue: db " push rdi", 0 global func_call - func_call: db "call ", 0 - - global func_epilogue - func_epilogue: db "pop rdi", 0 + func_call: db " call ", 0 + global func_call_epilogue + func_call_epilogue: db " pop rdi", 0 diff --git a/src/inc/expression.s b/src/inc/expression.s index 0fc591a..6129ba3 100644 --- a/src/inc/expression.s +++ b/src/inc/expression.s @@ -4,8 +4,8 @@ %define EXPR_TOK_CNT 8 %define EXPR_TOK 16 - ; struct expression size = 32 ; .type ; .tok_count + 8 ; .tokens + 16 + diff --git a/src/inc/function_table.s b/src/inc/function_table.s index 531853a..1f58460 100644 --- a/src/inc/function_table.s +++ b/src/inc/function_table.s @@ -1,5 +1,5 @@ %define FTABLE_SIZE 16 -%define FTABLE_COUNT 0 +%define FTABLE_COUNT 2 %define FTABLE_SYM 8 ; struct func_table diff --git a/src/lexer/func_boiler_plate.s b/src/lexer/func_boiler_plate.s new file mode 100644 index 0000000..bf74706 --- /dev/null +++ b/src/lexer/func_boiler_plate.s @@ -0,0 +1,26 @@ +section .text + extern putstr + extern putnumberendl + + func_stack_alloc: db " push rbp", 0xa, " mov rbp, rsp", 0xa, " sub rsp, ", 0 + func_stack_dealloc: db " mov rsp, rbp", 0xa, " pop rbp", 0xa, 0 + ret_inst: db " ret", 0xa, 0 + +global func_prologue +func_prologue: ; (rdi: var_count) + mov rax, 8 + imul rax, rdi + push rax + mov rdi, func_stack_alloc + call putstr + pop rdi + call putnumberendl + ret + +global func_epilogue +func_epilogue: ; + mov rdi, func_stack_dealloc + call putstr + mov rdi, ret_inst + call putstr + ret diff --git a/src/lexer/lex_func.s b/src/lexer/lex_func.s index 8ae5dcc..0a8d581 100644 --- a/src/lexer/lex_func.s +++ b/src/lexer/lex_func.s @@ -8,8 +8,8 @@ section .data err_func_args_message: db FUNC_ERR, "invalid argument", 0 extern func_call - extern func_prologue - extern func_epilogue + extern func_call_prologue + extern func_call_epilogue extern REG_RDI section .text @@ -19,12 +19,14 @@ section .text extern lex_eundefined extern putstr extern putendl + extern putnumberendl extern exit extern look_up_var extern insert_mov extern load_var_reg + extern load_const_reg -insert_func: ; (rdi: name*, rsi: arg*) +insert_func_with_const: ; (rdi: name*, rsi: arg*) push rbp mov rbp, rsp sub rsp, 16 @@ -32,7 +34,32 @@ insert_func: ; (rdi: name*, rsi: arg*) mov [rbp - 8], rdi ; store name mov [rbp - 16], rsi ; store arg - mov rdi, func_prologue + mov rdi, func_call_prologue + call putendl + + mov rdi, [rbp - 16] + mov rsi, REG_RDI + call load_const_reg + mov rdi, func_call + call putstr + mov rdi, [rbp - 8] + call putendl + mov rdi, func_call_epilogue + call putendl + + mov rsp, rbp + pop rbp + ret + +insert_func_with_var: ; (rdi: name*, rsi: arg*) + push rbp + mov rbp, rsp + sub rsp, 16 + + mov [rbp - 8], rdi ; store name + mov [rbp - 16], rsi ; store arg + + mov rdi, func_call_prologue call putendl mov rdi, [rbp - 16] @@ -42,7 +69,7 @@ insert_func: ; (rdi: name*, rsi: arg*) call putstr mov rdi, [rbp - 8] call putendl - mov rdi, func_epilogue + mov rdi, func_call_epilogue call putendl mov rsp, rbp @@ -59,8 +86,7 @@ err_func_args: global look_up_func look_up_func: ; (rdi: name*) push rbx - lea rdx, [ftable] - mov rbx, [rdx + FTABLE_COUNT] + mov rbx, FTABLE_COUNT xor rcx, rcx .search_func: @@ -68,9 +94,14 @@ look_up_func: ; (rdi: name*) je .done_false ; rdi still contains name - mov rsi, [rdx + FTABLE_SYM] + push rcx + mov rax, FTABLE_SYM + inc rcx + imul rax, rcx + mov rsi, [ftable + rax] call strcmp test rax, rax + pop rcx jz .done_true inc rcx @@ -132,6 +163,10 @@ lex_func_call: ; rax: bool (rdi :lex *) call err_func_args .arg_const: + mov rdi, [rbp - 24] + mov rsi, [rsi + TOK_VALUE] + call insert_func_with_const + jmp .done .arg_var: mov rdi, [rbp - 8] @@ -139,7 +174,7 @@ lex_func_call: ; rax: bool (rdi :lex *) call look_up_var mov rsi, rax mov rdi, [rbp - 24] - call insert_func + call insert_func_with_var .done: diff --git a/src/lexer/lexer.s b/src/lexer/lexer.s index 19f92ac..465c1d2 100644 --- a/src/lexer/lexer.s +++ b/src/lexer/lexer.s @@ -8,15 +8,19 @@ section .text extern err_malloc extern exit extern putstr + extern putendl extern create_expressions extern strcmp extern get_vars extern lex_load extern lex_func_call - extern lex_eundefined + extern func_prologue + extern func_epilogue + + extern program_prologue global lex lex: ; rax: lex* (rdi: char *file_content) @@ -42,11 +46,19 @@ lex: ; rax: lex* (rdi: char *file_content) mov rdi, [rbp - 24] mov [rdi + LEX_EXPR], rax - mov rax, [rbp - 16] - mov [rdi + LEX_EXPR_CNT], rax + mov eax, dword [rbp - 16] + mov dword [rdi + LEX_EXPR_CNT], eax call get_vars + mov rdi, [rbp - 24] + call program_prologue + + mov rdi, [rbp - 24] + mov edi, dword [rdi + LEX_VAR_CNT] + + call func_prologue + mov rax, [rbp - 24] lea rcx, [rax + LEX_EXPR_IDX] @@ -71,6 +83,7 @@ lex: ; rax: lex* (rdi: char *file_content) jmp .process_expressions .done: + call func_epilogue pop rbx mov rsp, rbp pop rbp diff --git a/src/lexer/program_prologue.s b/src/lexer/program_prologue.s new file mode 100644 index 0000000..e56e3bb --- /dev/null +++ b/src/lexer/program_prologue.s @@ -0,0 +1,96 @@ +%include "./src/inc/lexer.s" +%include "./src/inc/token.s" +%include "./src/inc/expression.s" + +section .data + section_text: db "section .text", 0xa, 0 + program_start: db "global _start", 0xa, "_start:", 0xa, 0 + extern_str: db "extern ", 0 + + +section .text + extern putendl + extern putstr + + global program_prologue + +print_section_text: + mov rdi, section_text + call putstr + ret + +print_program_start: + mov rdi, program_start + call putendl + ret + +declare_extern: ; (rdi: func_name*) + push rdi + mov rdi, extern_str + call putstr + pop rdi + call putendl + ret + +declare_extern_func: ;(rdi: lex*) + push rbp + mov rbp, rsp + + sub rsp, 16 + + push rbx + xor rcx, rcx + + mov rax, [rdi + LEX_EXPR] + mov [rbp - 8], rax + mov eax, dword [rdi + LEX_EXPR_CNT] + mov [rbp - 12], eax +.loop: + cmp ecx, [rbp - 12] + je .loop_end + mov rbx, [rbp - 8] + mov rax, EXPR_SIZE + imul rax, rcx + lea rbx, [rbx + rax] + mov r8, [rbx + EXPR_TOK_CNT] + mov rbx, [rbx + EXPR_TOK] + push rcx + xor rcx, rcx +.loop_tokens: + cmp rcx, r8 + je .loop_tokens_end + mov rax, SIZE_TOK + imul rax, rcx + lea rax, [rbx + rax] + mov rdx, TOK_FUNC + cmp rdx, qword [rax + TOK_TYPE] + jne .dont_print + mov rdi, [rax + TOK_VALUE] + push rcx + push r8 + call declare_extern + pop r8 + pop rcx +.dont_print: + inc rcx + jmp .loop_tokens +.loop_tokens_end: + pop rcx + inc rcx + jmp .loop + +.loop_end: + pop rbx + + mov rsp, rbp + pop rbp + ret + +program_prologue: ;(rdi: lex*) + push rdi + mov rdi, section_text + call putendl + pop rdi + call declare_extern_func + call print_program_start + ret diff --git a/src/lexer/vars/get_vars.s b/src/lexer/vars/get_vars.s index 8d93305..d71c1ff 100644 --- a/src/lexer/vars/get_vars.s +++ b/src/lexer/vars/get_vars.s @@ -124,7 +124,8 @@ get_vars: ; (rdi: lex*) push rcx .loop_expr: pop rcx - cmp ecx, dword [rdi + LEX_EXPR_CNT] + mov ebx, dword [rbp - 8] + cmp ecx, ebx je .done mov rax, EXPR_SIZE mul rcx @@ -156,7 +157,9 @@ get_vars: ; (rdi: lex*) pop rcx pop rdi cmp rax, 1 + pop rax je .skip_alloc + push rax mov rax, VAR_SIZE mul r9 lea rbx, [rbx + rax] diff --git a/src/lexer/vars/insert_var.s b/src/lexer/vars/insert_var.s index 1dd99c4..4762477 100644 --- a/src/lexer/vars/insert_var.s +++ b/src/lexer/vars/insert_var.s @@ -2,10 +2,10 @@ section .data - INST_MOV: db "mov ", 0 - INST_ADD: db "add ", 0 - INST_SUB: db "sub ", 0 - INST_XOR: db "xor ", 0 + INST_MOV: db " mov ", 0 + INST_ADD: db " add ", 0 + INST_SUB: db " sub ", 0 + INST_XOR: db " xor ", 0 OPEN_STACK_VAR: db "[rbp-", 0 CLOSE_STACK_VAR: db "]", 0 @@ -14,6 +14,7 @@ section .data section .text extern putstr extern putnumber + extern putnumberendl extern putchar extern putendl extern VAL_CONST @@ -25,7 +26,6 @@ section .text extern REG_RAX extern REG_RDI - global insert_xor insert_xor: mov rdi, INST_XOR @@ -86,6 +86,24 @@ load_reg_var: ; (rdi: OFF_S, rsi: REG*) ret +global load_const_reg +load_const_reg: ; (rdi: const*, rsi: REG*) + push rdi + push rsi + + call insert_mov + + pop rdi + call putstr + + mov rdi, SEP_INST + call putstr + + pop rdi + call insert_const_endl + + ret + global load_var_reg load_var_reg: ; (rdi: OFF_S, rsi: REG*) push rdi @@ -237,7 +255,13 @@ sub_rax_var: ; (rdi: OFF_S) ret -global insert_var +insert_const_endl: ; (rdi: const*) + push rdi + call putendl + pop rdi + + ret + insert_var_endl: ; (rdi: OFF_S) push rdi mov rdi, OPEN_STACK_VAR diff --git a/src/parse/expression/create_expressions.s b/src/parse/expression/create_expressions.s index 07541d9..ab6f36b 100644 --- a/src/parse/expression/create_expressions.s +++ b/src/parse/expression/create_expressions.s @@ -107,9 +107,11 @@ create_expressions: ; rax: exp* (rdi: char *filecontent, rsi: *cnt) mov rax, EXPR_SIZE mul rcx lea rdi, [rbx + rax] +%ifdef DEBUG_BUILD push rcx call print_expression pop rcx +%endif inc rcx jmp .expr_loop_print diff --git a/src/parse/tokenizer.s b/src/parse/tokenizer.s index 2f9e2ee..b87dfd2 100644 --- a/src/parse/tokenizer.s +++ b/src/parse/tokenizer.s @@ -1,9 +1,9 @@ section .text is_space: ; rax: bool (rdi: c) - cmp c, 8 + cmp rdi, 8 jl .false - cmp c, 13 + cmp rdi, 13 je .false .true: mov rax, 1 diff --git a/src/start.s b/src/start.s index 5a1d8e5..6e20e0f 100644 --- a/src/start.s +++ b/src/start.s @@ -19,68 +19,24 @@ print_usage: call putstr _start: + pop rdi + cmp rdi, 2 + jne err_args + mov rdi, [rsp + 8] ; argv[1] push rbp mov rbp, rsp + sub rsp, 16 - mov rdi, 1 - call vec_create + call get_file_content mov rdi, rax + mov [rbp - 8], rax - xor rcx, rcx - mov rbx, 90 - mov r8, ' ' + mov rdi, rax + call lex -.loop: - cmp rcx, rbx - je .done - push rcx - push r8 - mov byte [rbp - 4], r8b - lea rsi, [rbp - 4] - push rdi - call vec_push - pop rdi - pop r8 - pop rcx - inc r8 - inc rcx - jmp .loop -.done: - push rdi - call vec_pop - pop rdi - push rdi - mov rdi, [rdi + 16] - call putstr - pop rdi - lea rsi, [rbp - 1] - mov rdx, 88 - call vec_get - test rax, rax - jz done - - mov dil, byte [rbp - 1] - call putchar - -; pop rdi -; cmp rdi, 2 -; jne err_args -; mov rdi, [rsp + 8] ; argv[1] -; push rbp -; mov rbp, rsp -; -; sub rsp, 16 -; -; call get_file_content -; mov rdi, rax -; mov [rbp - 8], rax -; -; mov rdi, rax -; call lex -; -; mov rsp, rbp -; pop rbp + mov rsp, rbp + pop rbp done: xor rdi, rdi diff --git a/test.c b/test.c deleted file mode 100644 index 50090b9..0000000 --- a/test.c +++ /dev/null @@ -1,24 +0,0 @@ -#include - -int main(int argc, char **argv) { - - int a = 17; - - switch (a) { - case 1: - break ; - case 2: - break ; - case 3: - break ; - case 4: - break ; - case 5: - break ; - case 6: - break ; - case 17: - a = 0xfffaaaaf; - break ; - } -} diff --git a/test.lang b/test.lang index fe95113..352d7b3 100644 --- a/test.lang +++ b/test.lang @@ -1,3 +1,7 @@ a = 6 b = 5 - 2 + 6 + a putnumber b +c = b + a +putnumber c +a = 0 +exit 1