参考: https://bbs.pediy.com/thread-224583.htm
整理成表格方便查询
- cdecl(C 规范),
- stdcall(WinAPI 默认),
- fastcall,
- ATPCS(ARM-Thumb Procedure Call Standard/ARM-Thumb 过程调用标准) ,
- thiscall(用于 C++ 中类成员函数)
X86 | X64 | ARM | AARCH64 | |
cdecl | 参数从右往左依次入栈,调用者实现栈平衡,返回值存放在 EAX 中。 | X | X | X |
stdcall | 参数从右往左依次入栈,被调用者实现栈平衡,返回值存放在 EAX 中。 | X | X | X |
fastcall | 参数 1~ 参数 2 分别保存在 ECX、EDX , 剩下的参数从右往左依次入栈, 被调用者实现栈平衡, 返回值存放在 EAX 中。 | 参数 1~ 参数 4 分别保存在 RCX、RDX、R8D、R9D , 剩下的参数从右往左依次入栈, 被调用者实现栈平衡, 返回值存放在 RAX 中。 | X | X |
thiscall | 参数从右往左依次入栈, this 指针存放 ECX 中, 被调用者实现栈平衡, 返回值存放在 EAX 中。 | 参数 1~ 参数 3 分别保存在 RDX、R8D、R9D 中, this 指针存放 RCX 中, 剩下的参数从右往左依次入栈, 被调用者实现栈平衡, 返回值存放在 RAX 中。 | (C++) 参数 1~ 参数 3 分别保存在 R1~R3 中, this 指针存放 R0 中, 剩下的参数从右往左依次入栈, 被调用者实现栈平衡, 返回值存放在 R0 中。 | (C++) 参数 1~ 参数 7 分别保存到 X1~X7 寄存器中, this 指针存放 X0 中, 剩下的参数从右往左依次入栈, 被调用者实现栈平衡, 返回值存放在 X0 中。 |
ATPCS | X | X | (C 语言) 参数 1~ 参数 4 分别保存到 R0~R3 寄存器中 , 剩下的参数从右往左依次入栈, 被调用者实现栈平衡, 返回值存放在 R0 中。 | (C 语言) 参数 1~ 参数 8 分别保存到 X0~X7 寄存器中 , 剩下的参数从右往左依次入栈, 被调用者实现栈平衡, 返回值存放在 X0 中。 |
调用约定
来源: http://www.bubuko.com/infodetail-3203947.html