From e5967f5dcc270674a5db8af16beb22c2c31d1bbc Mon Sep 17 00:00:00 2001 From: Victor Vobis Date: Sat, 3 May 2025 20:40:05 +0200 Subject: [PATCH] add vec_pop --- .nfs00000000113621d400000ffd | Bin 32968 -> 0 bytes Makefile | 4 ++-- src/core/mem/memset.s | 14 ++++++++++++ src/core/vector/vec_create.s | 13 +++++++++++ src/core/vector/vec_pop.s | 43 +++++++++++++++++++++++++++++++++++ src/core/vector/vec_push.s | 40 +++++++++++++++++--------------- src/core/vector/vector.inc | 30 ++++++++++++++++++++++++ src/start.s | 8 +++++-- 8 files changed, 130 insertions(+), 22 deletions(-) delete mode 100755 .nfs00000000113621d400000ffd create mode 100644 src/core/mem/memset.s create mode 100644 src/core/vector/vec_pop.s diff --git a/.nfs00000000113621d400000ffd b/.nfs00000000113621d400000ffd deleted file mode 100755 index c7bbbcd1e55fadd33b4e8eb5ad167e0b84223e4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32968 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 Pv|H!8Au}_=X8!*H)LHUf diff --git a/Makefile b/Makefile index 4fb3237..7ce8111 100644 --- a/Makefile +++ b/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 \ diff --git a/src/core/mem/memset.s b/src/core/mem/memset.s new file mode 100644 index 0000000..a625bf0 --- /dev/null +++ b/src/core/mem/memset.s @@ -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 + diff --git a/src/core/vector/vec_create.s b/src/core/vector/vec_create.s index 4b38566..a4438bc 100644 --- a/src/core/vector/vec_create.s +++ b/src/core/vector/vec_create.s @@ -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 diff --git a/src/core/vector/vec_pop.s b/src/core/vector/vec_pop.s new file mode 100644 index 0000000..05d59ce --- /dev/null +++ b/src/core/vector/vec_pop.s @@ -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 diff --git a/src/core/vector/vec_push.s b/src/core/vector/vec_push.s index 9c497a5..a1cd66a 100644 --- a/src/core/vector/vec_push.s +++ b/src/core/vector/vec_push.s @@ -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 diff --git a/src/core/vector/vector.inc b/src/core/vector/vector.inc index 7116ca5..7b23460 100644 --- a/src/core/vector/vector.inc +++ b/src/core/vector/vector.inc @@ -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 diff --git a/src/start.s b/src/start.s index 62856a5..5a1d8e5 100644 --- a/src/start.s +++ b/src/start.s @@ -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