printf() no longer crashes, can print string but now aborts after printing first string

This commit is contained in:
2025-06-25 11:31:01 +02:00
parent dcb2b8acae
commit 855487e857
2 changed files with 47 additions and 58 deletions

View File

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

View File

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