printf(): Fetch args smarter (fetch from memory, slower, but also less opcodes/compares, and convenient for future;less repeatability)
This commit is contained in:
@ -54,6 +54,7 @@ section .rodata
|
||||
section .bss
|
||||
printfBuff resb bufferLength
|
||||
printfNBuff resb 32
|
||||
printfArgs resq 8*5
|
||||
section .text
|
||||
global print
|
||||
global puts
|
||||
@ -94,6 +95,12 @@ printf:
|
||||
push r14 ;current index of printfBuff
|
||||
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 r14, r14
|
||||
lea r11, [rel printfBuff]
|
||||
@ -131,22 +138,11 @@ printf:
|
||||
|
||||
;--- %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
|
||||
cmove rdi, r9
|
||||
je .convertInt
|
||||
|
||||
ja .d_fromStack
|
||||
mov rdi, [printfArgs + r10*8]
|
||||
jmp .convertInt
|
||||
.d_fromStack:
|
||||
mov rdi, qword [rbp + 16 + (r10-5)*8]
|
||||
|
||||
.convertInt:
|
||||
@ -171,22 +167,11 @@ printf:
|
||||
|
||||
;--- %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
|
||||
cmove rdi, r9
|
||||
je .charToStr
|
||||
|
||||
ja .c_fromStack
|
||||
mov rdi, [printfArgs + r10*8]
|
||||
jmp .charToStr
|
||||
.c_fromStack:
|
||||
mov rdi, qword [rbp + 16 + (r10-5)*8]
|
||||
|
||||
.charToStr:
|
||||
@ -198,21 +183,11 @@ printf:
|
||||
|
||||
;--- %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
|
||||
cmove rsi, r9
|
||||
je .insertLoop
|
||||
|
||||
ja .s_fromStack
|
||||
mov rsi, [printfArgs + r10*8]
|
||||
jmp .insertLoop
|
||||
.s_fromStack:
|
||||
mov rsi, qword [rbp + 16 + (r10-5)*8]
|
||||
|
||||
;--- Move fetched data to buffer ---;
|
||||
|
@ -252,7 +252,7 @@ _start:
|
||||
push 0
|
||||
push tS6
|
||||
push tS5
|
||||
push qword [num4]
|
||||
push qword [rel num4]
|
||||
call printf
|
||||
add rsp, 8*8
|
||||
mov rsi, rax
|
||||
|
Reference in New Issue
Block a user