Adds fopen(), fwrite(), fclose()
This commit is contained in:
110
file.asm
Normal file
110
file.asm
Normal file
@ -0,0 +1,110 @@
|
||||
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
|
Reference in New Issue
Block a user