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
|
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 ---;
|
||||||
|
@ -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
|
||||||
|
Reference in New Issue
Block a user