Hello,
Here is an example of a 64-bit variadic function. It's a simple wsprintf emulator accepting only the symbol % as format specifier.
; wsp V1.6 by Vortex - simple wsprintf emulator for NULL terminated strings
; Return value : eax holds the length of the string in the buffer
.data
wsp_table db 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.code
OPTION PROLOGUE:NONE
OPTION EPILOGUE:NONE
wsp PROC buffer:DWORD,format:DWORD,args:VARARG
; rcx -> buffer
; rdx -> format
; r8 -> args
sub rsp,8
mov QWORD PTR [rsp],rsi
mov QWORD PTR [rsp+8+8],rcx
mov QWORD PTR [rsp+24+8],r8
mov QWORD PTR [rsp+32+8],r9
lea r8,[rsp+24+8]
mov r9,1
sub rcx,r9
mov r11,OFFSET wsp_table
sub rdx,r9
@@:
add rcx,r9
loop1:
add rdx,r9
movzx rax,BYTE PTR [rdx]
mov BYTE PTR [rcx],al
cmp BYTE PTR [r11+rax],r9b
jne @b
test rax,rax
jnz @f
mov rax,rcx
sub rax,QWORD PTR [rsp+8+8]
mov rsi,QWORD PTR [rsp]
add rsp,8
db 0C3h ; ret
@@:
mov r10,QWORD PTR [r8]
xor rsi,rsi
@@:
movzx rax,BYTE PTR [r10+rsi]
mov BYTE PTR [rcx+rsi],al
add rsi,r9
test rax,rax
jnz @b
lea rcx,[rcx+rsi-1]
add r8,8
jmp loop1
wsp ENDP
OPTION PROLOGUE:PrologueDef
OPTION EPILOGUE:EpilogueDef
END