了解 C/C 中的调用约定
调用约定定义函数如何传递和接收参数及其值。 C/C 提供了多种调用约定,每种调用约定都有特定的用途。
调用约定的数量
C/C 中提供了多种调用约定,包括:
- cdecl
- syscall
- pascal
- stdcall
- fastcall
- vectorcall
- safecall
- Microsoft X64 调用约定
每个约定的含义
cdecl:
- 在堆栈上传递的参数。
- 寄存器被指定用于特定目的(EAX 用于返回值,EAX、ECX、EDX 用于调用者保存)。
syscall:
pascal:
- 按从左到右的顺序在堆栈上传递的参数。
- 负责堆栈清理的被调用者。
stdcall:
- 被调用者清理堆栈。
- 参数按从右到左的顺序压入,如 cdecl。
- 指定供内部函数使用的寄存器(EAX、ECX、EDX)。
fastcall:
- 在寄存器中传递的前两个参数(ECX 和 EDX)。
- 剩余参数从右到右压入堆栈左。
向量调用:
- 支持使用 SIMD 寄存器传递向量参数。
- 最多为向量参数分配 6 个寄存器.
safecall (Delphi/Free Pascal):
- 封装 COM 错误处理。
- 在 EAX 中作为异常返回HRESULT,而结果通过引用传递。
Microsoft X64 调用约定:
- 用于 Windows 和预启动 UEFI。
- 在寄存器中传递的前四个整数/指针参数(RCX、RDX、R8、R9)。
以上是调用约定如何影响 C/C 中函数参数的传递?的详细内容。更多信息请关注PHP中文网其他相关文章!