zoukankan      html  css  js  c++  java
  • 函数栈帧问题

      函数调用另一个词语表示叫作过程。一个过程调用包括将数据和控制从代码的一部分传递到另一部分。另外,它还必须在进入时为过程的局部变量分配空间,并在推出时释放这些空间。而数据传递,局部变量的分配和释放通过操纵程序栈来实现。

      栈帧(stack frame),机器用栈来传递过程参数,存储返回信息,保存寄存器用于以后恢复,以及本地存储。为单个过程(函数调用)分配的那部分栈称为栈帧。栈帧其实是两个指针寄存器,寄存器%ebp为帧指针,而寄存器%esp为栈指针,当程序运行时,栈指针可以移动(大多数的信息的访问都是通过帧指针的)。总之简单一句话,栈帧的主要作用是用来控制和保存一个过程的所有信息的。栈帧结构如下所示:

          

      下面举个例子:

          

        运行结果:正常返回到main函数中的调用的地方

        

        修改一点代码:

       

        运行结果:直接运行了bug函数,没有返回到main函数

        

        简单画图分析一下:

        

        那么在不使用y变量名称的情况下,如何改变y的内容?很简单了~首先要知道的是参数入栈顺序是从右向左的,即y在上,x在下,令p指向x,指针p++,则p指向了y,再用*p去改变y的值就可以了。

        

          结果:

         

  • 相关阅读:
    数据库中的左连接(left join)和右连接(right join)区别
    ajax提交form表单资料详细汇总
    javaScript 删除确认实现方法总结分享
    web.xml文件配置详解以及实例说明
    java时间处理工具类--DateUtils
    Oracle安装后忘记用户名或密码+创建新登陆用户
    zabbix server 端安装
    zabbix 介绍
    nginx + uWSGI 为 django 提供高并发
    nginx-1.10.3 编译安装
  • 原文地址:https://www.cnblogs.com/guochuanrui/p/5613888.html
Copyright © 2011-2022 走看看