2

我一直在阅读 32 位调用约定的差异。与磨难就是fastcallstdcall

根据我的阅读,这两种约定存在很大的混淆,并且 64 位被标准化以避免这种混淆。

我不得不问,为什么被fastcall选中?

另外,既然fastcallandstdcall是 win32 术语,那么 UNIX 术语中表示使用或不使用寄存器来传递参数的函数调用是什么?

4

1 回答 1

3

x86 Calling Conventions - 维基百科,免费的百科全书提供了一个列表。

x86-32 上的通用调用约定是cdecl. GCC 提供了一个函数属性__attribute__((regparm(n)))来指示n参数是通过寄存器传递的,但这与fastcall. cdecl无论哪种方式,参数都在被调用者可破坏的寄存器中传递,因此对于与(for regparm) 和stdcall(for )相关的函数调用,没有额外的成本(并且节省了为参数添加堆栈空间然后清理它的工作fastcall)。

为了帮助您混淆,Windows 和 Linux 上的 x86-64 调用约定与 x86-32 上的调用约定以及彼此不同。两者都不是fastcall,尽管两者都使用大量寄存器来传递参数。

于 2012-07-10T23:29:03.153 回答