【问题标题】:X86-64 passing float and int as argumentsX86-64 将 float 和 int 作为参数传递
【发布时间】:2023-03-16 12:50:01
【问题描述】:

将浮点数作为第一个参数传递给函数时,会设置 %xmm0 寄存器。如果我们想传递一个整数作为函数的第二个参数怎么办。 %rdi 或 %rsi 中的哪一个得到了参数?

例如 avg (float f, int i)

是否保留了顺序,以便 %rsi 获得 int?

编辑:这是一台 Ubuntu 机器。

【问题讨论】:

标签: linux assembly x86-64 calling-convention


【解决方案1】:

float args 在 x86-64 System V 调用约定中不会将 arg 传递槽从整数/指针 args 中取出。

重要的是i 是第一个整数/指针参数,它是传入 GP 寄存器的候选对象,因此它进入 RDI。 (其实EDI,RDI的高32位可以是垃圾。)

大型结构(在内存中传递)也不会占用 arg 传递槽,但小型结构会被打包到最多 2 个整数寄存器中。请参阅 ABI 文档,或者更简单地查看编译器输出。


相比之下,在 Windows x64 中,将 args 分配给寄存器的逻辑几乎完全不同,因为它们的调用约定做出了不同的设计选择(针对可变参数函数进行了优化,而不是普通函数的效率。 )

i 是第二个参数,因此可以在寄存器中传递。由于它是整数,它进入一个 GP 寄存器,特别是 RDX。 (实际上是 EDX)。 Windows x64 传递 RCX 或 XMM0、RDX 或 XMM1、R8 或 XMM2、R9 或 XMM3 中的前 4 个参数。

【讨论】:

    猜你喜欢
    • 2015-12-31
    • 1970-01-01
    • 2021-12-14
    • 2019-04-20
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多