added simple string_builder
This commit is contained in:
parent
30fb9231d8
commit
390dd10dca
2
Makefile
2
Makefile
@ -120,7 +120,7 @@ GLOBALSRC := $(addprefix $(GLOBALDIR)/, $(addsuffix .s, \
|
|||||||
))
|
))
|
||||||
|
|
||||||
SBSRC := $(addprefix $(SBDIR)/, $(addsuffix .s, \
|
SBSRC := $(addprefix $(SBDIR)/, $(addsuffix .s, \
|
||||||
string_builder\
|
string_builder sb_append \
|
||||||
))
|
))
|
||||||
|
|
||||||
# Collect all sources and objects
|
# Collect all sources and objects
|
||||||
|
|||||||
BIN
lib/core.a
BIN
lib/core.a
Binary file not shown.
@ -2,15 +2,17 @@
|
|||||||
|
|
||||||
section .text
|
section .text
|
||||||
extern strlen
|
extern strlen
|
||||||
extern strcpy
|
extern memcpy
|
||||||
extern malloc
|
extern malloc
|
||||||
extern err_malloc
|
extern err_malloc
|
||||||
|
|
||||||
%define SB [rbp - 16]
|
%define SB [rbp - 16]
|
||||||
%define SB_LEN [rbp - 4]
|
%define SB_LEN dword [rbp - 4]
|
||||||
%define SB_CAP [rbp - 8]
|
%define SB_CAP dword [rbp - 8]
|
||||||
%define APPENDIX [rbp - 24]
|
%define APPENDIX [rbp - 24]
|
||||||
|
%define APP_LEN dword [rbp - 28]
|
||||||
|
|
||||||
|
global sb_append
|
||||||
sb_append: ; (rdi: *sb, rsi: char*)
|
sb_append: ; (rdi: *sb, rsi: char*)
|
||||||
push rbp
|
push rbp
|
||||||
mov rbp, rsp
|
mov rbp, rsp
|
||||||
@ -26,26 +28,28 @@ sb_append: ; (rdi: *sb, rsi: char*)
|
|||||||
|
|
||||||
; get sb len
|
; get sb len
|
||||||
mov eax, dword [rdi + STR_LEN]
|
mov eax, dword [rdi + STR_LEN]
|
||||||
mov dword SB_LEN, eax
|
mov SB_LEN, eax
|
||||||
|
|
||||||
mov eax, dword [rdi + STR_CAP]
|
mov eax, dword [rdi + STR_CAP]
|
||||||
mov dword SB_CAP, eax
|
mov SB_CAP, eax
|
||||||
|
|
||||||
push rdi
|
push rdi
|
||||||
mov rdi, rsi
|
mov rdi, rsi
|
||||||
call strlen
|
call strlen
|
||||||
|
|
||||||
add rax, SB_LEN
|
mov APP_LEN, eax
|
||||||
cmp rax, SB_CAP
|
|
||||||
|
add eax, SB_LEN
|
||||||
|
cmp eax, SB_CAP
|
||||||
jl .copy_string
|
jl .copy_string
|
||||||
|
|
||||||
mov r9, SB_CAP
|
mov r9d, SB_CAP
|
||||||
; new string will be to large for current cap, need to realloc
|
; new string will be to large for current cap, need to realloc
|
||||||
.get_new_len:
|
.get_new_len:
|
||||||
imul r9, 2
|
imul r9, 2
|
||||||
cmp r9, rax
|
cmp r9, rax
|
||||||
jl .get_new_len
|
jl .get_new_len
|
||||||
mov SB_CAP, r9
|
mov SB_CAP, r9d
|
||||||
push r9
|
push r9
|
||||||
push rax
|
push rax
|
||||||
mov rdi, r9
|
mov rdi, r9
|
||||||
@ -55,11 +59,12 @@ sb_append: ; (rdi: *sb, rsi: char*)
|
|||||||
mov rdi, rax
|
mov rdi, rax
|
||||||
mov rsi, SB
|
mov rsi, SB
|
||||||
mov rsi, [rsi + STR_DATA]
|
mov rsi, [rsi + STR_DATA]
|
||||||
call strcpy
|
mov edx, SB_LEN
|
||||||
|
call memcpy
|
||||||
pop rax
|
pop rax
|
||||||
mov rsi, SB
|
mov rsi, SB
|
||||||
pop r9
|
pop r9
|
||||||
mov [SB + STR_CAP], r9
|
mov [rsi + STR_CAP], r9
|
||||||
|
|
||||||
.copy_string:
|
.copy_string:
|
||||||
pop rdi
|
pop rdi
|
||||||
@ -67,9 +72,10 @@ sb_append: ; (rdi: *sb, rsi: char*)
|
|||||||
mov dword [r9 + STR_LEN], eax
|
mov dword [r9 + STR_LEN], eax
|
||||||
mov rdi, [r9 + STR_DATA]
|
mov rdi, [r9 + STR_DATA]
|
||||||
mov eax, dword [rbp - 4]
|
mov eax, dword [rbp - 4]
|
||||||
lea rdi, [rdi + eax]
|
lea rdi, [rdi + rax]
|
||||||
mov rsi, [rbp - 24]
|
mov rsi, APPENDIX
|
||||||
call strcpy
|
mov edx, APP_LEN
|
||||||
|
call memcpy
|
||||||
|
|
||||||
.done:
|
.done:
|
||||||
mov rsp, rbp
|
mov rsp, rbp
|
||||||
@ -10,7 +10,6 @@ section .text
|
|||||||
global sb_new
|
global sb_new
|
||||||
sb_new: ; rax: str*(rdi: char* || NULL, rsi: *hidden_copy_ptr)
|
sb_new: ; rax: str*(rdi: char* || NULL, rsi: *hidden_copy_ptr)
|
||||||
push rbx
|
push rbx
|
||||||
push rdi
|
|
||||||
push rsi
|
push rsi
|
||||||
|
|
||||||
mov rbx, STRING_INIT_CAP
|
mov rbx, STRING_INIT_CAP
|
||||||
@ -31,7 +30,6 @@ sb_new: ; rax: str*(rdi: char* || NULL, rsi: *hidden_copy_ptr)
|
|||||||
cmp r9, rbx
|
cmp r9, rbx
|
||||||
jg .calc_init_len
|
jg .calc_init_len
|
||||||
|
|
||||||
|
|
||||||
.alloc_string:
|
.alloc_string:
|
||||||
push rdi
|
push rdi
|
||||||
mov rdi, rbx
|
mov rdi, rbx
|
||||||
@ -46,9 +44,10 @@ sb_new: ; rax: str*(rdi: char* || NULL, rsi: *hidden_copy_ptr)
|
|||||||
mov [rsi + STR_DATA], rax
|
mov [rsi + STR_DATA], rax
|
||||||
test r9, r9
|
test r9, r9
|
||||||
jz .done
|
jz .done
|
||||||
|
push rdi
|
||||||
mov rdi, rax
|
mov rdi, rax
|
||||||
mov rdx, r9
|
|
||||||
pop rsi
|
pop rsi
|
||||||
|
mov rdx, r9
|
||||||
call memcpy
|
call memcpy
|
||||||
|
|
||||||
.done:
|
.done:
|
||||||
|
|||||||
24
src/start.s
24
src/start.s
@ -1,5 +1,8 @@
|
|||||||
|
%include "./src/core/string_builder/sb.s"
|
||||||
|
|
||||||
section .data
|
section .data
|
||||||
usage: db "Usage: ./debug <file>.lang", 0xa, 0
|
usage: db "Usage: ./debug <file>.lang", 0xa, 0
|
||||||
|
example_data: db "Do you know Ligma?"
|
||||||
|
|
||||||
section .text
|
section .text
|
||||||
global _start
|
global _start
|
||||||
@ -14,6 +17,7 @@ section .text
|
|||||||
extern putchar
|
extern putchar
|
||||||
extern vec_pop
|
extern vec_pop
|
||||||
extern sb_new
|
extern sb_new
|
||||||
|
extern sb_append
|
||||||
|
|
||||||
print_usage:
|
print_usage:
|
||||||
mov rdi, usage
|
mov rdi, usage
|
||||||
@ -25,9 +29,17 @@ _start:
|
|||||||
mov rbp, rsp
|
mov rbp, rsp
|
||||||
sub rsp, 16
|
sub rsp, 16
|
||||||
mov rdi, usage
|
mov rdi, usage
|
||||||
lea rsi, [rsp - 16]
|
lea rsi, [rbp - 16]
|
||||||
call sb_new
|
call sb_new
|
||||||
|
|
||||||
|
mov rdi, [rbp - 16 + STR_DATA]
|
||||||
|
call putstr
|
||||||
|
lea rdi, [rbp - 16]
|
||||||
|
mov rsi, example_data
|
||||||
|
call sb_append
|
||||||
|
mov rdi, [rbp - 16 + STR_DATA]
|
||||||
|
call putstr
|
||||||
|
|
||||||
; pop rdi
|
; pop rdi
|
||||||
; cmp rdi, 2
|
; cmp rdi, 2
|
||||||
; jne err_args
|
; jne err_args
|
||||||
@ -44,9 +56,9 @@ _start:
|
|||||||
; mov rdi, rax
|
; mov rdi, rax
|
||||||
; call lex
|
; call lex
|
||||||
;
|
;
|
||||||
; mov rsp, rbp
|
mov rsp, rbp
|
||||||
; pop rbp
|
pop rbp
|
||||||
;
|
|
||||||
done:
|
done:
|
||||||
; xor rdi, rdi
|
xor rdi, rdi
|
||||||
; call exit
|
call exit
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user