From 232d50576ffc26d981f3d2aaa0a64fb996bd3424 Mon Sep 17 00:00:00 2001 From: Kwarde Date: Thu, 26 Jun 2025 09:29:54 +0200 Subject: [PATCH] Add perror() (currently only errors 1-34 from asm-generic/errno-base.h) --- console.asm | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests.asm | 51 +++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 109 insertions(+), 2 deletions(-) diff --git a/console.asm b/console.asm index 1a00ad1..b6e1ec7 100644 --- a/console.asm +++ b/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 diff --git a/tests.asm b/tests.asm index 74fa95b..5a51bea 100644 --- a/tests.asm +++ b/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]