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 cmp byte [rdi], 0
je .finish je .finish
cmp byte [rdi], '%' cmp byte [rdi], '%'
je .repArg je .replaceArg
mov r12b, byte [rdi] mov r12b, byte [rdi]
mov byte [r11], r12b mov byte [r11], r12b
jmp .continue jmp .continue
.repArg: .replaceArg:
cmp byte [rdi+1], 0 cmp byte [rdi+1], 0
je .finish je .finish
cmp byte [rdi+1], 'd' cmp byte [rdi+1], 'd'
@ -71,34 +71,14 @@ printf:
je .rep_s je .rep_s
.rep_d: .rep_d:
;mov byte [r11], 'D' ;%d => Dd ;TODO
;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
jmp .continue jmp .continue
.rep_s: .rep_s:
push rdi
;mov byte [r11], 's' ;%s => Ss ;mov byte [r11], 's' ;%s => Ss
cmp r10, 0 cmp r10, 0
je .startInsert je .sinsertLoop ;nothing to do, rsi already correct
cmp r10, 1 cmp r10, 1
je .rep_s_rdx je .rep_s_rdx
cmp r10, 2 cmp r10, 2
@ -108,40 +88,39 @@ printf:
cmp r10, 4 cmp r10, 4
je .rep_s_r9 je .rep_s_r9
push rdi
sub rsp, 8
lea rdi, [rel printfBuff]
;get from stack ;get from stack
mov rsi, qword [rbp + r10*8] mov rsi, qword [rbp + r10*8]
.rep_s_rdx: .rep_s_rdx:
mov rsi, rdx mov rsi, rdx
jmp .startInsert jmp .sinsertLoop
.rep_s_rcx: .rep_s_rcx:
mov rsi, rcx mov rsi, rcx
jmp .startInsert jmp .sinsertLoop
.rep_s_r8: .rep_s_r8:
mov rsi, r8 mov rsi, r8
jmp .startInsert jmp .sinsertLoop
.rep_s_r9: .rep_s_r9:
mov rsi, r9 mov rsi, r9
.startInsert: .sinsertLoop:
mov rdi, rsi cmp byte [rsi], 0x0
call strlen je .s0f
mov r13, rax mov r13b, byte [rsi]
call strcat mov byte [r11], r13b
add r11, r13 inc rsi
add r10, 2 ;skip '%' and 'd/s' inc r11
add rsp, 8 jmp .sinsertLoop
.s0f:
inc r10
pop rdi pop rdi
inc rdi
.continue: .continue:
inc rdi inc rdi
inc r11 inc r11
jmp .makeStr jmp .makeStr
.finish: .finish:
mov byte [r11+1], 0x0 mov byte [r11], 0x0
lea rdi, [rel printfBuff] lea rdi, [rel printfBuff]
call print call print

View File

@ -29,24 +29,25 @@ extern fclose
extern fwrite extern fwrite
section .rodata section .rodata
PRINT_nums equ 1 PRINT_nums equ 0
PRINT_strs equ 1 PRINT_strs equ 1
TEST_print equ 1 TEST_print equ 0
TEST_puts equ 1 TEST_puts equ 0
TEST_min equ 1 ;includes minu TEST_printf equ 1
TEST_max equ 1 ;includes maxu TEST_min equ 0 ;includes minu
TEST_strlen equ 1 TEST_max equ 0 ;includes maxu
TEST_islower equ 1 TEST_strlen equ 0
TEST_isupper equ 1 TEST_islower equ 0
TEST_strcpy equ 1 TEST_isupper equ 0
TEST_strlcpy equ 1 TEST_strcpy equ 0
TEST_strclr equ 1 TEST_strlcpy equ 0
TEST_strlclr equ 1 TEST_strclr equ 0
TEST_strcat equ 1 TEST_strlclr equ 0
TEST_tolower equ 1 TEST_strcat equ 0
TEST_toupper equ 1 TEST_tolower equ 0
TEST_strcmp equ 1 TEST_toupper equ 0
TEST_file1 equ 1 TEST_strcmp equ 0
TEST_file1 equ 0
num1 dq 69 num1 dq 69
num2 dq 0xFFFFFF num2 dq 0xFFFFFF
@ -66,6 +67,9 @@ section .rodata
; puts() ; puts()
msgPuts db NL,NL,"# puts()",NL,EOS msgPuts db NL,NL,"# puts()",NL,EOS
msgPuts1 db "puts() test",EOS msgPuts1 db "puts() test",EOS
; printf()
msgPrintf db NL,"# printf()",EOS
msgPrintf1 db "TEST printf()",NL,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
@ -197,6 +201,12 @@ main:
lea rdi, [rel msgPuts1] lea rdi, [rel msgPuts1]
call puts call puts
%ENDIF %ENDIF
%IF TEST_printf
lea rdi, [rel msgPrintf]
call puts
lea rdi, [rel msgPrintf1]
call printf
%ENDIF
%IF TEST_min %IF TEST_min
lea rdi, [rel msgMin] lea rdi, [rel msgMin]
call puts call puts