x64asm 调用约定的一些注意点

查了下资料,调用约定在 x64asm 下似乎并没有一个完全统一的规范(x86下各家规范都是统一的)

x64asm 不像 x86asm,x64asm 是将参数存放于寄存器内传递的,如下

对于 GCC(参数小于7个的情况下)

f(a, b, c, d, e, f)
a->%rdi
b->%rsi
c->%rdx
d->%rcx
e->%r8
f->%r9

而 VC 就比较复杂了

浮点(floating-point)前 4 个参数 - XMM0 至 XMM3。 其他参数在堆栈上传递。
整数(integer)前 4 个参数 - RCX、RDX、R8、R9。 其他参数在堆栈上传递。
聚合(Aggregates)(8、16、32 或 64 位)和 __m64前 4 个参数 - RCX、RDX、R8、R9。 其他参数在堆栈上传递。
聚合(Aggregates)等, 通过指针前 4 个参数在 RCX、RDX、R8 和 R9 中作为指针传递。 其他参数在堆栈上作为指针传递。
__m128,通过指针前 4 个参数在 RCX、RDX、R8 和 R9 中作为指针传递。 其他参数在堆栈上作为指针传递。

更详细的说明在这里:https://docs.microsoft.com/zh-cn/cpp/build/x64-calling-convention?view=vs-2019

1 Comments (894 Views)

Leave a Reply

Your email address will not be published. Required fields are marked *