186 lines
3.2 KiB
ArmAsm
186 lines
3.2 KiB
ArmAsm
%include "./src/inc/lexer.s"
|
|
%include "./src/inc/expression.s"
|
|
%include "./src/inc/function_table.s"
|
|
%include "./src/inc/token.s"
|
|
|
|
%define FUNC_ERR "[FUNC_ERROR]"
|
|
|
|
section .data
|
|
err_func_args_message: db FUNC_ERR, "invalid argument", 0
|
|
extern func_call
|
|
extern func_call_prologue
|
|
extern func_call_epilogue
|
|
extern REG_RDI
|
|
|
|
section .text
|
|
global lex_func_call
|
|
extern ftable
|
|
extern strcmp
|
|
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_with_const: ; (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]
|
|
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]
|
|
mov rsi, REG_RDI
|
|
call load_var_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
|
|
|
|
err_func_args:
|
|
mov rdi, err_func_args_message
|
|
call putendl
|
|
mov rdi, 1
|
|
call exit
|
|
|
|
; does not change rdi
|
|
global look_up_func
|
|
look_up_func: ; (rdi: name*)
|
|
push rbx
|
|
mov rbx, FTABLE_COUNT
|
|
xor rcx, rcx
|
|
|
|
.search_func:
|
|
cmp rcx, rbx
|
|
je .done_false
|
|
|
|
; rdi still contains name
|
|
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
|
|
|
|
jmp .search_func
|
|
|
|
.done_true:
|
|
mov rax, 1
|
|
jmp .done
|
|
|
|
.done_false:
|
|
xor rax, rax
|
|
|
|
.done:
|
|
pop rbx
|
|
ret
|
|
|
|
lex_func_call: ; rax: bool (rdi :lex *)
|
|
push rbp
|
|
mov rbp, rsp
|
|
sub rsp, 32
|
|
|
|
mov [rbp - 8], rdi ; store lex
|
|
|
|
; store expression based on lexer expression index
|
|
mov rsi, [rdi + LEX_EXPR]
|
|
mov rax, [rdi + LEX_EXPR_IDX]
|
|
imul rax, EXPR_SIZE
|
|
lea rsi, [rsi + rax]
|
|
mov [rbp - 16], rsi
|
|
|
|
mov rdi, [rsi + EXPR_TOK_CNT]
|
|
mov rax, [rsi + EXPR_TOK]
|
|
|
|
cmp qword [rax + TOK_TYPE], TOK_FUNC
|
|
jne .done
|
|
cmp rdi, 2
|
|
jne err_func_args
|
|
|
|
mov rdi, [rax + TOK_VALUE]
|
|
push rdi
|
|
|
|
call look_up_func
|
|
test rax, rax
|
|
pop rdi
|
|
jz lex_eundefined
|
|
|
|
mov [rbp - 24], rdi
|
|
|
|
mov rdi, [rbp - 16]
|
|
mov rsi, [rdi + EXPR_TOK]
|
|
lea rsi, [rsi + SIZE_TOK]
|
|
|
|
cmp qword [rsi + TOK_TYPE], TOK_CONST
|
|
je .arg_const
|
|
cmp qword [rsi + TOK_TYPE], TOK_VAR
|
|
je .arg_var
|
|
|
|
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]
|
|
mov rsi, [rsi + TOK_VALUE]
|
|
call look_up_var
|
|
mov rsi, rax
|
|
mov rdi, [rbp - 24]
|
|
call insert_func_with_var
|
|
|
|
|
|
.done:
|
|
mov rsp, rbp
|
|
pop rbp
|
|
ret
|
|
|
|
|