X86-64 将 float 和 int 作为参数传递
X86-64 passing float and int as arguments
当将浮点数作为第一个参数传递给函数时,%xmm0 寄存器被设置。如果我们想传递一个整数作为函数中的第二个参数怎么办。 %rdi 或 %rsi 中的哪一个得到参数?
例如
平均(浮动 f,整数 i)
是否保留顺序,以便 %rsi 获得 int?
编辑:这是一台 Ubuntu 机器。
float args 不会从 x86-64 System V 调用约定中的 integer/pointer args 带走 arg-passing 槽。
重要的是 i
是第一个 integer/pointer arg,它是传递 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 个参数。
当将浮点数作为第一个参数传递给函数时,%xmm0 寄存器被设置。如果我们想传递一个整数作为函数中的第二个参数怎么办。 %rdi 或 %rsi 中的哪一个得到参数?
例如 平均(浮动 f,整数 i)
是否保留顺序,以便 %rsi 获得 int?
编辑:这是一台 Ubuntu 机器。
float args 不会从 x86-64 System V 调用约定中的 integer/pointer args 带走 arg-passing 槽。
重要的是 i
是第一个 integer/pointer arg,它是传递 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 个参数。