2013-07-02 24 views

回答

13

是的,这就是他说的,但它不是很准确。可以使用堆栈可能,但前提是您的函数具有lot的参数(或者您编写强制泄漏的代码)。

如果您检查了wikipedia list of 64-bit intel calling conventions,您会看到寄存器用于传递前几个参数。有两种主要的64位英特尔调用约定。对于微软ABI:

微软64位调用约定使用寄存器RCX,RDX,R8,R9的前四个整数或指针参数(按顺序从左到右),和XMM0,XMM1,XMM2,XMM3用于浮点参数。其他参数被压入堆栈(从右到左)。如果64位或更少,整数返回值(类似于x86)将在RAX中返回。浮点返回值在XMM0中返回。长度小于64位的参数不是零扩展;高位包含垃圾。

而系统V ABI:

前六个整数或指针参数在寄存器传递RDI,RSI,RDX,RCX,R8和R9,而XMM0,XMM1,XMM2,XMM3 ,XMM4,XMM5,XMM6和XMM7用于浮点参数...与Microsoft x64调用约定一样,附加参数在堆栈上传递,返回值存储在RAX中。

+0

我想这与他说的另一种说法有关,64位Linux可以将更多参数传递到寄存器比Windows 64位? “在64位Linux中,前六个整数参数和前八个浮点参数被传送到寄存器中。在64位Windows中,前四个参数被传送......” – user997112

+0

是的,这是正确的。 Linux使用SYSV ABI,它使用更多的寄存器来传递参数。 –

+0

这是SYSV ABI在英特尔CPU中一直“隐藏”的东西,而Linux选择利用Windows而不是Windows? – user997112

相关问题