This commit is contained in:
Jack Halford 2017-11-20 17:41:23 +01:00
parent 8e66148582
commit 3efbeb3903
6 changed files with 47 additions and 45 deletions

View file

@ -2,5 +2,6 @@
int main(void) int main(void)
{ {
return (ft_puts("h2g2")); ft_puts("h2g2");
return (0);
} }

View file

@ -1,7 +1,8 @@
global _ft_memcpy global _ft_memcpy
global ft_memcpy global ft_memcpy
_ft_memcpy: ; void *ft_memcpy(void *dst, const void *src, size_t n) ; void *ft_memcpy(void *dst, const void *src, size_t n)
_ft_memcpy:
ft_memcpy: ft_memcpy:
push rdi push rdi
cmp rdi, 0 cmp rdi, 0

View file

@ -3,8 +3,8 @@
global _ft_putchar global _ft_putchar
global ft_putchar global ft_putchar
section .bss section .data
char: resb 1 string: db "A"
section .text section .text
@ -15,10 +15,10 @@ ft_putchar:
push rdi push rdi
; int write(int fd, char *str, size_t len) ; int write(int fd, char *str, size_t len)
lea rsi, [char] ; char *str lea rsi, [rel string] ; char *str
mov [rsi], dil mov [rsi], dil
mov rdi, STDOUT ; int fd
mov rdx, 1 ; size_t len mov rdx, 1 ; size_t len
mov rdi, STDOUT ; int fd
mov rax, WRITE mov rax, WRITE
syscall syscall

View file

@ -1,19 +1,20 @@
global _ft_puts global _ft_puts
global ft_puts global ft_puts
extern ft_strlen extern _ft_strlen
extern ft_putchar extern _ft_putchar
%define STDOUT 1 %define STDOUT 1
section .data section .data
string db "(null)" string: db "(null)"
.len: equ $ - string .len: equ $ - string
section .text
_ft_puts: ; int puts(const char *s) _ft_puts: ; int puts(const char *s)
ft_puts: ft_puts:
push rdi ; because strlen will clobber rdi push rdi ; because strlen will clobber rdi
call ft_strlen call _ft_strlen
pop rdi pop rdi
cmp rax, 0 cmp rax, 0
je print_nl ; if empty string skip printing je print_nl ; if empty string skip printing
@ -26,20 +27,16 @@ print_string:
mov rax, WRITE ; WRITE mov rax, WRITE ; WRITE
syscall syscall
cmp rax, 0 cmp rax, 0
jl error jl finish
print_nl: print_nl:
; xor rdi, rdi
; add rdi, 0xa
mov rdi, 0xa mov rdi, 0xa
call ft_putchar call _ft_putchar
cmp rax, 0 cmp rax, 0
jl error ret
jl finish
success: success:
mov rax, 0xa ; success returns '\n' mov rax, 0xa ; success returns '\n'
ret finish:
error:
mov rax, -1 ; Return EOF (alias -1) on error
ret ret

View file

@ -3,22 +3,24 @@ global ft_strdup
extern _malloc extern _malloc
extern malloc extern malloc
extern ft_strlen extern _ft_strlen
extern ft_memcpy extern _ft_memcpy
_ft_strdup: ; void *ft_strdup(const char *d) ; void *ft_strdup(const char *d)
_ft_strdup:
ft_strdup: ft_strdup:
mov rax, 0 mov rax, 0
cmp rdi, 0 cmp rdi, 0
je end je end
push rdi push rdi
call ft_strlen call _ft_strlen
inc rax inc rax
push rax push rax
mov rdi, rax mov rdi, rax
call malloc call _malloc
cmp rax, 0 cmp rax, 0
je end je end
mov rdi, rax mov rdi, rax
pop rcx pop rcx
pop rsi pop rsi

View file

@ -400,26 +400,26 @@ int test_strdup()
} }
str = ft_strdup("Coucou"); str = ft_strdup("Coucou");
str_cmp = strdup("Coucou"); str_cmp = strdup("Coucou");
len = strlen(str); /* len = strlen(str); */
len_cmp = strlen(str_cmp); /* len_cmp = strlen(str_cmp); */
if (len != len_cmp) /* if (len != len_cmp) */
{ /* { */
printf("FAILED: len is %d vs %d\n", len, len_cmp); /* printf("FAILED: len is %d vs %d\n", len, len_cmp); */
return (1); /* return (1); */
} /* } */
i = -1; /* i = -1; */
while (++i < len) /* while (++i < len) */
{ /* { */
if (str[i] != str_cmp[i]) /* if (str[i] != str_cmp[i]) */
{ /* { */
ft_putnstr(str, len); /* ft_putnstr(str, len); */
ft_putnstr(str_cmp, len); /* ft_putnstr(str_cmp, len); */
printf("FAILED: %c vs %c\n", str[i], str_cmp[i]); /* printf("FAILED: %c vs %c\n", str[i], str_cmp[i]); */
return (1); /* return (1); */
} /* } */
} /* } */
free(str); /* free(str); */
free(str_cmp); /* free(str_cmp); */
return (0); return (0);
} }
@ -510,6 +510,7 @@ int main(int argc, char **argv)
test_memcpy() || test_memcpy() ||
test_strdup()) test_strdup())
return (1); return (1);
exit(1);
ft_putstr("\nPART BONUS:\n_______\n"); ft_putstr("\nPART BONUS:\n_______\n");
if (test_isupper() || if (test_isupper() ||
test_islower() || test_islower() ||