C/C 中的调用约定
在 C/C 中,采用不同的调用约定来确定参数如何传递给函数以及如何传递返回结果。这些约定规定了参数在堆栈或寄存器中放置的顺序和方法,以及堆栈清理的责任。
可用的调用约定
C/C提供多种调用约定,包括:
-
cdecl: 参数从右到左压入堆栈,并为调用者保存和被调用者保存的数据指定特定寄存器。
-
syscall: 与cdecl类似,但不保留某些寄存器并且需要传递参数列表的大小
-
pascal: 参数从左到右压入堆栈,被调用者负责堆栈平衡。
-
stdcall: pascal 的一种变体,其中被调用者处理堆栈清理,参数从右向左推送,如下所示cdecl.
-
fastcall:前两个参数在特定寄存器中传递,其余参数压入堆栈。
-
vectorcall:设计使用 SIMD 寄存器有效传递向量参数。
-
safecall:在 COM(组件对象模型)上下文中用于透明地处理异常。
-
Microsoft X64 调用约定: Windows 上使用的标准化约定,以及 x86-64 架构的预启动 UEFI,利用特定的寄存器用于参数和浮点值,并为堆栈使用“影子空间”
详细说明
有关这些调用约定的全面概述,请参阅以下资源:
- 维基百科: [C 呼叫约定](https://en.wikipedia.org/wiki/X86_calling_conventions)
- MSDN:[C 编译器的调用约定](https://docs.microsoft.com/en-us/cpp/build /x64-calling-convention)
- 英特尔:[英特尔® 64 和 IA-32 架构软件开发人员手册第 1 卷:基本架构](https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325383.pdf)
以上是不同的调用约定如何影响 C/C 中的函数参数传递和堆栈清理?的详细内容。更多信息请关注PHP中文网其他相关文章!