Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 64位快速调用_Unix_64 Bit_X86 64_Stdcall_Fastcall - Fatal编程技术网

Unix 64位快速调用

Unix 64位快速调用,unix,64-bit,x86-64,stdcall,fastcall,Unix,64 Bit,X86 64,Stdcall,Fastcall,我一直在阅读32位呼叫约定的差异。fastcallvs.stdcall 从我所读到的内容来看,这两种约定有很大的混淆,64位被标准化以避免这种混淆 我不得不问,为什么选择了fastcall 另外,由于fastcall和stdcall都是win32术语,那么UNIX函数调用中使用或不使用寄存器传递参数的术语是什么?提供了一个列表 x86-32上的常见调用约定是cdecl。GCC提供了一个函数属性\uuuu attribute((regparm(n)),以指示n参数是通过寄存器传递的,但这与fast

我一直在阅读32位呼叫约定的差异。
fastcall
vs.
stdcall

从我所读到的内容来看,这两种约定有很大的混淆,64位被标准化以避免这种混淆

我不得不问,为什么选择了
fastcall

另外,由于
fastcall
stdcall
都是win32术语,那么UNIX函数调用中使用或不使用寄存器传递参数的术语是什么?

提供了一个列表

x86-32上的常见调用约定是
cdecl
。GCC提供了一个函数属性
\uuuu attribute((regparm(n))
,以指示
n
参数是通过寄存器传递的,但这与
fastcall
不同。无论哪种方式,参数都是在被调用方可关闭寄存器中传递的,因此相对于
cdecl
(对于
regparm
)和
stdcall
(对于
fastcall
)的函数调用没有额外的成本(并节省了为参数添加堆栈空间然后清除堆栈空间的工作量)


为了避免混淆,Windows和Linux上的x86-64调用约定既不同于x86-32上的约定,也不同于其他约定。两者都不是
fastcall
,尽管两者都使用大量寄存器来传递参数。

这不完全是fastcall,而是“我们还有8个寄存器,让我们使用它们吧”调用约定。@hansPassant使用寄存器进行arg传递确实没有什么好处,因为通常必须事先将寄存器备份到堆栈上。Fastcall风格的调用只在非常特定的情况下更快。您假设它们必须“备份”。总的来说,这不是一个正确的假设。代码生成器可以将它们视为抓取或从内存中重新加载。“让我们使用它们”计划不是“让我们全部使用它们”。@hansPassant。我想我看到更多的问题是“被调用方”无论如何都需要使用寄存器,并且必须在堆栈上备份args,除非它是一个非常简单的函数。没有“64位快速调用”这样的东西。fastcall纯粹是旧的32位x86的产物。我对BSD更感不安,因为他们总是使用基于堆栈的调用,这既简单又节省了CPU时间,因为您不需要事先备份寄存器。根据我对您所说内容的理解,64位似乎不需要寄存器传递?@Hawken:
regparm
fastcall
使用被调用方关闭的寄存器,因此即使在
cdecl
stdcall
下,它们也需要被调用方保存–会损失多少CPU时间?目前,C编译器没有使用非默认的x86-64调用约定。您可以查看和了解当前正在使用的内容。即使是FreeBSD开发手册也指出,注册传递速度较慢。我倾向于相信它们,因为FreeBSD开发人员可能有并排的寄存器/堆栈传递程序进行测试,因为他们经常移植Linux代码。此外,有人会假设您无论如何都需要将传递的值写入堆栈,因为您将在指令中使用
%e_x
寄存器。除非您的函数只调用另一个函数。