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

use*_*112 9 c c++ cpu 64-bit assembly

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

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

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

Car*_*rum 16

是的,这就是他所说的,但它并不准确.堆栈可以被使用,但只有当你的功能有很多的参数(或者你写的强制溢出代码).

如果你查看维基百科的64位英特尔调用约定列表,你会看到寄存器用于传递前几个参数.有两种主要的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中.