sinsi,
Have a look at this one. Problem is it will only work with a stack frame but for thread safe procedures, it should do the job.
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
include \masm32\include64\masm64rt.inc
MLOCAL equ LOCAL ; the word LOCAL is ambiguous in a MACRO
; -----------------------------------------------------
; acnt (arg count) must match the number of 64 bit regs
; -----------------------------------------------------
REGSPACE MACRO acnt
MLOCAL r64[acnt] :QWORD
ENDM
; -----------------------------------------------------------
; arglist for both save and restore must be in the same order
; -----------------------------------------------------------
saveregs MACRO arglist:VARARG
cntr = 0
FOR var, <arglist>
mov r64[cntr], var
cntr = cntr + 8
ENDM
ENDM
restregs MACRO arglist:VARARG
cntr = 0
FOR var, <arglist>
mov var, r64[cntr]
cntr = cntr + 8
ENDM
ENDM
; -----------------------------------------------------------
.code
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
entry_point proc
rcall regtest
waitkey
.exit
entry_point endp
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
regtest proc
REGSPACE 8 ; allocate stack space for 64 bit registers
saveregs r12,r13,r14,r15,rsi,rdi,rbp,rbx
; do it all here !
restregs r12,r13,r14,r15,rsi,rdi,rbp,rbx
ret
regtest endp
; ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
end
comment #
sub_140001037 proc
.text:0000000140001037 C8800000 enter 0x80, 0x0
.text:000000014000103b 4881ECA0000000 sub rsp, 0xa0
.text:0000000140001042 4C89A560FFFFFF mov qword ptr [rbp-0xa0], r12
.text:0000000140001049 4C89AD68FFFFFF mov qword ptr [rbp-0x98], r13
.text:0000000140001050 4C89B570FFFFFF mov qword ptr [rbp-0x90], r14
.text:0000000140001057 4C89BD78FFFFFF mov qword ptr [rbp-0x88], r15
.text:000000014000105e 48897580 mov qword ptr [rbp-0x80], rsi
.text:0000000140001062 48897D88 mov qword ptr [rbp-0x78], rdi
.text:0000000140001066 48896D90 mov qword ptr [rbp-0x70], rbp
.text:000000014000106a 48895D98 mov qword ptr [rbp-0x68], rbx
.text:000000014000106e 4C8BA560FFFFFF mov r12, qword ptr [rbp-0xa0]
.text:0000000140001075 4C8BAD68FFFFFF mov r13, qword ptr [rbp-0x98]
.text:000000014000107c 4C8BB570FFFFFF mov r14, qword ptr [rbp-0x90]
.text:0000000140001083 4C8BBD78FFFFFF mov r15, qword ptr [rbp-0x88]
.text:000000014000108a 488B7580 mov rsi, qword ptr [rbp-0x80]
.text:000000014000108e 488B7D88 mov rdi, qword ptr [rbp-0x78]
.text:0000000140001092 488B6D90 mov rbp, qword ptr [rbp-0x70]
.text:0000000140001096 488B5D98 mov rbx, qword ptr [rbp-0x68]
.text:000000014000109a C9 leave
.text:000000014000109b C3 ret
sub_140001037 endp
#