extern NR_read extern NR_write extern NR_open extern NR_close extern strlen section .rodata O_RDONLY equ 00000000 O_WRONLY equ 00000001 O_RDWR equ 00000002 O_CREAT equ 00000100 O_TRUNC equ 00001000 O_APPEND equ 00002000 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: cmp sil, 'r' je .setMode_r cmp sil, 'w' je .setMode_w cmp sil, 'a' je .setMode_a cmp sil, 'R' je .setMode_R cmp sil, 'W' je .setMode_W cmp sil, 'A' je .setMode_A mov rax, -22 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: ret ;----- fclose(FILE* fp) -----; ; return value: 0 on success, below 0 otherwise (neg errno) fclose: cmp rdi, 3 jl .ebadf mov rax, NR_close syscall jmp .quit .ebadf: mov rax, -9 .quit: ret ;----- fwrite(FILE* fp, char* str) -----; ; writes a string to opened file ; return value: amount of written characters on success, below 0 otherwise (neg errno) fwrite: cmp rdi, 3 jl .ebadf mov r9, rdi mov rdi, rsi call strlen mov rdx, rax mov rax, NR_write mov rdi, r9 syscall jmp .quit .ebadf: mov rax, -9 .quit: ret