参考: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 中。 |