add vec_pop
This commit is contained in:
parent
c682f57427
commit
e5967f5dcc
Binary file not shown.
4
Makefile
4
Makefile
@ -22,10 +22,10 @@ STRSRC := $(addprefix $(STRDIR)/, $(addsuffix .s, \
|
||||
strlen split strcpy substr is_num strcmp is_alpha \
|
||||
))
|
||||
MEMSRC := $(addprefix $(MEMDIR)/, $(addsuffix .s, \
|
||||
malloc memchr memcpy \
|
||||
malloc memchr memcpy memset \
|
||||
))
|
||||
VECSRC := $(addprefix $(VECDIR)/, $(addsuffix .s, \
|
||||
vec_create vec_push vec_get\
|
||||
vec_create vec_push vec_get vec_pop \
|
||||
))
|
||||
PRINTSRC := $(addprefix $(PRINTDIR)/, $(addsuffix .s, \
|
||||
print putnumber \
|
||||
|
||||
14
src/core/mem/memset.s
Normal file
14
src/core/mem/memset.s
Normal file
@ -0,0 +1,14 @@
|
||||
section .text
|
||||
|
||||
global memset
|
||||
memset: ; (rdi: mem*, rsi: c, rdx: n)
|
||||
xor rcx, rcx
|
||||
.loop:
|
||||
cmp rcx, rdx
|
||||
je .done
|
||||
mov byte [rdi + rcx], sil
|
||||
inc rcx
|
||||
jmp .loop
|
||||
.done:
|
||||
ret
|
||||
|
||||
@ -4,6 +4,7 @@ section .text
|
||||
extern malloc
|
||||
extern err_malloc
|
||||
extern memcpy
|
||||
extern memset
|
||||
|
||||
global vec_create
|
||||
vec_create: ; rax: vec* (rdi: member_size)
|
||||
@ -18,6 +19,11 @@ vec_create: ; rax: vec* (rdi: member_size)
|
||||
test rax, rax
|
||||
jz err_malloc
|
||||
|
||||
mov rdi, rax
|
||||
mov rsi, 0
|
||||
mov rdx, VEC_SIZE
|
||||
call memset
|
||||
|
||||
pop rdi
|
||||
mov [rbp - 8], rax ; store vec
|
||||
mov dword [rax + VEC_COUNT], 0
|
||||
@ -26,10 +32,17 @@ vec_create: ; rax: vec* (rdi: member_size)
|
||||
|
||||
; allocate initial vector capacity
|
||||
imul rdi, VEC_DEFAULT_CAP
|
||||
push rdi
|
||||
call malloc
|
||||
test rax, rax
|
||||
jz err_malloc
|
||||
|
||||
pop rdi
|
||||
mov rdx, rdi
|
||||
mov rdi, rax
|
||||
mov rsi, 0
|
||||
call memset
|
||||
|
||||
mov rdi, [rbp - 8]
|
||||
mov [rdi + VEC_MEM], rax
|
||||
|
||||
|
||||
43
src/core/vector/vec_pop.s
Normal file
43
src/core/vector/vec_pop.s
Normal file
@ -0,0 +1,43 @@
|
||||
%include "./src/core/vector/vector.inc"
|
||||
|
||||
section .text
|
||||
extern memset
|
||||
|
||||
%define vec_count dword [rbp - 4]
|
||||
%define vec_cap dword [rbp - 8]
|
||||
%define vec_member_size dword [rbp - 12]
|
||||
%define vec_mem [rbp - 20]
|
||||
|
||||
global vec_pop
|
||||
vec_pop: ; rax: bool (rdi: vec*)
|
||||
push rbp
|
||||
mov rbp, rsp
|
||||
sub rsp, 32
|
||||
push rbx
|
||||
|
||||
mov eax, dword [rdi + VEC_COUNT]
|
||||
mov vec_count, eax
|
||||
mov eax, dword [rdi + VEC_MEMBER_SIZE]
|
||||
mov vec_member_size, eax
|
||||
mov rax, qword [rdi + VEC_MEM]
|
||||
mov vec_mem, rax
|
||||
|
||||
push rdi
|
||||
|
||||
mov ebx, vec_member_size
|
||||
imul ebx, vec_count
|
||||
sub ebx, vec_member_size
|
||||
|
||||
mov rdi, vec_mem
|
||||
add rdi, rbx
|
||||
mov rsi, 0
|
||||
mov edx, vec_member_size
|
||||
call memset
|
||||
|
||||
pop rdi
|
||||
dec dword [rdi + VEC_COUNT]
|
||||
|
||||
pop rbx
|
||||
mov rsp, rbp
|
||||
pop rbp
|
||||
ret
|
||||
@ -5,40 +5,44 @@ section .text
|
||||
extern err_malloc
|
||||
extern memcpy
|
||||
|
||||
%define vec_count dword [rbp - 4]
|
||||
%define vec_cap dword [rbp - 8]
|
||||
%define vec_member_size dword [rbp - 12]
|
||||
%define vec_mem [rbp - 20]
|
||||
|
||||
global vec_push
|
||||
vec_push: ; (rdi: vec*, rsi: mem*)
|
||||
push rbp
|
||||
mov rbp, rsp
|
||||
sub rsp, 48
|
||||
|
||||
mov eax, dword [rdi + VEC_COUNT]
|
||||
mov dword [rbp - 4], eax
|
||||
mov eax, dword [rdi + VEC_CAP]
|
||||
mov dword [rbp - 8], eax
|
||||
mov eax, dword [rdi + VEC_MEMBER_SIZE]
|
||||
mov dword [rbp - 12], eax
|
||||
|
||||
mov [rbp - 24], rdi ; store vec
|
||||
mov eax, [rdi + VEC_COUNT]
|
||||
mov vec_count, eax
|
||||
mov eax, [rdi + VEC_CAP]
|
||||
mov vec_cap, eax
|
||||
mov eax, [rdi + VEC_MEMBER_SIZE]
|
||||
mov vec_member_size, eax
|
||||
mov rax, [rdi + VEC_MEM]
|
||||
mov [rbp - 32], rax
|
||||
mov vec_mem, rax
|
||||
mov [rbp - 32], rdi ; store vec
|
||||
|
||||
mov [rbp - 40], rsi
|
||||
|
||||
mov eax, dword [rbp - 4]
|
||||
cmp eax, dword [rbp - 8]
|
||||
mov eax, vec_count
|
||||
cmp eax, vec_cap
|
||||
je .reallocate
|
||||
.push:
|
||||
|
||||
mov rsi, [rbp - 40]
|
||||
mov rdi, [rbp - 24]
|
||||
mov rdi, [rbp - 32]
|
||||
mov eax, dword [rdi + VEC_MEMBER_SIZE]
|
||||
imul eax, dword [rbp - 4]
|
||||
imul eax, vec_count
|
||||
mov rdi, [rdi + VEC_MEM]
|
||||
add rdi, rax
|
||||
|
||||
mov edx, dword [rbp - 12]
|
||||
mov edx, vec_member_size
|
||||
call memcpy
|
||||
mov rdi, [rbp - 24]
|
||||
mov rdi, [rbp - 32]
|
||||
inc dword [rdi + VEC_COUNT]
|
||||
|
||||
.done:
|
||||
@ -55,11 +59,11 @@ vec_push: ; (rdi: vec*, rsi: mem*)
|
||||
jz err_malloc
|
||||
|
||||
mov rdi, rax
|
||||
mov rsi, [rbp - 32]
|
||||
mov edx, dword [rbp - 4]
|
||||
mov rsi, vec_mem
|
||||
mov edx, vec_count
|
||||
call memcpy
|
||||
pop rax
|
||||
mov rdx, [rbp - 24]
|
||||
mov rdx, [rbp - 32]
|
||||
mov [rdx + VEC_MEM], rdi
|
||||
mov dword [rdx + VEC_CAP], eax
|
||||
jmp .push
|
||||
|
||||
@ -6,6 +6,36 @@
|
||||
%define VEC_MEMBER_SIZE 8
|
||||
%define VEC_MEM 16
|
||||
|
||||
|
||||
; for all macros,
|
||||
; arg1 should be the target reg,
|
||||
; arg2 is the offset on the stack for vec_count
|
||||
|
||||
%macro vec_cap 2
|
||||
mov %1, [rbp - (%2 + 8)]
|
||||
%endmacro
|
||||
|
||||
%macro vec_member_size 1
|
||||
[rbp - (%1 + 12)]
|
||||
%endmacro
|
||||
|
||||
%macro vec_mem 2
|
||||
mov %1, [rbp - (%2 + 20)]
|
||||
%endmacro
|
||||
|
||||
%macro vec_onto_stack 2
|
||||
|
||||
mov eax, dword [%1 + VEC_COUNT]
|
||||
mov dword [rbp - (%2 + 4)], eax
|
||||
mov eax, dword [%1 + VEC_CAP]
|
||||
mov dword [rbp - (%2 + 8)], eax
|
||||
mov eax, dword [%1 + VEC_MEMBER_SIZE]
|
||||
mov dword [rbp - (%2 + 12)], eax
|
||||
mov rax, [%1 + VEC_MEM]
|
||||
mov [rbp - (%2 + 20)], rax
|
||||
|
||||
%endmacro
|
||||
|
||||
; struct vec
|
||||
; .count 0
|
||||
; .cap 4
|
||||
|
||||
@ -12,6 +12,7 @@ section .text
|
||||
extern vec_push
|
||||
extern vec_get
|
||||
extern putchar
|
||||
extern vec_pop
|
||||
|
||||
print_usage:
|
||||
mov rdi, usage
|
||||
@ -27,7 +28,7 @@ _start:
|
||||
mov rdi, rax
|
||||
|
||||
xor rcx, rcx
|
||||
mov rbx, 95
|
||||
mov rbx, 90
|
||||
mov r8, ' '
|
||||
|
||||
.loop:
|
||||
@ -46,12 +47,15 @@ _start:
|
||||
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, 94
|
||||
mov rdx, 88
|
||||
call vec_get
|
||||
test rax, rax
|
||||
jz done
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user