函数的调用约定
1、_cdecl C标准调用约定
2、_stdcall windows标准调用约定
3、_fastcall 快读调用约定
4、_thiscall 成员方法调用约定(本次不做详解)
那么函数的调用约定约定了哪些东西呢?
1、函数符号的生成。
2、实参的入栈顺序。
3、形参的开辟和清理方式。
实参的入栈顺序:
1、_cdecl:由右向左入栈。
2、_stdcall:由右向左入栈。
3、_fastcall:左边开始的两个不大于4字节(DWORD)的参数分别放在ECX和EDX寄存器,其余的参数仍旧自右向左压栈传送。
形参的开辟和清除方式:
1、_cdecl:由调用方开辟,函数调用结束后由函数调用者清除栈内数据。
2、_stdcall:由调用方开辟,函数调用结束后由被调用函数清除栈内数据。
3、_fastcall:最多使用两个寄存器来带入实参,其他参数与_stdcall调用约定的处理方式一样,即函数调用结束后由被调用函数清除栈内数据。
调用过程:
1、形参的初始化
2、压入下一行指令地址
3、压入调用方的栈底指针寄存器的值
4、移动ebp到被调用方栈底
5、开辟局部变量活动需要的栈空间,并初始化为cccc cccc。
返回值的返回方式
非类类型:
1、0字节 < 返回值 =< 4字节 eax寄存器带出
2、4字节 < 返回值 =< 8字节 eax和edx寄存器带出
3、返回值 > 8字节 由临时量带出来