【问题标题】:How to pass additional arguments on the stack?如何在堆栈上传递其他参数?
【发布时间】: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


    【解决方案1】:

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

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

    Agner Fog 维护一个全面的guide to calling conventions;您还可以在 H.J. Lu's github repository 和其他地方找到 ABI 本身。 (警告:这些文档不是教程。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多