0x01 调用约定
调用约定规定了调用者和被调用者之间的栈上参数传递和清理。常见的有三种:cdecl、stdcall、fastcall。
在 x86 系统中的调用约定有:
- Cdecl:
- C 语言默认的调用约定
- 参数从右往左依次入栈
- 调用者栈平衡
- Stdcall
- 需要声明
- 参数从右往左依次入栈
- 被调用者栈平衡
- Fastcall
- 前两个参数放入ecx,edx,后面参数从右往左依次入栈
- 被调用者栈平衡
在 x64 系统中的调用约定只有 fastcall,其它调用约定均被舍弃,不存在了。
x64 与 x86 的 fastcall 的区别:
- x86 中使用了 ecx、edx 两个寄存器;x64 中除了 rcx、rdx 还多使用了 r8、r9 两个寄存器。
- x86 中参数入栈会对齐到 4 个字节;x64 中参数入栈会对齐到 8 个字节
- x64 中从左到右前 4 个参数虽存入寄存器中,但栈上依旧预留了四个空间
- x86 中由被调用者清栈;x64 中由调用者清栈
- 栈的大小必须是 16 字节的整数倍