【发布时间】:2019-08-05 10:25:51
【问题描述】:
想象一下我有一个带有很多参数的函数,像这样:
int function(-6 integer arguments-,
-8 double arguments-,
int x,
double y,
int a,
double b) {
// skynet initiation code
}
根据 System V AMD64 ABI 调用约定,前 6 个整数参数应在 RDI, RSI, RDX, RCX, R8, R9 寄存器中传递,前 8 个双精度参数应在 XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7 寄存器中传递(我相信?)。
其余参数在堆栈上传递(以相反的顺序)。现在我想知道它们应该以什么顺序传递?在上面的示例中,我是否将它们按顺序传递为 [b,a,y,x]?还是我先传递 all 整数参数,然后 然后 传递所有浮点参数?喜欢 [a,x,b,y]?
我发现大多数资料只详细说明了如何传递整数参数并跳过(或简要提及)浮点参数是在 XMM 寄存器中传递的。如果有人有一个很好的参考资料,我可以阅读更多内容。
【问题讨论】:
标签: compiler-construction 64-bit nasm calling-convention