Files
klibc/file.asm

111 lines
3.2 KiB
NASM

extern NR_read
extern NR_write
extern NR_open
extern NR_close
extern strlen
section .rodata
O_RDONLY equ 00000000q
O_WRONLY equ 00000001q
O_RDWR equ 00000002q
O_CREAT equ 00000100q
O_TRUNC equ 00001000q
O_APPEND equ 00002000q
section .text
global fopen
global fclose
global fwrite
;----- fopen(const char *filename, const char *mode) -----;
; return value: pointer to file or NULL if file failed to open
; ┌─────────────┬───────────────────────────────┐
; │fopen() mode │ open() flags │
; ├─────────────┼───────────────────────────────┤
; │ r │ O_RDONLY │
; ├─────────────┼───────────────────────────────┤
; │ w │ O_WRONLY | O_CREAT | O_TRUNC │
; ├─────────────┼───────────────────────────────┤
; │ a │ O_WRONLY | O_CREAT | O_APPEND │
; ├─────────────┼───────────────────────────────┤
; │ R │ O_RDWR │
; ├─────────────┼───────────────────────────────┤
; │ W │ O_RDWR | O_CREAT | O_TRUNC │
; ├─────────────┼───────────────────────────────┤
; │ A │ O_RDWR | O_CREAT | O_APPEND │
; └─────────────┴───────────────────────────────┘
fopen:
push rbp
mov rbp, rsp
cmp byte [rsi], 'r'
je .setMode_r
cmp byte [rsi], 'w'
je .setMode_w
cmp byte [rsi], 'a'
je .setMode_a
cmp byte [rsi], 'R'
je .setMode_R
cmp byte [rsi], 'W'
je .setMode_W
cmp byte [rsi], 'A'
je .setMode_A
xor rax, rax
jmp .quit
.setMode_r:
mov rsi, O_RDONLY
jmp .open
.setMode_w:
mov rsi, O_WRONLY | O_CREAT | O_TRUNC
jmp .open
.setMode_a:
mov rsi, O_WRONLY | O_CREAT | O_APPEND
jmp .open
.setMode_R:
mov rsi, O_RDWR
jmp .open
.setMode_W:
mov rsi, O_RDWR | O_CREAT | O_TRUNC
jmp .open
.setMode_A:
mov rsi, O_RDWR | O_CREAT | O_APPEND
jmp .open
.open:
mov rax, NR_open
syscall
.quit:
leave
ret
;----- fclose(FILE* fp) -----;
; return value: 0 on success, below 0 otherwise
fclose:
push rbp
mov rbp, rsp
mov rax, NR_close
syscall
leave
ret
;----- fwrite(FILE* fp, char* str) -----;
; writes a string to opened file
; return value: 0 on success, below 0 otherwise
fwrite:
push rbp
mov rbp, rsp
mov r9, rdi
mov rdi, rsi
call strlen
mov rdx, rax
mov rax, NR_write
mov rdi, r9
syscall
leave
ret