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