X86-64将float和int作为参数传递

时间:2019-03-22 04:29:09

标签: linux assembly x86-64 calling-convention

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

例如 avg(float f,int i)

是否保留了顺序,以便%rsi可以获取整数?

编辑:这是一台Ubuntu计算机。

1 个答案:

答案 0 :(得分:3)

float args不会在x86-64 System V调用约定中将args传递插槽与整数/指针args隔开。

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

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


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

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