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 value < 0 (neg errno) 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 (neg errno) 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 (neg errno) 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