printf(): Fetch args smarter (fetch from memory, slower, but also less opcodes/compares, and convenient for future;less repeatability)

This commit is contained in:
2025-06-29 12:08:19 +02:00
parent 8ab78baa35
commit 9ea889dd12
2 changed files with 20 additions and 45 deletions

View File

@ -54,6 +54,7 @@ section .rodata
section .bss section .bss
printfBuff resb bufferLength printfBuff resb bufferLength
printfNBuff resb 32 printfNBuff resb 32
printfArgs resq 8*5
section .text section .text
global print global print
global puts global puts
@ -94,6 +95,12 @@ printf:
push r14 ;current index of printfBuff push r14 ;current index of printfBuff
push r15 ;where to return after flush push r15 ;where to return after flush
mov [printfArgs], rsi
mov [printfArgs+8], rdx
mov [printfArgs+16], rcx
mov [printfArgs+24], r8
mov [printfArgs+32], r9
xor r10, r10 xor r10, r10
xor r14, r14 xor r14, r14
lea r11, [rel printfBuff] lea r11, [rel printfBuff]
@ -131,22 +138,11 @@ printf:
;--- %d ---; ;--- %d ---;
.rep_d: .rep_d:
cmp r10, 0
cmove rdi, rsi
je .convertInt
cmp r10, 1
cmove rdi, rdx
je .convertInt
cmp r10, 2
cmove rdi, rcx
je .convertInt
cmp r10, 3
cmove rdi, r8
je .convertInt
cmp r10, 4 cmp r10, 4
cmove rdi, r9 ja .d_fromStack
je .convertInt mov rdi, [printfArgs + r10*8]
jmp .convertInt
.d_fromStack:
mov rdi, qword [rbp + 16 + (r10-5)*8] mov rdi, qword [rbp + 16 + (r10-5)*8]
.convertInt: .convertInt:
@ -171,22 +167,11 @@ printf:
;--- %c ---; ;--- %c ---;
.rep_c: .rep_c:
cmp r10, 0
cmove rdi, rsi
je .charToStr
cmp r10, 1
cmove rdi, rdx
je .charToStr
cmp r10, 2
cmove rdi, rcx
je .charToStr
cmp r10, 3
cmove rdi, r8
je .charToStr
cmp r10, 4 cmp r10, 4
cmove rdi, r9 ja .c_fromStack
je .charToStr mov rdi, [printfArgs + r10*8]
jmp .charToStr
.c_fromStack:
mov rdi, qword [rbp + 16 + (r10-5)*8] mov rdi, qword [rbp + 16 + (r10-5)*8]
.charToStr: .charToStr:
@ -198,21 +183,11 @@ printf:
;--- %s ---; ;--- %s ---;
.rep_s: .rep_s:
cmp r10, 0
je .insertLoop
cmp r10, 1
cmove rsi, rdx
je .insertLoop
cmp r10, 2
cmove rsi, rcx
je .insertLoop
cmp r10, 3
cmove rsi, r8
je .insertLoop
cmp r10, 4 cmp r10, 4
cmove rsi, r9 ja .s_fromStack
je .insertLoop mov rsi, [printfArgs + r10*8]
jmp .insertLoop
.s_fromStack:
mov rsi, qword [rbp + 16 + (r10-5)*8] mov rsi, qword [rbp + 16 + (r10-5)*8]
;--- Move fetched data to buffer ---; ;--- Move fetched data to buffer ---;

View File

@ -252,7 +252,7 @@ _start:
push 0 push 0
push tS6 push tS6
push tS5 push tS5
push qword [num4] push qword [rel num4]
call printf call printf
add rsp, 8*8 add rsp, 8*8
mov rsi, rax mov rsi, rax