Compare commits

..

26 Commits

Author SHA1 Message Date
66cc5c87d4 clean: rename *.asm -> *.s 2025-05-12 14:44:16 +02:00
0b4d562ef9 clean 2024-09-16 16:21:20 +02:00
42b7aab1ae remove bonus 2024-09-16 16:19:38 +02:00
e3b2eb0852 fix: strdup: add 1 to \0 2024-09-11 20:40:52 +02:00
ebf0b0e442 fix: test leak 2024-09-11 20:20:49 +02:00
3effb7caf5 rename: include to headers 2024-09-11 20:15:32 +02:00
27f25d2cea clean 2024-09-05 18:41:46 +02:00
fdc1923211 save register 2024-09-05 18:39:51 +02:00
cbed6c468f add: strdup test 2024-09-05 18:39:38 +02:00
eadf7cde62 add: ft_list_push_front 2024-09-05 18:14:20 +02:00
b1a86b85fe clean: ft_list_size, use right prototype 2024-09-05 16:00:49 +02:00
49283f4227 add: ft_list_size 2024-09-05 13:15:14 +02:00
8ae1a6e876 use: wrt ..plt instead no-pie 2024-09-03 14:35:27 +02:00
174a587414 add: ft_read 2024-09-03 14:34:52 +02:00
a05124885e opti: use xor instead mov 0 2024-09-03 10:44:54 +02:00
50d50092bf clean: indent 2024-09-03 10:43:41 +02:00
b3a4690a85 add: strdup 2024-09-03 10:37:12 +02:00
3632b34e40 clean: fix indentation 2024-09-03 10:28:47 +02:00
a5ccf7df95 add -no-pie to remove useless code 2024-09-02 17:54:50 +02:00
054e31a020 add: ft_write 2024-09-02 17:22:08 +02:00
5bccb1efc6 strcmp: core: use movsx instead dirty code 2024-09-02 17:21:52 +02:00
723a2e901b clean remove useless \n 2024-09-02 15:29:25 +02:00
1de03da534 fix: test: strcpy 2024-09-02 15:29:06 +02:00
d1756266b2 add: strcpy section .note.GNU-stack noalloc noexec nowrite progbits 2024-09-02 15:28:37 +02:00
1c7245213e add: strcpy test 2024-09-02 14:58:05 +02:00
b86d5dbab9 strcpy: fix: return value 2024-09-02 14:57:56 +02:00
13 changed files with 225 additions and 71 deletions

View File

@ -24,7 +24,7 @@ all : $(NAME)
test : $(NAME)
$(CC) $(CFLAGS) test/test.c $(BUILDDIR)/$(NAME) -o $(BUILDDIR)/test
$(BUILDDIR)/test
valgrind --leak-check=full $(BUILDDIR)/test
clean :
rm -rf $(OBJDIR)

11
headers/libasm.h Normal file
View File

@ -0,0 +1,11 @@
#pragma once
#include <stddef.h>
#include <aio.h>
char *ft_strcpy(char *dest, const char *src);
size_t ft_strlen(const char *str);
int ft_strcmp( const char *first, const char *second);
ssize_t ft_write(int fd, const void *buf, size_t count);
char *ft_strdup(const char *s);
ssize_t ft_read(int fildes, void *buf, size_t nbyte);

View File

@ -1,7 +0,0 @@
#pragma once
#include <stddef.h>
char *ft_strcpy(char *dest, const char *src);
size_t ft_strlen(const char *str);
int ft_strcmp( const char *first, const char *second);

30
src/ft_read.s Normal file
View File

@ -0,0 +1,30 @@
extern __errno_location
section .text
global ft_read
ft_read:
xor rax, rax
syscall
cmp rax, 0
jne syscall_failed
ret
syscall_failed:
push rbx
neg rax
mov rbx, rax
call __errno_location wrt ..plt
mov [rax], rbx
mov rax, -1
pop rbx
ret

View File

@ -1,25 +0,0 @@
section .note.GNU-stack noalloc noexec nowrite progbits
section .text
global ft_strcmp
ft_strcmp:
mov rcx, 0
loop:
mov dl, [rsi + rcx]
mov bl, [rdi + rcx]
cmp bl, 0
je out
cmp bl, dl
jne out
inc rcx
jmp loop
out:
mov rax, 0
mov rbx, 0
mov bl, BYTE [rsi + rcx]
mov al, BYTE [rdi + rcx]
sub rax, rbx
ret

28
src/ft_strcmp.s Normal file
View File

@ -0,0 +1,28 @@
section .text
global ft_strcmp
ft_strcmp:
push rbx
xor rcx, rcx
loop:
mov dl, [rsi + rcx]
mov bl, [rdi + rcx]
cmp bl, 0
je out
cmp bl, dl
jne out
inc rcx
jmp loop
out:
sub bl, dl
movsx rax, bl
pop rbx
ret

View File

@ -1,19 +0,0 @@
section .text
global ft_strcpy
ft_strcpy:
mov rcx, 0
loop:
mov al, [rsi + rcx]
mov [rdi + rcx], al
cmp al, 0
je out
inc rcx
jmp loop
out:
mov rax, rcx
ret

19
src/ft_strcpy.s Normal file
View File

@ -0,0 +1,19 @@
section .text
global ft_strcpy
ft_strcpy:
xor rcx, rcx
loop:
mov al, [rsi + rcx]
mov [rdi + rcx], al
cmp al, 0
je out
inc rcx
jmp loop
out:
mov rax, rdi
ret

35
src/ft_strdup.s Normal file
View File

@ -0,0 +1,35 @@
extern ft_strlen
extern malloc
extern ft_strcpy
section .text
global ft_strdup
ft_strdup:
push rbx
call ft_strlen
mov rbx, rdi
mov rdi, rax
add rdi, 1
call malloc wrt ..plt
cmp rax, 0
je error
mov rdi, rax
mov rsi, rbx
call ft_strcpy
pop rbx
ret
error:
xor rax, rax
pop rbx
ret

View File

@ -1,14 +0,0 @@
section .note.GNU-stack noalloc noexec nowrite progbits
section .text
global ft_strlen
ft_strlen:
mov rcx, 0
loop:
cmp BYTE [rdi + rcx], 0
je out
inc rcx
jmp loop
out:
mov rax, rcx
ret

15
src/ft_strlen.s Normal file
View File

@ -0,0 +1,15 @@
section .text
global ft_strlen
ft_strlen:
xor rcx, rcx
loop:
cmp BYTE [rdi + rcx], 0
je out
inc rcx
jmp loop
out:
mov rax, rcx
ret

28
src/ft_write.s Normal file
View File

@ -0,0 +1,28 @@
extern __errno_location
section .text
global ft_write
ft_write:
mov rax, 1
syscall
cmp rax, 0
jne syscall_failed
ret
syscall_failed:
push rbx
neg rax
mov rbx, rax
call __errno_location wrt ..plt
mov [rax], rbx
mov rax, -1
pop rbx
ret

View File

@ -1,6 +1,9 @@
#include <stdio.h>
#include "../include/libasm.h"
#include "../headers/libasm.h"
#include "string.h"
#include <time.h>
#include <stdlib.h>
void test_size_t(size_t expected_value, size_t value)
{
@ -20,7 +23,7 @@ void test_int(int expected_value, int value)
void test_str(const char *expected_value, const char *value)
{
if (strcmp(expected_value, value) == 0)
if (strcmp(expected_value, value))
printf("[FAILED] %s != %s", expected_value, value);
else
printf("[OK]");
@ -46,13 +49,63 @@ void multiple_test_int_2(int (*normal_func)(const char *, const char *), int (*o
}
}
void multiple_test_strcpy(char *(*own_func)(char *, const char *), const char * const *values)
{
char tmp[4096];
for (size_t i = 0; values[i] != NULL; i++)
{
printf("test: %s", values[i]);
test_size_t((size_t) strcpy(tmp, values[i]), (size_t) own_func(tmp, values[i]));
test_str(values[i], tmp);
printf("\n");
}
}
void multiple_test_atoi_base(char *(*own_func)(char *, const char *), const char * const *values[2])
{
char tmp[4096];
for (size_t i = 0; values[i] != NULL; i++)
{
printf("test: %s", values[i]);
printf("\n");
}
}
void multiple_test_strdup(const char * const *values)
{
char *tmp;
for (size_t i = 0; values[i] != NULL; i++)
{
tmp = ft_strdup(values[i]);
test_str(tmp, values[i]);
free(tmp);
printf("\n");
}
}
int main()
{
printf("STRLEN\n");
const char *strlen_tests[] = {"yo", "", "bonjour", "co\0fgf", NULL};
multiple_test_int(&strlen, ft_strlen, strlen_tests);
multiple_test_int(strlen, ft_strlen, strlen_tests);
printf("\n");
printf("STRCMP\n");
const char *strcmp_tests[][2] = {{"w", "z"}, {"bonjour", "bonjour"}, {"", ""}, {"bonjour", "salut"}, {"co\0fgf", "co\0fgf"}, NULL};
multiple_test_int_2(strcmp, ft_strcmp, strcmp_tests);
printf("\n");
multiple_test_int_2(&strcmp, ft_strcmp, strcmp_tests);
printf("STRCPY\n");
const char *strcpy_tests[] = {"yo", "", "bonjour", "co\0fgf", NULL};
multiple_test_strcpy(ft_strcpy, strcpy_tests);
printf("\n");
printf("STRDUP\n");
const char *strdup_tests[] = {"yo", "", "bonjour", "co\0fgf", NULL};
multiple_test_strdup(strdup_tests);
printf("\n");
}