X64平台采用类似__fastcall的调用约定
以下:
函数的前四个参数(整数或者浮点)分别放在 rcx、rdx、r8、r9 里(r8b 是一个新增加的寄存器,长度为 1 字节,是 r8 的低 8 位, 同理r8d),从第五个参数开始放在堆栈里
RCX: 1st integer argument
RDX: 2nd integer argument
R8: 3rd integer argument
R9: 4th integer argument
[rsp+0x20] 4th integer argument
[rsp+0x28] 5th integer argument
[rsp+0x30] 6th integer argument
注意是调用者平衡堆栈, 类似cdecl(ps: x64平台统一了众多调用约定), 同时至少保留4个参数的栈空间0x20, 用于保存rcx,rdx,r8,r9的参数(当这几个寄存器有其他作用时)
以下:
sub rsp,xxxx //在这段内存中, 从低到高依次存放各个参数, 当然前32(0x20)个字节是固定分配的
void testx64();
000000013FF91030 push rdi
000000013FF91032 sub rsp,0x30 ; '0'
000000013FF91036 mov rdi,rsp
000000013FF91039 mov ecx,0xC
000000013FF9103E mov eax,0xCCCCCCCC
000000013FF91043 rep stosd
000000013FF91045 call