123 lines
2.1 KiB
ArmAsm
123 lines
2.1 KiB
ArmAsm
%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
|