Compiler construction 如何在堆栈上传递附加参数?

Compiler construction 如何在堆栈上传递附加参数?,compiler-construction,64-bit,nasm,calling-convention,Compiler Construction,64 Bit,Nasm,Calling Convention,假设我有一个有很多参数的函数,比如: int function(-6 integer arguments-, -8 double arguments-, int x, double y, int a, double b) { // skynet initiation code } 根据SystemV AMD64 ABI调用约定,前6个整数参数应在RDI、RSI、

假设我有一个有很多参数的函数,比如:

int function(-6 integer arguments-,
             -8 double arguments-,
             int x,
             double y,
             int a,
             double b) {
  // skynet initiation code
}
根据SystemV AMD64 ABI调用约定,前6个整数参数应在
RDI、RSI、RDX、RCX、R8、R9
寄存器中传递,前8个双参数应在
XMM0、XMM1、XMM2、XMM3、XMM4、XMM5、XMM6、XMM7
寄存器中传递(我相信?)

其余参数在堆栈上传递(顺序相反)。现在我想知道它们的传递顺序是什么?在上面的例子中,我是否按[b,a,y,x]的顺序传递它们?还是先传递所有整数参数,然后传递所有浮点参数?像[a,x,b,y]


我发现的大多数源代码只详细说明了如何传递整数参数,并跳过(或简要提及)浮点参数在XMM寄存器中传递。如果有人有一个很好的参考,我可以阅读更多的内容,那就太好了。

使用AMD64 ABI,在堆栈上传递的参数只需按相反的顺序传递,这样就可以很容易地找到第一个堆栈参数。它们没有被分成不同类型的内存参数。在必要时插入填充以保持堆栈插槽对齐(8字节)

请注意,与“整数”和“浮点”相比,有更多不同类型的参数。参数可以是指针、整数或太大而无法放入寄存器的浮点、整个结构(如果有足够的可用参数寄存器,可以递归分解)和其他特殊情况

Agner Fog保持了全面的;你也可以在其他地方找到ABI本身。(警告:这些文档不是教程。)