Add perror() (currently only errors 1-34 from asm-generic/errno-base.h)

This commit is contained in:
2025-06-26 09:29:54 +02:00
parent fc28643c1a
commit 232d50576f
2 changed files with 109 additions and 2 deletions

View File

@ -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

View File

@ -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]