将float作为第一个参数传递给函数时,%xmm0寄存器被设置。如果我们想要将整数作为函数中的第二个参数传递,该怎么办? %rdi或%rsi中的哪一个获得参数?
EG aug(float f,int和)
订单是否保留,以便%rsi将获得int?
编辑:这是一台Ubuntu机器。
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个参数。