diff --git a/.gitignore b/.gitignore index 927e2b2..8e736c4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ *.o -*.c *.out *.a \ No newline at end of file diff --git a/Makefile b/Makefile index c11a989..1edd1d9 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,8 @@ SRCS = ft_strlen.s \ ft_read.s \ ft_strcpy.s \ ft_strcmp.s \ - + ft_strdup.s \ + OBJS = ${SRCS:.s=.o} CC = nasm diff --git a/ft_read.s b/ft_read.s index 6aed3c1..7522ee8 100644 --- a/ft_read.s +++ b/ft_read.s @@ -1,7 +1,7 @@ -global _read +global ft_read extern __errno_location -_read: +ft_read: mov eax, 0x11 syscall test rax, rax diff --git a/ft_strcmp.s b/ft_strcmp.s index bfc9dfa..93bc1b7 100644 --- a/ft_strcmp.s +++ b/ft_strcmp.s @@ -1,9 +1,10 @@ -extern _strcmp +global ft_strcmp +extern _malloc - -_strcmp: +ft_strcmp: xor rax, rax xor rbx, rbx + .count: mov rax, [rdi + rbx] sub rax, [rsi + rbx] @@ -13,4 +14,4 @@ _strcmp: jmp .count .end: - ret + ret \ No newline at end of file diff --git a/ft_strcpy.s b/ft_strcpy.s index 82dfb2f..d2ea71d 100644 --- a/ft_strcpy.s +++ b/ft_strcpy.s @@ -1,10 +1,10 @@ -extern _strcpy +global ft_strcpy -_strcpy: +ft_strcpy: xor rbx, rbx .cpy: - cmp dword [rsi + rbx], 0 + cmp byte [rsi + rbx], 0 je .end mov rax, [rsi + rbx] mov [rdi + rbx], rax @@ -12,5 +12,6 @@ _strcpy: jmp .cpy .end: + mov byte [rdi + rbx], 0 mov rax, rdi ret diff --git a/ft_strdup.s b/ft_strdup.s new file mode 100644 index 0000000..e790de2 --- /dev/null +++ b/ft_strdup.s @@ -0,0 +1,25 @@ +global ft_strdup + +extern ft_strlen +extern ft_strcpy +extern malloc +extern __errno_location + +ft_strdup: + cmp rdi, 0 + je .end + mov r12, rdi + call ft_strlen + inc rax + mov rdi, rax + call malloc wrt ..plt + test rax, rax + je .end + mov rdi, rax + mov rsi, r12 + call ft_strcpy + ret + +.end: + xor rax, rax + ret \ No newline at end of file diff --git a/ft_strlen.s b/ft_strlen.s index 0b1a5b4..b9d2a94 100644 --- a/ft_strlen.s +++ b/ft_strlen.s @@ -1,11 +1,13 @@ -global _strlen +global ft_strlen -_strlen: +ft_strlen: xor rax, rax + .cmp_char: cmp byte [rdi + rax], 0 je .end inc rax jmp .cmp_char + .end: ret \ No newline at end of file diff --git a/ft_write.s b/ft_write.s index 50a29db..f0cb24a 100644 --- a/ft_write.s +++ b/ft_write.s @@ -1,7 +1,7 @@ -global _write +global ft_write extern __errno_location -_write: +ft_write: mov eax, 0x1 syscall test rax, rax diff --git a/libasm.a b/libasm.a index 39ce1eb..5ed300b 100644 Binary files a/libasm.a and b/libasm.a differ diff --git a/test.c b/test.c new file mode 100644 index 0000000..4c9f780 --- /dev/null +++ b/test.c @@ -0,0 +1,102 @@ +#include +#include +#include +#include +#include +#include +#include + +extern ssize_t ft_write(int fd, const void *buf, size_t count); + +extern int ft_strcmp(const char *s1, const char *s2); + +extern char *ft_strcpy(char *dest, const char *src); + +extern size_t ft_strlen(const char *s); + +extern ssize_t ft_read(int fd, void *buf, size_t count); + +extern char *ft_strdup(const char *s); + +void Test_read(char *filename, int len) +{ + char buffer[100] = {0}; + + int fd = open(filename, O_RDONLY); + printf("READ : %ld | ", read(fd, buffer, len)); + printf("%s\n", buffer); + close(fd); + bzero(buffer, len); + + fd = open(filename, O_RDONLY); + printf("READ : %ld | ", ft_read(fd, buffer, len)); + printf("%s\n", buffer); + close(fd); +} + +void Test_write(char *buffer, int len) +{ + printf(" | WRITE : %ld\n", write(1, buffer, len)); + printf(" | WRITE : %ld\n", ft_write(1, buffer, len)); +} + +void Test_strdup(char *buffer) +{ + char *newbuffer; + + newbuffer = strdup(buffer); + printf("STRDUP : %s\n", newbuffer); + free(newbuffer); + + newbuffer = ft_strdup(buffer); + printf("FT_STRDUP : %s\n", newbuffer); + free(newbuffer); +} + +void Test_strlen(char *str) +{ + int len = strlen(str); + int ft_len = ft_strlen(str); + + printf("STRLEN : %s\n", (len == ft_len) ? "OK" : "KO"); +} + +void Test_strcpy(char *buffer) +{ + char cpybuffer[strlen(buffer) + 1]; + + bzero(cpybuffer, strlen(buffer) + 1); + strcpy(cpybuffer, buffer); + printf("STRCPY : %s\n", cpybuffer); + + bzero(cpybuffer, strlen(buffer) + 1); + ft_strcpy(cpybuffer, buffer); + printf("FT_STRCPY : %s\n", cpybuffer); +} + +void Test_strcmp(char *str1, char *str2) +{ + int res1 = strcmp(str1, str2); + int res2 = ft_strcmp(str1, str2); + + printf("STRCMP : %d FT_STRCMP : %d | %s\n", res1, res2, (res1 == res2) ? "OK" : "KO"); +} + +int main() +{ + int returnval[2]; + int fd = open("mauvaisdavid.txt", O_RDONLY); + char buffer[100] = {0}; + + Test_strlen("clafete"); + + Test_read("mauvaisdavid.txt", 15); + + Test_write("youpipouic", 10); + + Test_strcpy("jesuislevilainbebe"); + + Test_strdup("youpilolololol"); + + Test_strcmp("vilain", "vilain"); +} \ No newline at end of file