函数的调用约定

函数的调用约定

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字节     由临时量带出来     

猜你喜欢

转载自blog.csdn.net/C_f_hhh/article/details/84072844