rendered paste body; _fopen:
; Opens a file.
; ebx = File's Name
; ecx = File flags
; edx = File mode
;
; Return:
; FileDescriptor = FD
; Modes
%define O_ACCMODE 0003h
%define O_RDONLY 0000h
%define O_WRONLY 0001h
%define O_RDWR 0002h
%define O_CREAT 0064h
%define O_EXCL 00C8h
%define O_NOCTTY 0190h
%define O_TRUNC 03E8h
%define O_APPEND 07D0h
%define O_NONBLOCK 0FA0h
%define O_NDELAY 0FA0h
%define O_SYNC 000186A0h
%define O_FSYNC 000186A0h
%define O_ASYNC 00030D40h
; Flags (sum them together)
%define OWNER_EXEC 0040h
%define OWNER_READ 0100h
%define OWNER_WRITE 0080h
%define GROUP_EXEC 0008h
%define GROUP_READ 0020h
%define GROUP_WRITE 0010h
%define USER_EXEC 0001h
%define USER_READ 0004h
%define USER_WRITE 0002h
segment .data
Advertence1: db "Insert file name, up to 8 characters: ", 0
AdvertenceLen1: equ $-Advertence1
Advertence2: db "Read (R) or write (W)?: ", 0
AdvertenceLen2: equ $-Advertence2
EndOfFile db "End Of File", 0
EndOfFileLen equ $-EndOfFile
Error1: db "Unknown operation", 0
ErrorLen1: equ $-Error1
Error2: db "Problems with open", 0
ErrorLen2: equ $-Error2
Error3: db "Problems with read", 0
ErrorLen3: equ $-Error3
Error4: db "Trying to do file operation without an available file descriptor", 0
ErrorLen4: equ $-Error4
segment .bss
OpInfo:
resb 1
ProgramMode:
resb 1
FileName:
resb 8
FileDescriptor:
resb 1
FileFlags:
resw 1
; lalala saves us from dying (eax is a 32 bit register so it will also
; read FileModes along with FileFlags)
FileSavior:
resw 1
FileModes:
resw 1
FileSavior2:
resw 1
segment .text
global _start
_start:
mov eax, 0004h
mov ebx, 0001h
mov ecx, Advertence1
mov edx, AdvertenceLen1
int 80h
mov eax, 0003h
mov ebx, 0000h
mov ecx, FileName
mov edx, 0008h
int 80h
mov eax, 0004h
mov ebx, 0001h
mov ecx, Advertence2
mov edx, AdvertenceLen2
int 80h
mov eax, 0003h
mov ebx, 0000h
mov ecx, ProgramMode
mov edx, 0001h
int 80h
mov eax, 0003h
int 80h
mov word [FileFlags], 0000h
or word [FileFlags], O_RDWR
or word [FileFlags], O_CREAT
or word [FileFlags], O_APPEND
mov word [FileModes], 0000h
add word [FileModes], OWNER_READ
add word [FileModes], OWNER_WRITE
add word [FileModes], GROUP_READ
add word [FileModes], USER_READ
call _fopen
cmp byte [ProgramMode], 0052h
je _fread
cmp byte [ProgramMode], 0057h
je _fwrite
jne _error1
call _exit
_fopen:
mov eax, 0005h
mov ebx, FileName
mov ecx, [FileFlags]
mov edx, [FileModes]
int 80h
mov [FileDescriptor], eax
ret
_fclose:
mov eax, 0006h
mov ebx, FileDescriptor
int 80h
ret
_fread:
mov eax, 0003h
mov ebx, [FileDescriptor]
mov ecx, [OpInfo]
mov edx, 0001h
int 80h
cmp eax, 0000h
je _eof
cmp eax, 0000h
jb _error3
mov eax, 0004h
mov ebx, 0001h
mov ecx, [OpInfo]
mov edx, 0001h
int 80h
test eax, eax
je _fread
ret
_fwrite:
jmp _error1
ret
_error1:
mov eax, 0004h
mov ebx, 0001h
mov ecx, Error1
mov edx, ErrorLen1
int 80h
call _exit
ret
_error2:
mov eax, 0004h
mov ebx, 0001h
mov ecx, Error2
mov edx, ErrorLen2
int 80h
call _exit
ret
_error3:
mov eax, 0004h
mov ebx, 0001h
mov ecx, Error3
mov edx, ErrorLen3
int 80h
call _exit
ret
_error4:
mov eax, 0004h
mov ebx, 0001h
mov ecx, Error4
mov edx, ErrorLen4
int 80h
call _exit
ret
_eof:
mov eax, 0004h
mov ebx, 0001h
mov ecx, EndOfFile
mov edx, EndOfFileLen
int 80h
call _exit
ret
_exit:
call _fclose
mov eax, 0001h
mov ebx, 0000h
int 80h