一、函数调用机制
局部变量占用的内存是在程序执行过程中”动态”地建立和释放的。这种”动态”是通过栈由系统自动管理进行的。当任何一个函数调用发生时,系统都要作以下工作:
- 1)建立栈帧空间;
- 2)保护现场: 主调函数运行状态和返回地址入栈;
- 3)为被调函数传递数据(进行实参和形参的结合),同时形参获得存储空间;接着给局部变量分配空间;
- 4)执行被调函数函数体;
- 5)当被调函数执行完成, 释放被调函数中局部变量否用的栈空间;
- 6)恢复现场: 取主调函数运行状态及返回地址,释放栈帧空间;
- 7)继续主调函数后续语句。
二、示例
通过如下代码进行“一”的分析:
1、代码如下
2、整体代码运行汇编代码
首先进入主函数,系统为主函数开辟一个栈帧,依次入栈 x=10(占4字节),y=20(占4字节),res=0(占4字节),执行到z=fun(x,y);调用子函数fun(),开辟子函数fun的栈帧,先将y的值赋值给b,b=20入栈,然后将x的值赋值给a,a=10入栈,然后将主函数的栈底指针入栈,然后将主函数z=fun(x,y);后的指令地址也进行入栈,称为现场保护。然后将a+b的值30赋值给c,将c=30入栈。子函数此时执行到return c; 系统将30这个值寄存到eax寄存器中,然后将eax寄存器的值30赋值给主函数的res。然后将z=fun(x,y)后的指令地址和主函数的栈底指针恢复给主函数,称为现场恢复,主函数执行printf("%d ",z); return 0;程序结束