simple function calls
This commit is contained in:
parent
f569dff167
commit
1df58ad7c3
29
Makefile
29
Makefile
@ -1,3 +1,12 @@
|
|||||||
|
TARGET := langc
|
||||||
|
|
||||||
|
|
||||||
|
AFLAGS = -felf64 -F dwarf -g
|
||||||
|
|
||||||
|
ifdef DEBUG
|
||||||
|
AFLAGS += -DDEBUG_BUILD
|
||||||
|
endif
|
||||||
|
|
||||||
SRCDIR := src
|
SRCDIR := src
|
||||||
COREDIR := $(SRCDIR)/core
|
COREDIR := $(SRCDIR)/core
|
||||||
MATHDIR := $(COREDIR)/math
|
MATHDIR := $(COREDIR)/math
|
||||||
@ -43,7 +52,8 @@ EXPRSRC := $(addprefix $(EXPRDIR)/, $(addsuffix .s, \
|
|||||||
create_expressions debug_expression \
|
create_expressions debug_expression \
|
||||||
))
|
))
|
||||||
LEXSRC := $(addprefix $(LEXDIR)/, $(addsuffix .s, \
|
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, \
|
VARSRC := $(addprefix $(VARDIR)/, $(addsuffix .s, \
|
||||||
get_vars insert_var \
|
get_vars insert_var \
|
||||||
@ -59,26 +69,35 @@ SRC := $(SRCDIR)/start.s $(MATHSRC) $(STRSRC) $(PRINTSRC) $(FILESRC) $(VARSRC) $
|
|||||||
OBJDIR := obj
|
OBJDIR := obj
|
||||||
OBJ := $(patsubst $(SRCDIR)/%.s,$(OBJDIR)/%.o,$(SRC))
|
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
|
# 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:
|
$(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 $@
|
mkdir -p $@
|
||||||
|
|
||||||
# Main target
|
# 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
|
ld -g -o $@ $(OBJ) -nostdlib -static
|
||||||
|
|
||||||
# Fix: Use a more specific pattern rule that preserves paths
|
# Fix: Use a more specific pattern rule that preserves paths
|
||||||
$(OBJDIR)/%.o: $(SRCDIR)/%.s
|
$(OBJDIR)/%.o: $(SRCDIR)/%.s
|
||||||
mkdir -p $(dir $@)
|
mkdir -p $(dir $@)
|
||||||
nasm -felf64 -F dwarf -g $< -o $@
|
nasm $(AFLAGS) $< -o $@
|
||||||
|
|
||||||
$(OBJDIR):
|
$(OBJDIR):
|
||||||
mkdir -p $@
|
mkdir -p $@
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf $(OBJDIR) debug
|
rm -rf $(OBJDIR)
|
||||||
|
|
||||||
|
fclean: clean
|
||||||
|
rm -rf $(TARGET)
|
||||||
|
|
||||||
re: clean all
|
re: clean all
|
||||||
|
|
||||||
|
|||||||
@ -50,6 +50,7 @@ malloc: ; RAX: long basic_malloc(RDI: size_t n)
|
|||||||
mov r8, rdi
|
mov r8, rdi
|
||||||
push rdi
|
push rdi
|
||||||
|
|
||||||
|
%ifdef DEBUG_BUILD
|
||||||
mov rdi, success
|
mov rdi, success
|
||||||
call putstr
|
call putstr
|
||||||
mov rdi, r8
|
mov rdi, r8
|
||||||
@ -63,6 +64,7 @@ malloc: ; RAX: long basic_malloc(RDI: size_t n)
|
|||||||
mov rdi, str_bytecnt
|
mov rdi, str_bytecnt
|
||||||
call putendl
|
call putendl
|
||||||
|
|
||||||
|
%endif
|
||||||
pop rax
|
pop rax
|
||||||
sub rax, rbx
|
sub rax, rbx
|
||||||
pop rbx
|
pop rbx
|
||||||
|
|||||||
15
src/core/string/atoi.s
Normal file
15
src/core/string/atoi.s
Normal file
@ -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:
|
||||||
@ -1,16 +1,17 @@
|
|||||||
section .data
|
section .data
|
||||||
func_syms: db \
|
putnumber_func: db "putnumber", 0
|
||||||
"putnumber", 0 \
|
exit_func: db "exit", 0
|
||||||
|
|
||||||
global ftable
|
global ftable
|
||||||
ftable: dq 1, \
|
ftable: dq 2, \
|
||||||
func_syms
|
putnumber_func, \
|
||||||
global func_prologue
|
exit_func
|
||||||
func_prologue: db "push rdi", 0
|
|
||||||
|
global func_call_prologue
|
||||||
|
func_call_prologue: db " push rdi", 0
|
||||||
|
|
||||||
global func_call
|
global func_call
|
||||||
func_call: db " call ", 0
|
func_call: db " call ", 0
|
||||||
|
|
||||||
global func_epilogue
|
global func_call_epilogue
|
||||||
func_epilogue: db "pop rdi", 0
|
func_call_epilogue: db " pop rdi", 0
|
||||||
|
|
||||||
|
|||||||
@ -4,8 +4,8 @@
|
|||||||
%define EXPR_TOK_CNT 8
|
%define EXPR_TOK_CNT 8
|
||||||
%define EXPR_TOK 16
|
%define EXPR_TOK 16
|
||||||
|
|
||||||
|
|
||||||
; struct expression size = 32
|
; struct expression size = 32
|
||||||
; .type
|
; .type
|
||||||
; .tok_count + 8
|
; .tok_count + 8
|
||||||
; .tokens + 16
|
; .tokens + 16
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
%define FTABLE_SIZE 16
|
%define FTABLE_SIZE 16
|
||||||
%define FTABLE_COUNT 0
|
%define FTABLE_COUNT 2
|
||||||
%define FTABLE_SYM 8
|
%define FTABLE_SYM 8
|
||||||
|
|
||||||
; struct func_table
|
; struct func_table
|
||||||
|
|||||||
26
src/lexer/func_boiler_plate.s
Normal file
26
src/lexer/func_boiler_plate.s
Normal file
@ -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
|
||||||
@ -8,8 +8,8 @@
|
|||||||
section .data
|
section .data
|
||||||
err_func_args_message: db FUNC_ERR, "invalid argument", 0
|
err_func_args_message: db FUNC_ERR, "invalid argument", 0
|
||||||
extern func_call
|
extern func_call
|
||||||
extern func_prologue
|
extern func_call_prologue
|
||||||
extern func_epilogue
|
extern func_call_epilogue
|
||||||
extern REG_RDI
|
extern REG_RDI
|
||||||
|
|
||||||
section .text
|
section .text
|
||||||
@ -19,12 +19,14 @@ section .text
|
|||||||
extern lex_eundefined
|
extern lex_eundefined
|
||||||
extern putstr
|
extern putstr
|
||||||
extern putendl
|
extern putendl
|
||||||
|
extern putnumberendl
|
||||||
extern exit
|
extern exit
|
||||||
extern look_up_var
|
extern look_up_var
|
||||||
extern insert_mov
|
extern insert_mov
|
||||||
extern load_var_reg
|
extern load_var_reg
|
||||||
|
extern load_const_reg
|
||||||
|
|
||||||
insert_func: ; (rdi: name*, rsi: arg*)
|
insert_func_with_const: ; (rdi: name*, rsi: arg*)
|
||||||
push rbp
|
push rbp
|
||||||
mov rbp, rsp
|
mov rbp, rsp
|
||||||
sub rsp, 16
|
sub rsp, 16
|
||||||
@ -32,7 +34,32 @@ insert_func: ; (rdi: name*, rsi: arg*)
|
|||||||
mov [rbp - 8], rdi ; store name
|
mov [rbp - 8], rdi ; store name
|
||||||
mov [rbp - 16], rsi ; store arg
|
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
|
call putendl
|
||||||
|
|
||||||
mov rdi, [rbp - 16]
|
mov rdi, [rbp - 16]
|
||||||
@ -42,7 +69,7 @@ insert_func: ; (rdi: name*, rsi: arg*)
|
|||||||
call putstr
|
call putstr
|
||||||
mov rdi, [rbp - 8]
|
mov rdi, [rbp - 8]
|
||||||
call putendl
|
call putendl
|
||||||
mov rdi, func_epilogue
|
mov rdi, func_call_epilogue
|
||||||
call putendl
|
call putendl
|
||||||
|
|
||||||
mov rsp, rbp
|
mov rsp, rbp
|
||||||
@ -59,8 +86,7 @@ err_func_args:
|
|||||||
global look_up_func
|
global look_up_func
|
||||||
look_up_func: ; (rdi: name*)
|
look_up_func: ; (rdi: name*)
|
||||||
push rbx
|
push rbx
|
||||||
lea rdx, [ftable]
|
mov rbx, FTABLE_COUNT
|
||||||
mov rbx, [rdx + FTABLE_COUNT]
|
|
||||||
xor rcx, rcx
|
xor rcx, rcx
|
||||||
|
|
||||||
.search_func:
|
.search_func:
|
||||||
@ -68,9 +94,14 @@ look_up_func: ; (rdi: name*)
|
|||||||
je .done_false
|
je .done_false
|
||||||
|
|
||||||
; rdi still contains name
|
; 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
|
call strcmp
|
||||||
test rax, rax
|
test rax, rax
|
||||||
|
pop rcx
|
||||||
jz .done_true
|
jz .done_true
|
||||||
|
|
||||||
inc rcx
|
inc rcx
|
||||||
@ -132,6 +163,10 @@ lex_func_call: ; rax: bool (rdi :lex *)
|
|||||||
call err_func_args
|
call err_func_args
|
||||||
|
|
||||||
.arg_const:
|
.arg_const:
|
||||||
|
mov rdi, [rbp - 24]
|
||||||
|
mov rsi, [rsi + TOK_VALUE]
|
||||||
|
call insert_func_with_const
|
||||||
|
jmp .done
|
||||||
|
|
||||||
.arg_var:
|
.arg_var:
|
||||||
mov rdi, [rbp - 8]
|
mov rdi, [rbp - 8]
|
||||||
@ -139,7 +174,7 @@ lex_func_call: ; rax: bool (rdi :lex *)
|
|||||||
call look_up_var
|
call look_up_var
|
||||||
mov rsi, rax
|
mov rsi, rax
|
||||||
mov rdi, [rbp - 24]
|
mov rdi, [rbp - 24]
|
||||||
call insert_func
|
call insert_func_with_var
|
||||||
|
|
||||||
|
|
||||||
.done:
|
.done:
|
||||||
|
|||||||
@ -8,15 +8,19 @@ section .text
|
|||||||
extern err_malloc
|
extern err_malloc
|
||||||
extern exit
|
extern exit
|
||||||
extern putstr
|
extern putstr
|
||||||
|
extern putendl
|
||||||
|
|
||||||
extern create_expressions
|
extern create_expressions
|
||||||
extern strcmp
|
extern strcmp
|
||||||
extern get_vars
|
extern get_vars
|
||||||
extern lex_load
|
extern lex_load
|
||||||
extern lex_func_call
|
extern lex_func_call
|
||||||
|
|
||||||
extern lex_eundefined
|
extern lex_eundefined
|
||||||
|
|
||||||
|
extern func_prologue
|
||||||
|
extern func_epilogue
|
||||||
|
|
||||||
|
extern program_prologue
|
||||||
|
|
||||||
global lex
|
global lex
|
||||||
lex: ; rax: lex* (rdi: char *file_content)
|
lex: ; rax: lex* (rdi: char *file_content)
|
||||||
@ -42,11 +46,19 @@ lex: ; rax: lex* (rdi: char *file_content)
|
|||||||
|
|
||||||
mov rdi, [rbp - 24]
|
mov rdi, [rbp - 24]
|
||||||
mov [rdi + LEX_EXPR], rax
|
mov [rdi + LEX_EXPR], rax
|
||||||
mov rax, [rbp - 16]
|
mov eax, dword [rbp - 16]
|
||||||
mov [rdi + LEX_EXPR_CNT], rax
|
mov dword [rdi + LEX_EXPR_CNT], eax
|
||||||
|
|
||||||
call get_vars
|
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]
|
mov rax, [rbp - 24]
|
||||||
lea rcx, [rax + LEX_EXPR_IDX]
|
lea rcx, [rax + LEX_EXPR_IDX]
|
||||||
|
|
||||||
@ -71,6 +83,7 @@ lex: ; rax: lex* (rdi: char *file_content)
|
|||||||
|
|
||||||
jmp .process_expressions
|
jmp .process_expressions
|
||||||
.done:
|
.done:
|
||||||
|
call func_epilogue
|
||||||
pop rbx
|
pop rbx
|
||||||
mov rsp, rbp
|
mov rsp, rbp
|
||||||
pop rbp
|
pop rbp
|
||||||
|
|||||||
96
src/lexer/program_prologue.s
Normal file
96
src/lexer/program_prologue.s
Normal file
@ -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
|
||||||
@ -124,7 +124,8 @@ get_vars: ; (rdi: lex*)
|
|||||||
push rcx
|
push rcx
|
||||||
.loop_expr:
|
.loop_expr:
|
||||||
pop rcx
|
pop rcx
|
||||||
cmp ecx, dword [rdi + LEX_EXPR_CNT]
|
mov ebx, dword [rbp - 8]
|
||||||
|
cmp ecx, ebx
|
||||||
je .done
|
je .done
|
||||||
mov rax, EXPR_SIZE
|
mov rax, EXPR_SIZE
|
||||||
mul rcx
|
mul rcx
|
||||||
@ -156,7 +157,9 @@ get_vars: ; (rdi: lex*)
|
|||||||
pop rcx
|
pop rcx
|
||||||
pop rdi
|
pop rdi
|
||||||
cmp rax, 1
|
cmp rax, 1
|
||||||
|
pop rax
|
||||||
je .skip_alloc
|
je .skip_alloc
|
||||||
|
push rax
|
||||||
mov rax, VAR_SIZE
|
mov rax, VAR_SIZE
|
||||||
mul r9
|
mul r9
|
||||||
lea rbx, [rbx + rax]
|
lea rbx, [rbx + rax]
|
||||||
|
|||||||
@ -14,6 +14,7 @@ section .data
|
|||||||
section .text
|
section .text
|
||||||
extern putstr
|
extern putstr
|
||||||
extern putnumber
|
extern putnumber
|
||||||
|
extern putnumberendl
|
||||||
extern putchar
|
extern putchar
|
||||||
extern putendl
|
extern putendl
|
||||||
extern VAL_CONST
|
extern VAL_CONST
|
||||||
@ -25,7 +26,6 @@ section .text
|
|||||||
extern REG_RAX
|
extern REG_RAX
|
||||||
extern REG_RDI
|
extern REG_RDI
|
||||||
|
|
||||||
|
|
||||||
global insert_xor
|
global insert_xor
|
||||||
insert_xor:
|
insert_xor:
|
||||||
mov rdi, INST_XOR
|
mov rdi, INST_XOR
|
||||||
@ -86,6 +86,24 @@ load_reg_var: ; (rdi: OFF_S, rsi: REG*)
|
|||||||
|
|
||||||
ret
|
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
|
global load_var_reg
|
||||||
load_var_reg: ; (rdi: OFF_S, rsi: REG*)
|
load_var_reg: ; (rdi: OFF_S, rsi: REG*)
|
||||||
push rdi
|
push rdi
|
||||||
@ -237,7 +255,13 @@ sub_rax_var: ; (rdi: OFF_S)
|
|||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
global insert_var
|
insert_const_endl: ; (rdi: const*)
|
||||||
|
push rdi
|
||||||
|
call putendl
|
||||||
|
pop rdi
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
insert_var_endl: ; (rdi: OFF_S)
|
insert_var_endl: ; (rdi: OFF_S)
|
||||||
push rdi
|
push rdi
|
||||||
mov rdi, OPEN_STACK_VAR
|
mov rdi, OPEN_STACK_VAR
|
||||||
|
|||||||
@ -107,9 +107,11 @@ create_expressions: ; rax: exp* (rdi: char *filecontent, rsi: *cnt)
|
|||||||
mov rax, EXPR_SIZE
|
mov rax, EXPR_SIZE
|
||||||
mul rcx
|
mul rcx
|
||||||
lea rdi, [rbx + rax]
|
lea rdi, [rbx + rax]
|
||||||
|
%ifdef DEBUG_BUILD
|
||||||
push rcx
|
push rcx
|
||||||
call print_expression
|
call print_expression
|
||||||
pop rcx
|
pop rcx
|
||||||
|
%endif
|
||||||
inc rcx
|
inc rcx
|
||||||
jmp .expr_loop_print
|
jmp .expr_loop_print
|
||||||
|
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
section .text
|
section .text
|
||||||
|
|
||||||
is_space: ; rax: bool (rdi: c)
|
is_space: ; rax: bool (rdi: c)
|
||||||
cmp c, 8
|
cmp rdi, 8
|
||||||
jl .false
|
jl .false
|
||||||
cmp c, 13
|
cmp rdi, 13
|
||||||
je .false
|
je .false
|
||||||
.true:
|
.true:
|
||||||
mov rax, 1
|
mov rax, 1
|
||||||
|
|||||||
66
src/start.s
66
src/start.s
@ -19,68 +19,24 @@ print_usage:
|
|||||||
call putstr
|
call putstr
|
||||||
|
|
||||||
_start:
|
_start:
|
||||||
|
pop rdi
|
||||||
|
cmp rdi, 2
|
||||||
|
jne err_args
|
||||||
|
mov rdi, [rsp + 8] ; argv[1]
|
||||||
push rbp
|
push rbp
|
||||||
mov rbp, rsp
|
mov rbp, rsp
|
||||||
|
|
||||||
sub rsp, 16
|
sub rsp, 16
|
||||||
|
|
||||||
mov rdi, 1
|
call get_file_content
|
||||||
call vec_create
|
|
||||||
mov rdi, rax
|
mov rdi, rax
|
||||||
|
mov [rbp - 8], rax
|
||||||
|
|
||||||
xor rcx, rcx
|
mov rdi, rax
|
||||||
mov rbx, 90
|
call lex
|
||||||
mov r8, ' '
|
|
||||||
|
|
||||||
.loop:
|
mov rsp, rbp
|
||||||
cmp rcx, rbx
|
pop rbp
|
||||||
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
|
|
||||||
|
|
||||||
done:
|
done:
|
||||||
xor rdi, rdi
|
xor rdi, rdi
|
||||||
|
|||||||
24
test.c
24
test.c
@ -1,24 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
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 ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
x
Reference in New Issue
Block a user