c语言函数调用原理底层分析
1函数的功能主要是为了复用性,不同的属性可以参数化
2函数调用机制
2.1按调用约定传递参数
2.1调用约定
调用方(caller)和被调方(callee)需要约定以下内容:
1传参顺序
2传递参数的媒介(是放栈还是寄存器)
3清理参数的责任归属
4返回值的传递媒介(返回值是放栈还是寄存器)
__cdecl:传参顺序从右往左;
使用栈顶传递参数;
由调用方清理参数;
__stdcall:传参顺序从右往左;
使用栈顶传递参数;
由被调方清理参数;
__fastcall传参顺序从右往左;
左边前两个基本属性类型的参数通过处理器传递,其余各参数使用栈 顶传递参数;
由被调用方清理参数;
2.2保存函数返回地址
2.2.1流程转移到被调用方
2.3保存调用方的栈底
2.4设置当前栈顶为被调用方的栈底(此时被调方处于空栈状态)
2.5根据局部变量所需的总空间抬高栈顶(为局部变量分配空间)
2.6保存处理器环境(把调用方的处理器中的值复制到栈顶(不保存的话,调用方寄存 器的值会被被调方覆盖))
2.7debug选项组在此时设置局部变量的初值为0xcccccccc
2.8执行函数体
2.9恢复处理器的环境(把栈顶的值复制到处理器中)
2.10释放局部变量空间
2.11从栈顶取值恢复到调用方的栈底
2.12从栈顶取值作为返回地址
2.12.1__stdcall,__fastcal被调用方此时释放参数空间
2.13流程恢复到调用方的代码
2.13.1__cdecl调用方此时释放参数空间
这些流程可以用图表示,也可以在内存中查看栈的存放顺序如下图
内存中栈存放如下图