功能参数在64位OS的寄存器中传输?

时间:2013-07-02 23:00:08

标签: c++ c assembly 64-bit cpu

我正在阅读Agner Fog的一本手册,作为64位操作系统(超过32位)的优势,他说:

  

函数参数在寄存器中而不是在寄存器中传输   堆。这使函数调用更有效。

他是说堆栈不用于传递函数参数(64位操作系统)???

1 个答案:

答案 0 :(得分:15)

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

如果查看wikipedia list of 64-bit intel calling conventions,您会看到寄存器用于传递前几个参数。有两种主要的64位英特尔调用约定。对于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中。