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
|
bufferLength equ 4096
|
||||||
ERR_buffLen db "<!> ERROR: Failed to complete printf(), reached buffer length!",0xA,0x0
|
ERR_buffLen db "<!> ERROR: Failed to complete printf(), reached buffer length!",0xA,0x0
|
||||||
lERR_buffLen equ $-ERR_buffLen-1
|
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
|
section .bss
|
||||||
printfBuff resb bufferLength
|
printfBuff resb bufferLength
|
||||||
printfNBuff resb 32
|
printfNBuff resb 32
|
||||||
@ -15,6 +55,7 @@ section .text
|
|||||||
global print
|
global print
|
||||||
global puts
|
global puts
|
||||||
global printf
|
global printf
|
||||||
|
global perror
|
||||||
|
|
||||||
;----- print (char* string) -----;
|
;----- print (char* string) -----;
|
||||||
; return value: N/A
|
; return value: N/A
|
||||||
@ -212,3 +253,22 @@ printf:
|
|||||||
|
|
||||||
leave
|
leave
|
||||||
ret
|
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
|
;constants.asm
|
||||||
extern EOS
|
extern EOS
|
||||||
extern NL
|
extern NL
|
||||||
@ -17,6 +15,8 @@ extern exit
|
|||||||
;console.asm
|
;console.asm
|
||||||
extern print
|
extern print
|
||||||
extern puts
|
extern puts
|
||||||
|
extern printf
|
||||||
|
extern perror
|
||||||
;string.asm
|
;string.asm
|
||||||
extern strlen
|
extern strlen
|
||||||
extern strcpy
|
extern strcpy
|
||||||
@ -36,6 +36,7 @@ section .rodata
|
|||||||
TEST_print equ 1
|
TEST_print equ 1
|
||||||
TEST_puts equ 1
|
TEST_puts equ 1
|
||||||
TEST_printf equ 1
|
TEST_printf equ 1
|
||||||
|
TEST_perror equ 1
|
||||||
TEST_min equ 1 ;includes minu
|
TEST_min equ 1 ;includes minu
|
||||||
TEST_max equ 1 ;includes maxu
|
TEST_max equ 1 ;includes maxu
|
||||||
TEST_strlen equ 1
|
TEST_strlen equ 1
|
||||||
@ -85,6 +86,12 @@ section .rodata
|
|||||||
msgPrintf1 db "TEST printf()",NL,EOS
|
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
|
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
|
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()
|
; min() / minu()
|
||||||
msgMin db NL,"# min() / minu()",EOS
|
msgMin db NL,"# min() / minu()",EOS
|
||||||
msgMin1 db "TEST min(num1, num2): %d",NL,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
|
msgFileB1 db "TEST fopen('testFile1.txt', 'w'): %d",NL,EOS
|
||||||
msgFileB2 db "TEST fwrite(filePointer1, fileStr1): %d",NL,EOS
|
msgFileB2 db "TEST fwrite(filePointer1, fileStr1): %d",NL,EOS
|
||||||
msgFileB3 db "TEST fclose(filePointer1): %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
|
section .data
|
||||||
filePointer1 dq 0
|
filePointer1 dq 0
|
||||||
section .bss
|
section .bss
|
||||||
@ -248,6 +258,31 @@ _start:
|
|||||||
lea rdi, [msgPrintf2b]
|
lea rdi, [msgPrintf2b]
|
||||||
call printf
|
call printf
|
||||||
%ENDIF
|
%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
|
%IF TEST_min
|
||||||
lea rdi, [rel msgMin]
|
lea rdi, [rel msgMin]
|
||||||
call puts
|
call puts
|
||||||
@ -785,6 +820,10 @@ _start:
|
|||||||
lea rdi, [rel testFile1]
|
lea rdi, [rel testFile1]
|
||||||
mov rsi, 'w'
|
mov rsi, 'w'
|
||||||
call fopen
|
call fopen
|
||||||
|
%IF TEST_perror
|
||||||
|
lea rdi, [rel perror_fopen]
|
||||||
|
call perror
|
||||||
|
%ENDIf
|
||||||
mov r15, rax ;store filepointer to R15
|
mov r15, rax ;store filepointer to R15
|
||||||
mov rsi, rax
|
mov rsi, rax
|
||||||
xor rax, rax
|
xor rax, rax
|
||||||
@ -795,6 +834,10 @@ _start:
|
|||||||
mov rdi, r15
|
mov rdi, r15
|
||||||
lea rsi, [fileStr1]
|
lea rsi, [fileStr1]
|
||||||
call fwrite
|
call fwrite
|
||||||
|
%IF TEST_perror
|
||||||
|
lea rdi, [rel perror_fwrite]
|
||||||
|
call perror
|
||||||
|
%ENDIF
|
||||||
mov rsi, rax
|
mov rsi, rax
|
||||||
xor rax, rax
|
xor rax, rax
|
||||||
lea rdi, [rel msgFileB2]
|
lea rdi, [rel msgFileB2]
|
||||||
@ -803,6 +846,10 @@ _start:
|
|||||||
; TEST: fclose()
|
; TEST: fclose()
|
||||||
mov rdi, r15
|
mov rdi, r15
|
||||||
call fclose
|
call fclose
|
||||||
|
%IF TEST_perror
|
||||||
|
lea rdi, [rel perror_fclose]
|
||||||
|
call perror
|
||||||
|
%ENDIF
|
||||||
mov rsi, rax
|
mov rsi, rax
|
||||||
xor rax, rax
|
xor rax, rax
|
||||||
lea rdi, [rel msgFileB3]
|
lea rdi, [rel msgFileB3]
|
||||||
|
Reference in New Issue
Block a user