我读昂纳雾手册之一,并为64位操作系统的优势(超过32位),他说:功能参数传输到64位操作系统的寄存器?
功能参数在寄存器传送,而不是 堆栈。这使得函数调用更有效率。
他说栈不是用来传递函数参数(64位操作系统)吗?
我读昂纳雾手册之一,并为64位操作系统的优势(超过32位),他说:功能参数传输到64位操作系统的寄存器?
功能参数在寄存器传送,而不是 堆栈。这使得函数调用更有效率。
他说栈不是用来传递函数参数(64位操作系统)吗?
是的,这就是他说的,但它不是很准确。可以使用堆栈可能,但前提是您的函数具有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中。
我想这与他说的另一种说法有关,64位Linux可以将更多参数传递到寄存器比Windows 64位? “在64位Linux中,前六个整数参数和前八个浮点参数被传送到寄存器中。在64位Windows中,前四个参数被传送......” – user997112
是的,这是正确的。 Linux使用SYSV ABI,它使用更多的寄存器来传递参数。 –
这是SYSV ABI在英特尔CPU中一直“隐藏”的东西,而Linux选择利用Windows而不是Windows? – user997112