查了下资料,调用约定在 x64asm 下似乎并没有一个完全统一的规范(x86下各家规范都是统一的)
x64asm 不像 x86asm,x64asm 是将参数存放于寄存器内传递的,如下
对于 GCC(参数小于7个的情况下)
|
|
而 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