diff --git a/.nfs00000000113621d400000ffd b/.nfs00000000113621d400000ffd deleted file mode 100755 index c7bbbcd..0000000 Binary files a/.nfs00000000113621d400000ffd and /dev/null differ 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