add vec_pop

This commit is contained in:
Victor Vobis 2025-05-03 20:40:05 +02:00
parent c682f57427
commit e5967f5dcc
8 changed files with 130 additions and 22 deletions

Binary file not shown.

View File

@ -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
View 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

View File

@ -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
View 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

View File

@ -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

View File

@ -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

View File

@ -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