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 \
|
strlen split strcpy substr is_num strcmp is_alpha \
|
||||||
))
|
))
|
||||||
MEMSRC := $(addprefix $(MEMDIR)/, $(addsuffix .s, \
|
MEMSRC := $(addprefix $(MEMDIR)/, $(addsuffix .s, \
|
||||||
malloc memchr memcpy \
|
malloc memchr memcpy memset \
|
||||||
))
|
))
|
||||||
VECSRC := $(addprefix $(VECDIR)/, $(addsuffix .s, \
|
VECSRC := $(addprefix $(VECDIR)/, $(addsuffix .s, \
|
||||||
vec_create vec_push vec_get\
|
vec_create vec_push vec_get vec_pop \
|
||||||
))
|
))
|
||||||
PRINTSRC := $(addprefix $(PRINTDIR)/, $(addsuffix .s, \
|
PRINTSRC := $(addprefix $(PRINTDIR)/, $(addsuffix .s, \
|
||||||
print putnumber \
|
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 malloc
|
||||||
extern err_malloc
|
extern err_malloc
|
||||||
extern memcpy
|
extern memcpy
|
||||||
|
extern memset
|
||||||
|
|
||||||
global vec_create
|
global vec_create
|
||||||
vec_create: ; rax: vec* (rdi: member_size)
|
vec_create: ; rax: vec* (rdi: member_size)
|
||||||
@ -18,6 +19,11 @@ vec_create: ; rax: vec* (rdi: member_size)
|
|||||||
test rax, rax
|
test rax, rax
|
||||||
jz err_malloc
|
jz err_malloc
|
||||||
|
|
||||||
|
mov rdi, rax
|
||||||
|
mov rsi, 0
|
||||||
|
mov rdx, VEC_SIZE
|
||||||
|
call memset
|
||||||
|
|
||||||
pop rdi
|
pop rdi
|
||||||
mov [rbp - 8], rax ; store vec
|
mov [rbp - 8], rax ; store vec
|
||||||
mov dword [rax + VEC_COUNT], 0
|
mov dword [rax + VEC_COUNT], 0
|
||||||
@ -26,10 +32,17 @@ vec_create: ; rax: vec* (rdi: member_size)
|
|||||||
|
|
||||||
; allocate initial vector capacity
|
; allocate initial vector capacity
|
||||||
imul rdi, VEC_DEFAULT_CAP
|
imul rdi, VEC_DEFAULT_CAP
|
||||||
|
push rdi
|
||||||
call malloc
|
call malloc
|
||||||
test rax, rax
|
test rax, rax
|
||||||
jz err_malloc
|
jz err_malloc
|
||||||
|
|
||||||
|
pop rdi
|
||||||
|
mov rdx, rdi
|
||||||
|
mov rdi, rax
|
||||||
|
mov rsi, 0
|
||||||
|
call memset
|
||||||
|
|
||||||
mov rdi, [rbp - 8]
|
mov rdi, [rbp - 8]
|
||||||
mov [rdi + VEC_MEM], rax
|
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 err_malloc
|
||||||
extern memcpy
|
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
|
global vec_push
|
||||||
vec_push: ; (rdi: vec*, rsi: mem*)
|
vec_push: ; (rdi: vec*, rsi: mem*)
|
||||||
push rbp
|
push rbp
|
||||||
mov rbp, rsp
|
mov rbp, rsp
|
||||||
sub rsp, 48
|
sub rsp, 48
|
||||||
|
|
||||||
mov eax, dword [rdi + VEC_COUNT]
|
mov eax, [rdi + VEC_COUNT]
|
||||||
mov dword [rbp - 4], eax
|
mov vec_count, eax
|
||||||
mov eax, dword [rdi + VEC_CAP]
|
mov eax, [rdi + VEC_CAP]
|
||||||
mov dword [rbp - 8], eax
|
mov vec_cap, eax
|
||||||
mov eax, dword [rdi + VEC_MEMBER_SIZE]
|
mov eax, [rdi + VEC_MEMBER_SIZE]
|
||||||
mov dword [rbp - 12], eax
|
mov vec_member_size, eax
|
||||||
|
|
||||||
mov [rbp - 24], rdi ; store vec
|
|
||||||
mov rax, [rdi + VEC_MEM]
|
mov rax, [rdi + VEC_MEM]
|
||||||
mov [rbp - 32], rax
|
mov vec_mem, rax
|
||||||
|
mov [rbp - 32], rdi ; store vec
|
||||||
|
|
||||||
mov [rbp - 40], rsi
|
mov [rbp - 40], rsi
|
||||||
|
|
||||||
mov eax, dword [rbp - 4]
|
mov eax, vec_count
|
||||||
cmp eax, dword [rbp - 8]
|
cmp eax, vec_cap
|
||||||
je .reallocate
|
je .reallocate
|
||||||
.push:
|
.push:
|
||||||
|
|
||||||
mov rsi, [rbp - 40]
|
mov rsi, [rbp - 40]
|
||||||
mov rdi, [rbp - 24]
|
mov rdi, [rbp - 32]
|
||||||
mov eax, dword [rdi + VEC_MEMBER_SIZE]
|
mov eax, dword [rdi + VEC_MEMBER_SIZE]
|
||||||
imul eax, dword [rbp - 4]
|
imul eax, vec_count
|
||||||
mov rdi, [rdi + VEC_MEM]
|
mov rdi, [rdi + VEC_MEM]
|
||||||
add rdi, rax
|
add rdi, rax
|
||||||
|
|
||||||
mov edx, dword [rbp - 12]
|
mov edx, vec_member_size
|
||||||
call memcpy
|
call memcpy
|
||||||
mov rdi, [rbp - 24]
|
mov rdi, [rbp - 32]
|
||||||
inc dword [rdi + VEC_COUNT]
|
inc dword [rdi + VEC_COUNT]
|
||||||
|
|
||||||
.done:
|
.done:
|
||||||
@ -55,11 +59,11 @@ vec_push: ; (rdi: vec*, rsi: mem*)
|
|||||||
jz err_malloc
|
jz err_malloc
|
||||||
|
|
||||||
mov rdi, rax
|
mov rdi, rax
|
||||||
mov rsi, [rbp - 32]
|
mov rsi, vec_mem
|
||||||
mov edx, dword [rbp - 4]
|
mov edx, vec_count
|
||||||
call memcpy
|
call memcpy
|
||||||
pop rax
|
pop rax
|
||||||
mov rdx, [rbp - 24]
|
mov rdx, [rbp - 32]
|
||||||
mov [rdx + VEC_MEM], rdi
|
mov [rdx + VEC_MEM], rdi
|
||||||
mov dword [rdx + VEC_CAP], eax
|
mov dword [rdx + VEC_CAP], eax
|
||||||
jmp .push
|
jmp .push
|
||||||
|
|||||||
@ -6,6 +6,36 @@
|
|||||||
%define VEC_MEMBER_SIZE 8
|
%define VEC_MEMBER_SIZE 8
|
||||||
%define VEC_MEM 16
|
%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
|
; struct vec
|
||||||
; .count 0
|
; .count 0
|
||||||
; .cap 4
|
; .cap 4
|
||||||
|
|||||||
@ -12,6 +12,7 @@ section .text
|
|||||||
extern vec_push
|
extern vec_push
|
||||||
extern vec_get
|
extern vec_get
|
||||||
extern putchar
|
extern putchar
|
||||||
|
extern vec_pop
|
||||||
|
|
||||||
print_usage:
|
print_usage:
|
||||||
mov rdi, usage
|
mov rdi, usage
|
||||||
@ -27,7 +28,7 @@ _start:
|
|||||||
mov rdi, rax
|
mov rdi, rax
|
||||||
|
|
||||||
xor rcx, rcx
|
xor rcx, rcx
|
||||||
mov rbx, 95
|
mov rbx, 90
|
||||||
mov r8, ' '
|
mov r8, ' '
|
||||||
|
|
||||||
.loop:
|
.loop:
|
||||||
@ -46,12 +47,15 @@ _start:
|
|||||||
inc rcx
|
inc rcx
|
||||||
jmp .loop
|
jmp .loop
|
||||||
.done:
|
.done:
|
||||||
|
push rdi
|
||||||
|
call vec_pop
|
||||||
|
pop rdi
|
||||||
push rdi
|
push rdi
|
||||||
mov rdi, [rdi + 16]
|
mov rdi, [rdi + 16]
|
||||||
call putstr
|
call putstr
|
||||||
pop rdi
|
pop rdi
|
||||||
lea rsi, [rbp - 1]
|
lea rsi, [rbp - 1]
|
||||||
mov rdx, 94
|
mov rdx, 88
|
||||||
call vec_get
|
call vec_get
|
||||||
test rax, rax
|
test rax, rax
|
||||||
jz done
|
jz done
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user