我正在阅读 Agner Fog 的一本手册,作为 64 位操作系统(超过 32 位)的优势,他说:
函数参数在寄存器中而不是在堆栈中传输。这使得函数调用更有效。
他是说堆栈根本不用于传递函数参数(64位操作系统)???
我正在阅读 Agner Fog 的一本手册,作为 64 位操作系统(超过 32 位)的优势,他说:
函数参数在寄存器中而不是在堆栈中传输。这使得函数调用更有效。
他是说堆栈根本不用于传递函数参数(64位操作系统)???
是的,这就是他所说的,但并不十分准确。可以使用堆栈,但前提是您的函数有很多参数(或者您编写的代码会强制溢出)。
如果您查看64 位英特尔调用约定的维基百科列表,您会看到寄存器用于传递前几个参数。有两个主要的 64 位 Intel 调用约定。对于 Microsoft ABI:
Microsoft x64 调用约定将寄存器 RCX、RDX、R8、R9 用于前四个整数或指针参数(按从左到右的顺序),而 XMM0、XMM1、XMM2、XMM3 用于浮点参数。附加参数被压入堆栈(从右到左)。如果 64 位或更少,则在 RAX 中返回整数返回值(类似于 x86)。浮点返回值在 XMM0 中返回。长度小于 64 位的参数不进行零扩展;高位包含垃圾。
和 System V ABI:
前六个整数或指针参数在寄存器 RDI、RSI、RDX、RCX、R8 和 R9 中传递,而 XMM0、XMM1、XMM2、XMM3、XMM4、XMM5、XMM6 和 XMM7 用于浮点参数......在 Microsoft x64 调用约定中,附加参数在堆栈上传递,返回值存储在 RAX 中。