x64asm 调用约定的一些注意点

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

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
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

Licensed under CC BY-NC-SA 4.0