函数堆栈调用
对以下代码进行分析:
#include <stdio.h>
int sum(int a,int b)
{
int tmp = 0;
tmp = a + b;
return tmp;
}
int main()
{
int a = 10;
int b = 20;
sum(a,b);
return 0;
}
我们进入到这段代码的反汇编代码中进行分析
被调用方开辟栈过程:
形参初始化
压入下一行指令地址
压入被调用方的栈底指针寄存器的值
移动edp到被调用方的栈底
开辟局部变量活动需要的栈空间,并初始化为cccc
调用约定
约定 函数符号的生成
约定 实参入栈顺序
约定 形参的开辟和清理方式
__cdecl (c标准调用约定)
调用方开辟栈帧,调用方清理
__stdcall (windows标准调用约定)
调用方开辟,被调用方清理
__fastcall (快速调用约定)
最多使用两个寄存器来带入实参
其他参数和__stdcall调用约定的处理方式相同
__thiscall (成员方法的调用)
返回值的返回方式(内置类型)
返回值大于0小于等于4 eax带回
返回值大于4小于等于8 eax和ebx带回
返回值大于8 临时量带回
函数形参的默认值
1、从左向右 依次赋默认值
2、默认值 只能赋一次
3、一般在声明上赋值