42-archive/libftasm/srcs/ft_puts.s
2017-11-15 18:11:53 +01:00

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