函数调用的过程分析

一、函数调用机制

局部变量占用的内存是在程序执行过程中”动态”地建立和释放的。这种”动态”是通过栈由系统自动管理进行的。当任何一个函数调用发生时,系统都要作以下工作:

  • 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;程序结束
 

猜你喜欢

转载自blog.csdn.net/weixin_48560325/article/details/128177335
今日推荐