Add perror() (currently only errors 1-34 from asm-generic/errno-base.h)
This commit is contained in:
60
console.asm
60
console.asm
@ -8,6 +8,46 @@ section .rodata
|
||||
bufferLength equ 4096
|
||||
ERR_buffLen db "<!> ERROR: Failed to complete printf(), reached buffer length!",0xA,0x0
|
||||
lERR_buffLen equ $-ERR_buffLen-1
|
||||
|
||||
; Errors (perror)
|
||||
perrorMsg db "%s: %s",10,0
|
||||
errorMsgs dq em0,em1,em2,em3,em4,em5,em6,em7,em8,em9,em10,em11,em12,em13,em14,em15,em16,em17,em18,em19,em20,em21,em22,em23,em24,em25,em26,em27,em28,em29,em30,em31,em32,em33,em34
|
||||
em0 db "No error",0
|
||||
em1 db "Operation not permitted",0
|
||||
em2 db "No such file or directory",0
|
||||
em3 db "No such process",0
|
||||
em4 db "Interrupted system call",0
|
||||
em5 db "I/O error",0
|
||||
em6 db "No such device or address",0
|
||||
em7 db "Argument list too long",0
|
||||
em8 db "Exec format error",0
|
||||
em9 db "Bad file number",0
|
||||
em10 db "No child processes",0
|
||||
em11 db "Try again",0
|
||||
em12 db "Out of memory",0
|
||||
em13 db "Permission denied",0
|
||||
em14 db "Bad address",0
|
||||
em15 db "Block device required",0
|
||||
em16 db "Device or resource busy",0
|
||||
em17 db "File exists",0
|
||||
em18 db "Cross-device link",0
|
||||
em19 db "No such device",0
|
||||
em20 db "Not a directory",0
|
||||
em21 db "Is a directory",0
|
||||
em22 db "Invalid argument",0
|
||||
em23 db "File table overflow",0
|
||||
em24 db "Too many open files",0
|
||||
em25 db "Not a typewriter",0
|
||||
em26 db "Text file busy",0
|
||||
em27 db "File too large",0
|
||||
em28 db "No space left on device",0
|
||||
em29 db "Illegal seek",0
|
||||
em30 db "Read-only file system",0
|
||||
em31 db "Too many links",0
|
||||
em32 db "Broken pipe",0
|
||||
em33 db "Math argument out of domain of func",0
|
||||
em34 db "Math result not representable",0
|
||||
|
||||
section .bss
|
||||
printfBuff resb bufferLength
|
||||
printfNBuff resb 32
|
||||
@ -15,6 +55,7 @@ section .text
|
||||
global print
|
||||
global puts
|
||||
global printf
|
||||
global perror
|
||||
|
||||
;----- print (char* string) -----;
|
||||
; return value: N/A
|
||||
@ -212,3 +253,22 @@ printf:
|
||||
|
||||
leave
|
||||
ret
|
||||
;----- perror(const char *str) -----;
|
||||
; retrieves last returned error. Uses rax to fetch errno.
|
||||
; errno must be negative
|
||||
; Returns nothing (rax restored to original value)
|
||||
perror:
|
||||
push rax
|
||||
cmp rax, 0
|
||||
jge .quit
|
||||
neg rax
|
||||
cmp rax, 34
|
||||
jg .quit
|
||||
mov rsi, rdi
|
||||
lea rdi, [rel perrorMsg]
|
||||
lea rdx, [errorMsgs + rax*8]
|
||||
mov rdx, [rdx]
|
||||
call printf
|
||||
.quit:
|
||||
pop rax
|
||||
ret
|
||||
|
51
tests.asm
51
tests.asm
@ -1,5 +1,3 @@
|
||||
extern printf
|
||||
|
||||
;constants.asm
|
||||
extern EOS
|
||||
extern NL
|
||||
@ -17,6 +15,8 @@ extern exit
|
||||
;console.asm
|
||||
extern print
|
||||
extern puts
|
||||
extern printf
|
||||
extern perror
|
||||
;string.asm
|
||||
extern strlen
|
||||
extern strcpy
|
||||
@ -36,6 +36,7 @@ section .rodata
|
||||
TEST_print equ 1
|
||||
TEST_puts equ 1
|
||||
TEST_printf equ 1
|
||||
TEST_perror equ 1
|
||||
TEST_min equ 1 ;includes minu
|
||||
TEST_max equ 1 ;includes maxu
|
||||
TEST_strlen equ 1
|
||||
@ -85,6 +86,12 @@ section .rodata
|
||||
msgPrintf1 db "TEST printf()",NL,EOS
|
||||
msgPrintf2 db "TEST printf(testStr, tS1, tS2, tS3, invalid1, tS4, num4, tS5, tS6, invalid2, tS7, tS8, num1, tS9)",NL,EOS
|
||||
msgPrintf2b db "Return value: %d",NL,EOS
|
||||
; perror()
|
||||
msgPerror db NL,"# perror()",EOS
|
||||
msgPerror1 db "TEST perror(",34,"ErrTest",34,") (rax=0):",NL,EOS
|
||||
msgPerror2 db "TEST perror(",34,"ErrTest",34,") (rax=-22):",NL,EOS
|
||||
msgPerror3 db "TEST perror(",34,"ErrTest",34,") (rax=7):",NL,EOS
|
||||
perrorStr db "ErrTest",EOS
|
||||
; min() / minu()
|
||||
msgMin db NL,"# min() / minu()",EOS
|
||||
msgMin1 db "TEST min(num1, num2): %d",NL,EOS
|
||||
@ -172,6 +179,9 @@ section .rodata
|
||||
msgFileB1 db "TEST fopen('testFile1.txt', 'w'): %d",NL,EOS
|
||||
msgFileB2 db "TEST fwrite(filePointer1, fileStr1): %d",NL,EOS
|
||||
msgFileB3 db "TEST fclose(filePointer1): %d",NL,EOS
|
||||
perror_fopen db " Error@fopen()",EOS
|
||||
perror_fwrite db " Error@fwrite()",EOS
|
||||
perror_fclose db " Error@fclose()",EOS
|
||||
section .data
|
||||
filePointer1 dq 0
|
||||
section .bss
|
||||
@ -248,6 +258,31 @@ _start:
|
||||
lea rdi, [msgPrintf2b]
|
||||
call printf
|
||||
%ENDIF
|
||||
%IF TEST_perror
|
||||
lea rdi, [rel msgPerror]
|
||||
call puts
|
||||
|
||||
; TEST: perror (no error)
|
||||
lea rdi, [rel msgPerror1]
|
||||
call print
|
||||
xor rax, rax
|
||||
lea rdi, [rel perrorStr]
|
||||
call perror
|
||||
|
||||
; TEST: perror (err=-22)
|
||||
lea rdi, [rel msgPerror2]
|
||||
call print
|
||||
mov rax, -22
|
||||
lea rdi, [rel perrorStr]
|
||||
call perror
|
||||
|
||||
; TEST: perror (err=7)
|
||||
lea rdi, [rel msgPerror3]
|
||||
call print
|
||||
mov rax, 7
|
||||
lea rdi, [rel perrorStr]
|
||||
call perror
|
||||
%ENDIF
|
||||
%IF TEST_min
|
||||
lea rdi, [rel msgMin]
|
||||
call puts
|
||||
@ -785,6 +820,10 @@ _start:
|
||||
lea rdi, [rel testFile1]
|
||||
mov rsi, 'w'
|
||||
call fopen
|
||||
%IF TEST_perror
|
||||
lea rdi, [rel perror_fopen]
|
||||
call perror
|
||||
%ENDIf
|
||||
mov r15, rax ;store filepointer to R15
|
||||
mov rsi, rax
|
||||
xor rax, rax
|
||||
@ -795,6 +834,10 @@ _start:
|
||||
mov rdi, r15
|
||||
lea rsi, [fileStr1]
|
||||
call fwrite
|
||||
%IF TEST_perror
|
||||
lea rdi, [rel perror_fwrite]
|
||||
call perror
|
||||
%ENDIF
|
||||
mov rsi, rax
|
||||
xor rax, rax
|
||||
lea rdi, [rel msgFileB2]
|
||||
@ -803,6 +846,10 @@ _start:
|
||||
; TEST: fclose()
|
||||
mov rdi, r15
|
||||
call fclose
|
||||
%IF TEST_perror
|
||||
lea rdi, [rel perror_fclose]
|
||||
call perror
|
||||
%ENDIF
|
||||
mov rsi, rax
|
||||
xor rax, rax
|
||||
lea rdi, [rel msgFileB3]
|
||||
|
Reference in New Issue
Block a user