From a0dbd2d509bd412af1441d3874f64501a0943047 Mon Sep 17 00:00:00 2001 From: Lizzy Fleckenstein Date: Sun, 10 Dec 2023 16:57:58 +0100 Subject: replace memory.asm with C --- stage3/memory.asm | 59 ------------------------------------------------------- stage3/memory.c | 42 +++++++++++++++++++++++++++++++++++++++ stage3/memory.h | 9 +++++---- stage3/memory2.c | 22 --------------------- 4 files changed, 47 insertions(+), 85 deletions(-) delete mode 100644 stage3/memory.asm create mode 100644 stage3/memory.c delete mode 100644 stage3/memory2.c (limited to 'stage3') diff --git a/stage3/memory.asm b/stage3/memory.asm deleted file mode 100644 index b4410a3..0000000 --- a/stage3/memory.asm +++ /dev/null @@ -1,59 +0,0 @@ -global memcpy, memmove - -section .text - -memcpy: -.bulk_copy: - cmp rdx, 8 - jl .bytewise_copy - mov rax, qword[rsi] - mov qword[rdi], rax - sub rdx, 8 - add rdi, 8 - add rsi, 8 -.bytewise_copy: - cmp rdx, 0 - je .return - mov al, byte[rsi] - mov byte[rdi], al - dec rdx - inc rdi - inc rsi - jmp .bytewise_copy -.return: - ret - -memmove: - mov rcx, rdx -.bulk_read: - cmp rdx, 8 - jl .bytewise_read - push qword[rsi] - add rsi, 8 - sub rdx, 8 - jmp .bulk_read -.bytewise_read: - cmp rdx, 0 - je .bulk_write - dec rsp - mov al, byte[rsi] - mov byte[rsp], al - inc rsi - dec rdx - jmp .bytewise_read -.bulk_write: - cmp rcx, 8 - jl .bytewise_write - pop qword[rdi] - add rdi, 8 - sub rcx, 8 -.bytewise_write: - cmp rcx, 0 - je .return - mov al, byte[rsp] - mov byte[rdi], al - inc rsp - inc rdi - dec rcx -.return: - ret diff --git a/stage3/memory.c b/stage3/memory.c new file mode 100644 index 0000000..fcf5a28 --- /dev/null +++ b/stage3/memory.c @@ -0,0 +1,42 @@ +#include "heap.h" +#include "memory.h" + +void *memcpy(void *dst, const void *src, usize bytes) +{ + for (usize i = 0; i < bytes; i++) + ((unsigned char *) dst)[i] = ((const unsigned char *) src)[i]; +} + +int memcpy_r(void *dst, const void *src, usize bytes) +{ + for (usize i = bytes; i > 0; i--) + ((unsigned char *) dst)[i-1] = ((const unsigned char *) src)[i-1]; +} + +int memcmp(const void *s1, const void *s2, usize n) +{ + for (usize i = 0; i < n; i++) { + unsigned char c1 = ((const unsigned char *) s1)[i]; + unsigned char c2 = ((const unsigned char *) s2)[i]; + + if (c1 != c2) + return (int) c1 - (int) c2; + } + + return 0; +} + +u8 memsum(const void *ptr, usize size) +{ + u8 sum = 0; + for (usize i = 0; i < size; i++) + sum += ((const u8 *) ptr)[i]; + return sum; +} + +void *memset(void *ptr, int value, usize size) +{ + for (usize i = 0; i < size; i++) + ((unsigned char *) ptr)[i] = value; + return ptr; +} diff --git a/stage3/memory.h b/stage3/memory.h index 774d596..56de49d 100644 --- a/stage3/memory.h +++ b/stage3/memory.h @@ -3,9 +3,10 @@ #include "def.h" -void memcpy(void *dst, const void *src, usize bytes); // memory.asm -void memmove(void *dst, const void *src, usize bytes); // memory.asm -int memcmp(const void *s1, const void *s2, usize n); // memory2.c -u8 memsum(const void *ptr, usize size); // memory2.c +void *memcpy(void *dst, const void *src, usize bytes); +int memcpy_r(void *dst, const void *src, usize bytes); +int memcmp(const void *s1, const void *s2, usize n); +u8 memsum(const void *ptr, usize size); +void *memset(void *s, int c, usize n); #endif diff --git a/stage3/memory2.c b/stage3/memory2.c deleted file mode 100644 index cca3cb1..0000000 --- a/stage3/memory2.c +++ /dev/null @@ -1,22 +0,0 @@ -#include "memory.h" - -int memcmp(const void *s1, const void *s2, usize n) -{ - for (usize i = 0; i < n; i++) { - unsigned char c1 = ((const unsigned char *) s1)[i]; - unsigned char c2 = ((const unsigned char *) s2)[i]; - - if (c1 != c2) - return (int) c1 - (int) c2; - } - - return 0; -} - -u8 memsum(const void *ptr, usize size) -{ - u8 sum = 0; - for (usize i = 0; i < size; i++) - sum += ((const u8 *) ptr)[i]; - return sum; -} -- cgit v1.2.3