C++ 在64位操作系统上的寄存器中传输的功能参数?

C++ 在64位操作系统上的寄存器中传输的功能参数?,c++,c,assembly,x86-64,calling-convention,C++,C,Assembly,X86 64,Calling Convention,我正在阅读Agner Fog的一本手册,作为64位操作系统(超过32位)的优势,他说: 函数参数在寄存器中传输,而不是在 堆栈这使得函数调用更加高效 他是说堆栈根本不用于传递函数参数(64位操作系统)?是的,他是这么说的,但并不十分准确。堆栈可以使用,但只有在函数有很多参数(或者编写了强制溢出的代码)的情况下才可以使用 如果您查看,您将看到寄存器用于传递前几个参数。有两种主要的64位Intel调用约定。对于Microsoft ABI: Microsoft x64调用约定将寄存器RCX、RDX、R

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

函数参数在寄存器中传输,而不是在 堆栈这使得函数调用更加高效


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

是的,他是这么说的,但并不十分准确。堆栈可以使用,但只有在函数有很多参数(或者编写了强制溢出的代码)的情况下才可以使用

如果您查看,您将看到寄存器用于传递前几个参数。有两种主要的64位Intel调用约定。对于Microsoft ABI:

Microsoft x64调用约定将寄存器RCX、RDX、R8、R9用于前四个整数或指针参数(按从左到右的顺序),而XMM0、XMM1、XMM2、XMM3用于浮点参数。其他参数被推送到堆栈上(从右到左)。整数返回值(类似于x86)在小于等于64位时以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中,前四个参数被传输…..“CPU并没有影响这种行为,真的。调用约定只是一种约定。这是武断的,它们只是碰巧不同而已。您也可以在32位代码的寄存器中传递参数(例如,ARM就是这样做的),只是没有一个通用的Intel ABI可以这样做。这只是一个决定。我猜微软的人决定他们需要更多的来电记录。有不同的惯例并不是更好或更糟,它们只是不同而已。“ABI”代表“应用程序二进制接口”。编译器将根据目标ABI生成不同的代码,但实际上并非如此。目标是定义一个已编译代码可用于与其他已编译代码交互的接口,以便您的程序可以调用库中的函数。例如,相关: