diff options
| -rw-r--r-- | ft_read.s | 18 | ||||
| -rw-r--r-- | ft_write.s | 34 |
2 files changed, 42 insertions, 10 deletions
@@ -12,6 +12,10 @@ global _ft_read +%define F_GETFD 1 +%define SYSCALL_READ 0x2000003 +%define SYSCALL_FCNTL 0x200005c + ; int ft_read(int, void*, size_t); _ft_read: cmp rdx, 0 @@ -20,7 +24,19 @@ _ft_read: jl FT_READ_ERROR cmp rsi, 0 je FT_READ_ERROR - mov rax, 0x2000003 + + push rdx + push rsi + xor rsi, rsi + mov esi, F_GETFD + mov rax, SYSCALL_FCNTL + syscall + pop rsi + pop rdx + cmp eax, 0 + jne FT_READ_ERROR + + mov rax, SYSCALL_READ syscall ret FT_READ_ERROR: @@ -12,20 +12,36 @@ global _ft_write +%define F_GETFD 1 +%define SYSCALL_WRITE 0x2000004 +%define SYSCALL_FCNTL 0x200005c + ; int ft_write(int rdi, const void *rsi, size_t rdx); _ft_write: - cmp rdx, 0 - je FT_WRITE_NO_SIZE - cmp rdi, 0 - jl FT_WRITE_ERROR - cmp rsi, 0 - je FT_WRITE_ERROR - mov rax, 0x2000004 + cmp rdx, 0 + je FT_WRITE_NO_SIZE + cmp rdi, 0 + jl FT_WRITE_ERROR ; fd < 0 + cmp rsi, 0 + je FT_WRITE_ERROR ; buf == NULL + + push rdx + push rsi + xor rsi, rsi + mov esi, F_GETFD + mov rax, SYSCALL_FCNTL + syscall + pop rsi + pop rdx + cmp eax, 0 + jne FT_WRITE_ERROR + + mov rax, SYSCALL_WRITE syscall ret FT_WRITE_ERROR: - mov rax, -1 + mov rax, -1 ret FT_WRITE_NO_SIZE: - mov rax, 0 + mov rax, 0 ret |
