46 lines
879 B
ArmAsm
46 lines
879 B
ArmAsm
global _ft_puts
|
|
global ft_puts
|
|
|
|
extern ft_strlen
|
|
extern ft_putchar
|
|
|
|
%define STDOUT 1
|
|
|
|
section .data
|
|
string db "(null)"
|
|
.len: equ $ - string
|
|
|
|
_ft_puts: ; int puts(const char *s)
|
|
ft_puts:
|
|
push rdi ; because strlen will clobber rdi
|
|
call ft_strlen
|
|
pop rdi
|
|
cmp rax, 0
|
|
je print_nl ; if empty string skip printing
|
|
|
|
print_string:
|
|
; int write(int fd, const char *str, size_t size)
|
|
mov rsi, rdi ; char *str
|
|
mov rdi, STDOUT ; int fd
|
|
mov rdx, rax ; size_t strlen
|
|
mov rax, WRITE ; WRITE
|
|
syscall
|
|
jc error
|
|
|
|
print_nl:
|
|
mov rdi, 0xa
|
|
call ft_putchar
|
|
test rax, rax
|
|
jc error ; if write failed, go to error
|
|
|
|
success:
|
|
mov rax, 0xa ; success returns '\n'
|
|
jmp end
|
|
|
|
error:
|
|
pop rax
|
|
mov rax, -1 ; Return EOF (alias -1) on error
|
|
jmp end
|
|
|
|
end:
|
|
ret
|