Add support for %c in printf()

This commit is contained in:
2025-06-25 13:49:30 +02:00
parent 74178a6a2d
commit d0769f6ffc

View File

@ -69,6 +69,8 @@ printf:
push rdi push rdi
cmp byte [rdi+1], 'd' cmp byte [rdi+1], 'd'
je .rep_d je .rep_d
cmp byte [rdi+1], 'c'
je .rep_c
cmp byte [rdi+1], 's' cmp byte [rdi+1], 's'
je .rep_s je .rep_s
@ -118,12 +120,52 @@ printf:
pop rdx pop rdx
pop rcx pop rcx
mov rsi, rax mov rsi, rax
jmp .sinsertLoop jmp .insertLoop
;--- %c ---;
.rep_c:
cmp r10, 0
je .rep_c_rsi
cmp r10, 1
je .rep_c_rdx
cmp r10, 2
je .rep_c_rcx
cmp r10, 3
je .rep_c_r8
cmp r10, 4
je .rep_c_r9
;get from stack
mov rdi, qword [rbp + 16 + (r10-5)*8]
jmp .charToStr
.rep_c_rsi:
mov rdi, rsi
jmp .charToStr
.rep_c_rdx:
mov rdi, rdx
jmp .charToStr
.rep_c_rcx:
mov rdi, rcx
jmp .charToStr
.rep_c_r8:
mov rdi, r8
jmp .charToStr
.rep_c_r9:
mov rdi, r9
jmp .charToStr
.charToStr:
mov [printfNBuff], dil
mov dil, 0
mov [printfNBuff+1], dil
lea rsi, [rel printfNBuff]
jmp .insertLoop
;--- %s ---; ;--- %s ---;
.rep_s: .rep_s:
cmp r10, 0 cmp r10, 0
je .sinsertLoop ;nothing to do, rsi already correct je .insertLoop ;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
@ -135,28 +177,29 @@ printf:
;get from stack ;get from stack
mov rsi, qword [rbp + 16 + (r10-5)*8] mov rsi, qword [rbp + 16 + (r10-5)*8]
jmp .sinsertLoop jmp .insertLoop
.rep_s_rdx: .rep_s_rdx:
mov rsi, rdx mov rsi, rdx
jmp .sinsertLoop jmp .insertLoop
.rep_s_rcx: .rep_s_rcx:
mov rsi, rcx mov rsi, rcx
jmp .sinsertLoop jmp .insertLoop
.rep_s_r8: .rep_s_r8:
mov rsi, r8 mov rsi, r8
jmp .sinsertLoop jmp .insertLoop
.rep_s_r9: .rep_s_r9:
mov rsi, r9 mov rsi, r9
.sinsertLoop: ;--- Move fetched data to buffer ---;
.insertLoop:
cmp byte [rsi], 0x0 cmp byte [rsi], 0x0
je .s0f je .s0f
mov r13b, byte [rsi] mov r13b, byte [rsi]
mov byte [r11], r13b mov byte [r11], r13b
inc rsi inc rsi
inc r11 inc r11
jmp .sinsertLoop jmp .insertLoop
.s0f: .s0f:
inc r10 inc r10
pop rdi pop rdi