From 83bd3495a11f74ddcd84602dfed817558391327e Mon Sep 17 00:00:00 2001 From: Xamora Date: Wed, 16 Sep 2026 17:45:31 +0200 Subject: [PATCH] cmp cpy write read done; need to manage errno --- Makefile | 4 +- main.c | 153 +++++++++++++++++++++++++++++++++++++++++++++++- main.h | 14 ++++- src/defines.inc | 12 ++++ src/ft_read.s | 12 ++++ src/ft_strcmp.s | 29 +++++++++ src/ft_strcpy.s | 27 +++++++++ src/ft_strdup.s | 7 +++ src/ft_strlen.s | 9 +-- src/ft_write.s | 12 ++++ 10 files changed, 267 insertions(+), 12 deletions(-) create mode 100644 src/defines.inc create mode 100644 src/ft_read.s create mode 100644 src/ft_strcmp.s create mode 100644 src/ft_strcpy.s create mode 100644 src/ft_strdup.s create mode 100644 src/ft_write.s diff --git a/Makefile b/Makefile index f85d629..99a8bbf 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ CC := gcc AS := nasm -ASFLAGS := -g -Wall +ASFLAGS := -g -f elf64 -I src/ CFLAGS := -g -Wall -Wextra -Wno-override-init -std=c2x MAIN := $(wildcard *.c) SRC := $(wildcard src/*.s) @@ -27,7 +27,7 @@ $(OBJ_DIR)/%.o: %.c $(OBJ_DIR)/%.o: %.s @mkdir -p $(@D) - $(AS) $(ASFLAGS) -f elf64 $< -o $@ + $(AS) $(ASFLAGS) $< -o $@ clean: @rm -f $(NAME) diff --git a/main.c b/main.c index bb12edd..4df98e1 100644 --- a/main.c +++ b/main.c @@ -1,7 +1,154 @@ #include "main.h" -int main(void) { - size_t size = ft_strlen("test\n"); - printf("size: %ld\n", size); +void test_strlen(); +void test_strcpy(); +void test_strcmp(); +void test_write(); +void test_read(); +void test_strdup(); +void test_calloc(); + +int +main(void) { + + test_strlen(); + printf("\n"); + test_strcpy(); + printf("\n"); + test_strcmp(); + printf("\n"); + test_write(); + printf("\n"); + test_read(); + printf("\n"); + test_strdup(); + return 0; } + +void +test_strlen() { + // ft_strlen + { + char *test = "test"; + printf("ft_strlen: %ld\n", ft_strlen(test)); + } + // strlen + { + char *test = "test"; + printf("strlen: %ld\n", strlen(test)); + } +} + +void +test_strcpy() { + + // ft_strcpy + { + char src[10] = "src"; + char dst[10] = "dst"; + char *ret; + printf ("src: %s, dest: %s\n", src, dst); + ret = ft_strcpy(dst, src); + printf ("ft_strcpy ret: %s, src: %s, dest: %s\n", ret, src, dst); + printf ("ret: %p, src: %p, dest: %p\n", ret, src, dst); + } + + printf("\n"); + + // strcpy + { + char src[10] = "src"; + char dst[10] = "dst"; + char *ret; + ret = strcpy(dst, src); + printf ("strcpy ret: %s, src: %s, dest: %s\n", ret, src, dst); + printf ("ret: %p, src: %p, dest: %p\n", ret, src, dst); + } +} + +void +test_strcmp() { + + // ft_strcmp + { + char *s1 = "test4"; + char *s2 = "test5"; + printf("ft_strcmp: %d, s1: %s, s2: %s\n", ft_strcmp(s1, s2), s1 , s2); + + s1 = "te"; + s2 = "test"; + printf("ft_strcmp: %d, s1: %s, s2: %s\n", ft_strcmp(s1, s2), s1 , s2); + } + + printf("\n"); + + // strcmp + { + char *s1 = "test4"; + char *s2 = "test5"; + printf("strcmp: %d, s1: %s, s2: %s\n", strcmp(s1, s2), s1 , s2); + + s1 = "te"; + s2 = "test"; + printf("strcmp: %d, s1: %s, s2: %s\n", strcmp(s1, s2), s1 , s2); + } +} + +void +test_write() { + // ft_write + { + printf("ft_write ret: %ld\n", ft_write(1, "test ", 5)); + } + + // write + { + printf("write ret: %ld\n", write(1, "test ", 5)); + } +} + +void +test_read() { + // ft_read + { + char buf[10]; + printf("ft_read ret: %ld\n", ft_read(open("main.c", O_RDONLY), buf, 10)); + printf ("buf: %s\n", buf); + } + + printf("\n"); + + // read + { + char buf[10]; + printf("read ret: %ld\n", read(open("main.c", O_RDONLY), buf, 10)); + printf ("buf: %s\n", buf); + } +} + +void +test_strdup() { + // ft_strdup + { + + } + + // strdup + { + + } +} + +void +test_calloc() { + // ft_calloc + { + + } + + // calloc + { + + } +} diff --git a/main.h b/main.h index 41b0c97..254c864 100644 --- a/main.h +++ b/main.h @@ -1,6 +1,18 @@ #pragma once -#include +#include #include +#include +#include +#include +// DONE extern size_t ft_strlen(const char *s); +extern char *ft_strcpy(char *restrict dst, const char *restrict src); +extern int ft_strcmp(const char *s1, const char *s2); +extern ssize_t ft_write(int fd, const void *buf, size_t count); +extern ssize_t ft_read(int fd, void *buf, size_t count); + +// WIP +extern char *ft_strdup(const char *s); +extern void *ft_calloc(size_t n, size_t size); diff --git a/src/defines.inc b/src/defines.inc new file mode 100644 index 0000000..f79d82d --- /dev/null +++ b/src/defines.inc @@ -0,0 +1,12 @@ +%ifndef DEFINES_INC +%define DEFINES_INC + +%define STDOUT 1 +%define SYS_WRITE 1 +%define SYS_READ 0 +%define SYS_EXIT 60 + +extern ft_strlen +extern ft_strcpy + +%endif diff --git a/src/ft_read.s b/src/ft_read.s new file mode 100644 index 0000000..f48a6a4 --- /dev/null +++ b/src/ft_read.s @@ -0,0 +1,12 @@ +bits 64 + +%include "defines.inc" + +section .text + global ft_read + ft_read: + ; rdi = fd, rsi = buf, rdx = count + mov rax, SYS_READ + syscall + + ret diff --git a/src/ft_strcmp.s b/src/ft_strcmp.s new file mode 100644 index 0000000..8f923e8 --- /dev/null +++ b/src/ft_strcmp.s @@ -0,0 +1,29 @@ +bits 64 + +%include "defines.inc" + +section .text + global ft_strcmp + ft_strcmp: + + mov rax, 0 + loop: + mov cl, [rdi + rax] + mov dl, [rsi + rax] + + inc rax + + cmp cl, 0 + je endloop + + cmp dl, 0 + je endloop + + cmp cl, dl + je loop + endloop: + + sub cl, dl + movsx rax, cl + ret + diff --git a/src/ft_strcpy.s b/src/ft_strcpy.s new file mode 100644 index 0000000..f71f107 --- /dev/null +++ b/src/ft_strcpy.s @@ -0,0 +1,27 @@ +bits 64 + +%include "defines.inc" + +section .text + global ft_strcpy + ; rdi = dst, rsi = src + ft_strcpy: + push rbp + + mov rax, 0 ; counter + mov rcx, 0 + mov rdx, 0 + + loop: + mov dl, [rsi + rax] + mov [rdi + rax], dl ; replace char by char + + inc rax + + cmp dl, 0 + jne loop + + pop rbp + + mov rax, rdi + ret diff --git a/src/ft_strdup.s b/src/ft_strdup.s new file mode 100644 index 0000000..6070c6e --- /dev/null +++ b/src/ft_strdup.s @@ -0,0 +1,7 @@ +bits 64 + +%include "defines.inc" + +section .text + global ft_strdup + ft_strdup: diff --git a/src/ft_strlen.s b/src/ft_strlen.s index f0c6aa7..d5e29e0 100644 --- a/src/ft_strlen.s +++ b/src/ft_strlen.s @@ -1,9 +1,5 @@ bits 64 -%define STDOUT 1 -%define SYS_WRITE 1 -%define SYS_EXIT 60 - section .text global ft_strlen ft_strlen: @@ -13,11 +9,12 @@ section .text ; code mov rbx, rdi - mov rsi, -1 + mov rsi, 0 loop: - inc rsi mov al, [rbx + rsi] + inc rsi + cmp al, 0 jne loop diff --git a/src/ft_write.s b/src/ft_write.s new file mode 100644 index 0000000..860d8a3 --- /dev/null +++ b/src/ft_write.s @@ -0,0 +1,12 @@ +bits 64 + +%include "defines.inc" + +section .text + global ft_write + ft_write: + ; rdi = fd, rsi = buf, rdx = count + mov rax, SYS_WRITE + syscall + + ret