From 855487e857096bcdf6d5702b40ee890da79735f4 Mon Sep 17 00:00:00 2001 From: Kwarde Date: Wed, 25 Jun 2025 11:31:01 +0200 Subject: [PATCH] printf() no longer crashes, can print string but now aborts after printing first string --- console.asm | 61 ++++++++++++++++++----------------------------------- tests.asm | 44 +++++++++++++++++++++++--------------- 2 files changed, 47 insertions(+), 58 deletions(-) diff --git a/console.asm b/console.asm index 8665205..9492b34 100644 --- a/console.asm +++ b/console.asm @@ -58,11 +58,11 @@ printf: cmp byte [rdi], 0 je .finish cmp byte [rdi], '%' - je .repArg + je .replaceArg mov r12b, byte [rdi] mov byte [r11], r12b jmp .continue - .repArg: + .replaceArg: cmp byte [rdi+1], 0 je .finish cmp byte [rdi+1], 'd' @@ -71,34 +71,14 @@ printf: je .rep_s .rep_d: - ;mov byte [r11], 'D' ;%d => Dd - ;push rdi - cmp r10, 0 - je .rep_d_rsi - cmp r10, 1 - je .rep_d_rdx - cmp r10, 2 - je .rep_d_rcx - cmp r10, 3 - je .rep_d_r8 - cmp r10, 4 - je .rep_d_r9 - - ;get from stack - - .rep_d_rsi: - .rep_d_rdx: - .rep_d_rcx: - .rep_d_r8: - .rep_d_r9: - - inc r10 + ;TODO jmp .continue .rep_s: + push rdi ;mov byte [r11], 's' ;%s => Ss cmp r10, 0 - je .startInsert + je .sinsertLoop ;nothing to do, rsi already correct cmp r10, 1 je .rep_s_rdx cmp r10, 2 @@ -108,40 +88,39 @@ printf: cmp r10, 4 je .rep_s_r9 - push rdi - sub rsp, 8 - lea rdi, [rel printfBuff] - ;get from stack mov rsi, qword [rbp + r10*8] .rep_s_rdx: mov rsi, rdx - jmp .startInsert + jmp .sinsertLoop .rep_s_rcx: mov rsi, rcx - jmp .startInsert + jmp .sinsertLoop .rep_s_r8: mov rsi, r8 - jmp .startInsert + jmp .sinsertLoop .rep_s_r9: mov rsi, r9 - .startInsert: - mov rdi, rsi - call strlen - mov r13, rax - call strcat - add r11, r13 - add r10, 2 ;skip '%' and 'd/s' - add rsp, 8 + .sinsertLoop: + cmp byte [rsi], 0x0 + je .s0f + mov r13b, byte [rsi] + mov byte [r11], r13b + inc rsi + inc r11 + jmp .sinsertLoop + .s0f: + inc r10 pop rdi + inc rdi .continue: inc rdi inc r11 jmp .makeStr .finish: - mov byte [r11+1], 0x0 + mov byte [r11], 0x0 lea rdi, [rel printfBuff] call print diff --git a/tests.asm b/tests.asm index eb20381..450230f 100644 --- a/tests.asm +++ b/tests.asm @@ -29,24 +29,25 @@ extern fclose extern fwrite section .rodata - PRINT_nums equ 1 + PRINT_nums equ 0 PRINT_strs equ 1 - TEST_print equ 1 - TEST_puts equ 1 - TEST_min equ 1 ;includes minu - TEST_max equ 1 ;includes maxu - TEST_strlen equ 1 - TEST_islower equ 1 - TEST_isupper equ 1 - TEST_strcpy equ 1 - TEST_strlcpy equ 1 - TEST_strclr equ 1 - TEST_strlclr equ 1 - TEST_strcat equ 1 - TEST_tolower equ 1 - TEST_toupper equ 1 - TEST_strcmp equ 1 - TEST_file1 equ 1 + TEST_print equ 0 + TEST_puts equ 0 + TEST_printf equ 1 + TEST_min equ 0 ;includes minu + TEST_max equ 0 ;includes maxu + TEST_strlen equ 0 + TEST_islower equ 0 + TEST_isupper equ 0 + TEST_strcpy equ 0 + TEST_strlcpy equ 0 + TEST_strclr equ 0 + TEST_strlclr equ 0 + TEST_strcat equ 0 + TEST_tolower equ 0 + TEST_toupper equ 0 + TEST_strcmp equ 0 + TEST_file1 equ 0 num1 dq 69 num2 dq 0xFFFFFF @@ -66,6 +67,9 @@ section .rodata ; puts() msgPuts db NL,NL,"# puts()",NL,EOS msgPuts1 db "puts() test",EOS + ; printf() + msgPrintf db NL,"# printf()",EOS + msgPrintf1 db "TEST printf()",NL,EOS ; min() / minu() msgMin db NL,"# min() / minu()",EOS msgMin1 db "TEST min(num1, num2): %d",NL,EOS @@ -197,6 +201,12 @@ main: lea rdi, [rel msgPuts1] call puts %ENDIF +%IF TEST_printf + lea rdi, [rel msgPrintf] + call puts + lea rdi, [rel msgPrintf1] + call printf +%ENDIF %IF TEST_min lea rdi, [rel msgMin] call puts