Finish mandatory

This commit is contained in:
Xamora 2026-09-20 01:37:16 +02:00
parent 83bd3495a1
commit 4ef28d1ce9
11 changed files with 148 additions and 19 deletions

View file

@ -1,7 +1,7 @@
CC := gcc CC := gcc
AS := nasm AS := nasm
ASFLAGS := -g -f elf64 -I src/ ASFLAGS := -g -f elf64 -I src/
CFLAGS := -g -Wall -Wextra -Wno-override-init -std=c2x CFLAGS := -g -Wall -Wextra -Wno-override-init -std=c2x -fPIC -fPIE
MAIN := $(wildcard *.c) MAIN := $(wildcard *.c)
SRC := $(wildcard src/*.s) SRC := $(wildcard src/*.s)
OBJ_DIR := build OBJ_DIR := build
@ -12,7 +12,7 @@ NAME := main
LIB_NAME:= asm LIB_NAME:= asm
LD := $(CC) LD := $(CC)
LDFLAGS := -L$(OBJ_DIR) -l$(LIB_NAME) LDFLAGS := -L$(OBJ_DIR) -l$(LIB_NAME) -fPIC -fPIE
all: $(NAME) all: $(NAME)

62
main.c
View file

@ -22,6 +22,8 @@ main(void) {
test_read(); test_read();
printf("\n"); printf("\n");
test_strdup(); test_strdup();
printf("\n");
test_calloc();
return 0; return 0;
} }
@ -99,12 +101,22 @@ void
test_write() { test_write() {
// ft_write // ft_write
{ {
printf("ft_write ret: %ld\n", ft_write(1, "test ", 5)); printf("ft_write ret: %ld\n", ft_write(1, "test ", 5));
size_t error = ft_write(-1, "test ", 5);
printf("ft_write error: %ld\n", error);
printf("ERRNO_%d: %s\n", errno, strerror(errno));
} }
printf("\n");
// write // write
{ {
printf("write ret: %ld\n", write(1, "test ", 5)); printf("write ret: %ld\n", write(1, "test ", 5));
size_t error = write(-1, "test ", 5);
printf("write error: %ld\n", error);
printf("ERRNO_%d: %s\n", errno, strerror(errno));
} }
} }
@ -115,6 +127,9 @@ test_read() {
char buf[10]; char buf[10];
printf("ft_read ret: %ld\n", ft_read(open("main.c", O_RDONLY), buf, 10)); printf("ft_read ret: %ld\n", ft_read(open("main.c", O_RDONLY), buf, 10));
printf ("buf: %s\n", buf); printf ("buf: %s\n", buf);
size_t error = ft_read(open("test", O_RDWR), buf, 10);
printf("ft_read error: %ld\n", error);
printf("ERRNO_%d: %s\n", errno, strerror(errno));
} }
printf("\n"); printf("\n");
@ -124,6 +139,9 @@ test_read() {
char buf[10]; char buf[10];
printf("read ret: %ld\n", read(open("main.c", O_RDONLY), buf, 10)); printf("read ret: %ld\n", read(open("main.c", O_RDONLY), buf, 10));
printf ("buf: %s\n", buf); printf ("buf: %s\n", buf);
size_t error = read(open("test", O_RDWR), buf, 10);
printf("read error: %ld\n", error);
printf("ERRNO_%d: %s\n", errno, strerror(errno));
} }
} }
@ -131,12 +149,27 @@ void
test_strdup() { test_strdup() {
// ft_strdup // ft_strdup
{ {
char *buf = malloc(10);
strcpy(buf, "test");
char *dup = ft_strdup(buf);
printf("ft_strdup buf: %s_%p, dup: %s_%p\n", buf, buf, dup, dup);
free(buf);
free(dup);
} }
// strdup // strdup
{ {
char *buf = malloc(10);
strcpy(buf, "test");
char *dup = strdup(buf);
printf("strdup buf: %s_%p, dup: %s_%p\n", buf, buf, dup, dup);
free(buf);
free(dup);
} }
} }
@ -144,11 +177,40 @@ void
test_calloc() { test_calloc() {
// ft_calloc // ft_calloc
{ {
printf("ft_calloc\n");
char *error = ft_calloc(2, 10); // return ""
printf("error: %p\n", error);
char *empty = ft_calloc(0, 0);
printf("empty: %s_%p\n", empty, empty);
char *buf = ft_calloc(10, 1);
strcpy(buf, "test");
printf("test: %s_%p\n", buf, buf);
free(empty);
free(buf);
} }
printf("\n");
// calloc // calloc
{ {
printf("calloc\n");
char *error = calloc(2, 10); // return ""
printf("error: %p\n", error);
char *empty = calloc(0, 0);
printf("empty: %s_%p\n", empty, empty);
char *buf = calloc(10, 1);
strcpy(buf, "test");
printf("test: %s_%p\n", buf, buf);
free(empty);
free(buf);
} }
} }

2
main.h
View file

@ -5,6 +5,8 @@
#include <unistd.h> #include <unistd.h>
#include <string.h> #include <string.h>
#include <fcntl.h> #include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
// DONE // DONE
extern size_t ft_strlen(const char *s); extern size_t ft_strlen(const char *s);

30
src/calloc.s Normal file
View file

@ -0,0 +1,30 @@
bits 64
%include "defines.inc"
section .text
global ft_calloc
; rdi = nitems, rsi = size
ft_calloc:
push rbx
mov rbx, rdi
mul rbx, rsi
cmp rbx, rdi
jl return_null
mov rdi, rbx
call malloc wrt ..plt
mov rdi, rax
inc rbx
mov rsi, rbx
call bzero wrt ..plt
pop rbx
ret
return_null:
pop rbx
mov rax, 0
ret

View file

@ -8,5 +8,8 @@
extern ft_strlen extern ft_strlen
extern ft_strcpy extern ft_strcpy
extern malloc
extern bzero
extern __errno_location
%endif %endif

View file

@ -9,4 +9,16 @@ section .text
mov rax, SYS_READ mov rax, SYS_READ
syscall syscall
cmp rax, 0
jl errno
ret
errno:
neg rax
push rax
call __errno_location wrt ..plt
pop rdx
mov [rax], edx
mov rax, -1
ret ret

View file

@ -4,14 +4,14 @@ bits 64
section .text section .text
global ft_strcmp global ft_strcmp
; rdi = s1, rsi = s2
ft_strcmp: ft_strcmp:
mov rax, 0 mov rax, -1
loop: loop:
mov cl, [rdi + rax]
mov dl, [rsi + rax]
inc rax inc rax
mov cl, [rdi + rax] ; cl = s1[rax]
mov dl, [rsi + rax] ; dl = s2[rax]
cmp cl, 0 cmp cl, 0
je endloop je endloop

View file

@ -6,7 +6,7 @@ section .text
global ft_strcpy global ft_strcpy
; rdi = dst, rsi = src ; rdi = dst, rsi = src
ft_strcpy: ft_strcpy:
push rbp ; push rbp
mov rax, 0 ; counter mov rax, 0 ; counter
mov rcx, 0 mov rcx, 0
@ -21,7 +21,7 @@ section .text
cmp dl, 0 cmp dl, 0
jne loop jne loop
pop rbp ; pop rbp
mov rax, rdi mov rax, rdi
ret ret

View file

@ -4,4 +4,19 @@ bits 64
section .text section .text
global ft_strdup global ft_strdup
; rdi = s
ft_strdup: ft_strdup:
push rbx
mov rbx, rdi
call ft_strlen
mov rdi, rax ; put strlen result in rdi
inc rdi
call malloc wrt ..plt
mov rdi, rax ; put malloc result in dest
mov rsi, rbx ; put s in src
call ft_strcpy
pop rbx
ret

View file

@ -3,24 +3,17 @@ bits 64
section .text section .text
global ft_strlen global ft_strlen
ft_strlen: ft_strlen:
; empilement
push rbp
; code ; code
mov rbx, rdi mov rbx, rdi
mov rsi, 0 mov rsi, -1
loop: loop:
mov al, [rbx + rsi]
inc rsi inc rsi
mov al, [rbx + rsi]
cmp al, 0 cmp al, 0
jne loop jne loop
; rétablissement
pop rbp
; return ; return
mov rax, rsi mov rax, rsi
ret ret

View file

@ -4,9 +4,21 @@ bits 64
section .text section .text
global ft_write global ft_write
ft_write:
; rdi = fd, rsi = buf, rdx = count ; rdi = fd, rsi = buf, rdx = count
ft_write:
mov rax, SYS_WRITE mov rax, SYS_WRITE
syscall syscall
cmp rax, 0
jl errno
ret
errno:
neg rax
push rax
call __errno_location wrt ..plt
pop rdx
mov [rax], edx
mov rax, -1
ret ret