%include "./src/inc/token.s" %include "./src/inc/lexer.s" %include "./src/inc/expression.s" %include "./src/inc/asm_output.s" %include "./src/inc/regs.s" section .text extern malloc extern err_malloc extern exit extern putstr extern create_expressions extern strcmp extern VAL_OP_LOAD extern VAL_OP_ADD extern VAL_VAR extern VAL_CONST extern putchar extern putnumber extern putendl extern get_vars extern insert_var extern insert_mov extern load_var_rax extern load_rax_var extern add_const_rax extern add_var_rax extern sub_const_rax extern sub_var_rax extern xor_reg extern lex_load extern lex_eundefined global lex lex: ; rax: lex* (rdi: char *file_content) push rbp mov rbp, rsp sub rsp, 32 push rbx mov [rbp - 8], rdi ; allocate lexer mov rdi, LEX_SIZE call malloc cmp rax, 0 je err_malloc mov [rbp - 24], rax ; store lex on stack lea rsi, [rbp - 16] ; int* expr_cnt mov rdi, [rbp - 8] ; restore file_content call create_expressions mov rdi, [rbp - 24] mov [rdi + LEX_EXPR], rax mov rax, [rbp - 16] mov [rdi + LEX_EXPR_CNT], rax call get_vars mov rax, [rbp - 24] lea rcx, [rax + LEX_EXPR_IDX] .process_expressions: mov rdi, [rbp - 24] mov esi, [rdi + LEX_EXPR_CNT] cmp dword [rcx], esi je .done push rcx call lex_load pop rcx inc dword [rcx] jmp .process_expressions .done: pop rbx mov rsp, rbp pop rbp ret global look_up_var look_up_var: ; rax: bool (rdi: lex*, rsi: name*) push rbp mov rbp, rsp xor rax, rax xor rcx, rcx mov edx, dword [rdi + LEX_VAR_CNT] mov rdi, [rdi + LEX_VAR] .loop_vars: cmp rcx, rdx je .not_found push rdi mov rdi, [rdi] call strcmp pop rdi cmp rax, 0 je .found inc rcx add rdi, VAR_SIZE jmp .loop_vars .not_found: mov rdi, rsi call lex_eundefined .found: mov rax, [rdi + VAR_OFFS] .done: mov rsp, rbp pop rbp ret