函数堆栈调用过程:
(1)开辟形参内容并初始化
(2)压入下一行指令地址
(3)压入调用方栈底指针的值
(4)开辟局部变量所需要的栈空间并初始化
1、开栈:
压入实参 形参初始化 自右向左
压入下一行指令地址
压调用方的栈底地址
跳转到被调用方函数栈帧上
被调用方函数活动开辟空间 //给被调用方的活动开辟空间
2、清栈
清理空间
清理形参
3.函数返回值
函数的返回值由寄存器带出来
<= 4 eax
>4 <=8 eax edx
>8 临时量
4、四种调用约定
(1)_cdecl C标准调用约定 YA //?Sum@@YAHHH@Z
(2)_stdcall windows标准调用约定 YG //?Sum@@YGHHH@Z 自右向左依次入栈
(3)_fastcall 快速调用约定 YI //?Sum@@YIHHH@Z
(4)_thiscall 类成员调用约定
5、调用约定约定了
(1)函数符号的生成
(2)实参的入栈顺序
(3)形参的开辟和清理
_cdecl //形参的开辟由调用方开辟,调用方清理
_stdcall //调用方开辟,被调用方清理
_fastcall //没有形参开辟,如果有实参的压栈,调用方开辟,被调用方清理
6、形参的入栈顺序由右向左
支持可变参,从左向右不知道实参个数大小,从右向左,能遍历到最后面,表明已经知道了参数的个数
7、函数的运行都是在栈上开辟内存
对于栈上的访问都是通过栈底指针的偏移来访问的
8、在call一个函数时,有两件事要做:
先将调用函数的下一行指令的地址压入栈中;再进行跳转.