函数堆栈调用
/*
struct Tmp
{
int a;
int b;
int c;
};
struct Tmp fun2(int a, int b)
{
struct Tmp c;
c.a = a;
c.b = b;
c.c = a + b;
return c;
}
int main()
{
int a = 10;
int b = 20;
struct Tmp c;
c = fun2(a, b);
return 0;
}*/
1.函数栈帧的开辟:
- 压入实参 形参初始化 自右向左
- 压下一行指令地址
- 压调用方栈底地址
- 跳转到被调用方函数栈帧
- 被调用方函数活动开辟空间
2.返回值:
<=4字节 用寄存器eax带回
>4字节 <=8字节 用寄存器eax edx
>8字节 临时量(提前开辟内存)
3.调用约定:
_cdecl: C标准调用约定
_stdcall: windows标准调用约定
_fastcall: 快速调用约定
_thiscall: 类成员方法的调用约定
1.符号的生成
2.实参的入栈顺序
3.形参的开辟和清理方式
栈帧开辟 栈帧回退 参数清除
cdecl 调用方开辟 调用方回退 调用方做
stdeall 调用方开辟 调用方回退 被调用方做
fastcall 调用方开辟 调用方回退 被调用方做