cmp cpy write read done; need to manage errno

This commit is contained in:
Xamora 2026-09-16 17:45:31 +02:00
parent d5ec65bbcd
commit 83bd3495a1
10 changed files with 267 additions and 12 deletions

View file

@ -1,6 +1,6 @@
CC := gcc CC := gcc
AS := nasm AS := nasm
ASFLAGS := -g -Wall ASFLAGS := -g -f elf64 -I src/
CFLAGS := -g -Wall -Wextra -Wno-override-init -std=c2x CFLAGS := -g -Wall -Wextra -Wno-override-init -std=c2x
MAIN := $(wildcard *.c) MAIN := $(wildcard *.c)
SRC := $(wildcard src/*.s) SRC := $(wildcard src/*.s)
@ -27,7 +27,7 @@ $(OBJ_DIR)/%.o: %.c
$(OBJ_DIR)/%.o: %.s $(OBJ_DIR)/%.o: %.s
@mkdir -p $(@D) @mkdir -p $(@D)
$(AS) $(ASFLAGS) -f elf64 $< -o $@ $(AS) $(ASFLAGS) $< -o $@
clean: clean:
@rm -f $(NAME) @rm -f $(NAME)

153
main.c
View file

@ -1,7 +1,154 @@
#include "main.h" #include "main.h"
int main(void) { void test_strlen();
size_t size = ft_strlen("test\n"); void test_strcpy();
printf("size: %ld\n", size); 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; 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
{
}
}

14
main.h
View file

@ -1,6 +1,18 @@
#pragma once #pragma once
#include <string.h> #include <sys/types.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
// DONE
extern size_t ft_strlen(const char *s); 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);

12
src/defines.inc Normal file
View file

@ -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

12
src/ft_read.s Normal file
View file

@ -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

29
src/ft_strcmp.s Normal file
View file

@ -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

27
src/ft_strcpy.s Normal file
View file

@ -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

7
src/ft_strdup.s Normal file
View file

@ -0,0 +1,7 @@
bits 64
%include "defines.inc"
section .text
global ft_strdup
ft_strdup:

View file

@ -1,9 +1,5 @@
bits 64 bits 64
%define STDOUT 1
%define SYS_WRITE 1
%define SYS_EXIT 60
section .text section .text
global ft_strlen global ft_strlen
ft_strlen: ft_strlen:
@ -13,11 +9,12 @@ section .text
; code ; code
mov rbx, rdi mov rbx, rdi
mov rsi, -1 mov rsi, 0
loop: loop:
inc rsi
mov al, [rbx + rsi] mov al, [rbx + rsi]
inc rsi
cmp al, 0 cmp al, 0
jne loop jne loop

12
src/ft_write.s Normal file
View file

@ -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