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

问题描述 投票:0回答:1

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

EG aug(float f,int和)

订单是否保留,以便%rsi将获得int?

编辑:这是一台Ubuntu机器。

linux assembly x86-64 calling-convention
1个回答
3
投票

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

重要的是i是第一个传递GP寄存器的整数/指针arg,所以它在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个参数。

© www.soinside.com 2019 - 2024. All rights reserved.