26 lines
720 B
ArmAsm
26 lines
720 B
ArmAsm
segment .note.GNU-stack
|
|
|
|
extern __errno_location
|
|
|
|
section .text
|
|
global ft_read
|
|
|
|
ft_read:
|
|
cmp rsi, 0 ; check if the buffer is NULL
|
|
je .exit ; if true go to exit
|
|
mov rax, 0 ; syscall 0 is for read
|
|
syscall ; call the system call read
|
|
cmp rax, 0 ; check if the return value of syscall
|
|
jl .error ; jump if the syscall return less than 0
|
|
jmp .exit ; jump to exit
|
|
|
|
.error:
|
|
mov rdi, rax ; stock errno value in rdi
|
|
neg rdi ; errno value in positive (index used by C function)
|
|
call __errno_location ; rax = &errno
|
|
mov [rax], edi ; stock the errno return in the address of rax
|
|
mov rax, -1 ; set the value of rax to -1
|
|
jmp .exit ; jump to exit
|
|
|
|
.exit:
|
|
ret ; return rax value
|