过程(栈帧结构是干货)

【0】写在前面

过程(栈帧结构是干货);本文总结于csapp, 加上自己的理解;

【1】栈帧结构

每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。

过程调用:函数调用另一个词语表示叫作过程;

IA32 程序 用程序栈 来支持过程调用;

【2】转移控制

(此处非常重要:关系到对函数调用和返回理解是否到位)
这里写图片描述
解说:显然是地址80483dc的call调用sum函数, call指令的效果是将返回地址0x080483e1压入栈中,再跳转到sum函数的第一条指令(0x0804394),直到遇到ret指令为止,即是说,ret指令是一个函数的结束标志;
call == push ip ; jmp near ptr 标号;(压栈后跳转)
ret == pop ip;(出栈)

【3】寄存器使用惯例

惯例——我们必须保证当一个过程(调用者)调用另一个过程(被调用者)时,
被调用者不会覆盖某个调用者稍后会使用的寄存器的值。
  • 寄存器%eax, %edx 和 %ecx 被划分为调用者保存寄存器。(意思就是左边3个寄存器实现覆盖时,需要保存到调用者的栈帧结构中)
  • 寄存器%ebx, %esi 和 edi 被划分为被调用者保存寄存器。(意思就是左边3个寄存器实现覆盖时,需要保存到被调用者的栈帧结构中)

看个荔枝:

int P(int x)
{int y = x * x;int z = Q(y);return y + z;
}

过程P在调用Q之前计算y, 但它必须保证y的值在Q返回后是可用的。有两个方法可以实现:

  • (1)Q调用之前,将y的值保存到调用者P的栈帧结构中;当Q返回时,过程P从栈中取出y的值;
  • (2)将y保存在被调用者Q所保存的寄存器中,如%ebx等3个寄存器;如果Q或者其他的程序要使用这个寄存器的话,先把该寄存器的值压入栈帧中,并在返回前恢复该值;(因为每个函数或过程都有栈帧结构,谁要使用保存y的寄存器,谁就把y保存在其对应的栈帧中)

【4】过程实例

函数A调用函数B有三个过程:(其实上述的转移控制的解说已经说的很清楚了)

  • (1)建立部分,初始化栈帧;(把call指令的下一条指令的地址压入栈帧结构)
  • (2)主体部分,执行过程的实际计算;(执行被调用函数或者过程)
  • (3)结束部分,恢复栈的状态,以及过程返回;(将call指令的下一条指令的地址出栈到ip 或者叫做程序计数器pc)
    这里写图片描述

我的观点 -干货:

(1)说说%ebp:

它其实是%esp的一个副本,作用在于记录每个执行函数或过程的栈帧结构的首地址(注意是每个函数或过程),如函数A调用函数B, 函数B的汇编代码的第一句就要把函数A的栈帧首地址压入栈,以便函数B结束标志ret指令执行前的一条指令,将其调用者——函数A的栈帧首地址弹回到%ebp;(参看上上图中的swap_add的汇编指令接近尾部部分)

为什么GCC分配从不使用的空间?

GCC 坚持一个X86编程指导方针,也就是一个函数使用的所有栈空间必须是16字节的整数倍;采用这个规则是为了保证访问数据的严格对齐。

再来看一个荔枝

这里写图片描述

执行时,%esp=0x800040, 而%ebp=0x800060, scanf返回后 的栈帧图结构, 如下:
这里写图片描述
干货-这里又是一个——很好的解释了C语言中的传值和传址的问题

为什么分配的栈帧空间中,还有没有被使用的?
这个问题,你不要问我了,自己多思考,答案就在附近,哈哈。


【5】递归过程

先看个荔枝(对于理解递归运算过程——至关重要)

这里写图片描述
这里写图片描述
干货-(这里, 你也可以看到, 对于参数n,它是存储在调用者的栈帧结构中的;从而解释了为什么取用参数的时候,都是%ebp+8;Bingo!)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

山东小学信息技术课本 python 五年级_山东教育出版社小学信息技术五年级上册教案 全册.doc...

山东教育出版社小学信息技术五年级上册教案 全册电子备课教学案学年度 第一学期学科 信息技术年级 五年级姓名教师个人备课情况统计一览表 项目?精备课二次备课课堂检测课后反思交流平台 篇数月份第( )月第( )月第( )月第( )月备注:为便于自查,此表由教…

apache ranger_Apache Ranger插件的美丽简洁

apache ranger如果您在这里,您已经知道什么是Apache Ranger 。 这是在Hadoop框架中管理安全性的最流行(即使不是唯一)的方法。 它与Active Directory,Kerberos和其他各种身份验证集成在一起,但是我认为最有趣的功能是其…

可重定位目标文件

【0】GCC将源代码转化成可执行代码的流程 (1)C预处理器cpp扩展源代码,插入所有用#include命令指定的文件,并扩展声明的宏;(2)编译器ccl产生两个源代码的汇编代码:*.s;&a…

经典颜色的RGB值

红 RED    品红Magenta(热情)    CMYK:C15 M100 Y20 K0   RGB: R207 G0 B112    洋红Carmine(大胆)   CMYK: C100 M0 Y60 K10   RGB: R215 G0 B64    宝石红Ruby(富贵)   CMYK…

python中for x in range_python教程:对 [lambda x: x*i for i in range(4)] 理解

题目:lst [lambda x: x*i for i in range(4)]res [m(2) for m in lst]print res实际输出:[6, 6, 6, 6]想要输出 [0, 2, 4, 6] 应该怎么改?如下:lst [lambda x, ii: x*i for i in range(4)]res [m(2) for m in lst]print res这…

adf.test_在ADF 12.2.1.3中使用基于JSON的REST Web服务

adf.test以前,我曾发布过有关在ADF中使用基于ADF BC的REST Web服务的信息。 现在,本文讨论使用通用数据控件使用基于JSON的REST Web服务。 您还可以查看有关Web服务的先前文章,以获取更多信息。 在ADF 12.2.1中使用应用程序模块快速创建SOA…

JSON字符串封装成Bean对象/JSON串反序列化成实体类对象/JSON字符串转换成Java对象

文章目录使用阿里巴巴的 JSON使用 ObjectMapperJSON字段与实体类属性不一致首先,我们建立一个实体类,这里简单定义了 name、sex、age 三个属性,以及 get、set、tostring方法。public class Student {private String name;private String sex;…

端到端的地址翻译(虚拟地址是怎样取到相应高速缓存的数据的?)

【0】写在前面-为什么需要虚拟存储器? 0.1)定义:虚拟存储器其实就是借用了磁盘地址空间,还记得当初我们安装CentOS,划分的swap 文件系统吗? 0.2)VM简化了链接和加载、代码和数据共享,以及应用…

python gevent教程_Python的gevent框架的入门教程

Python通过yield提供了对协程的基本支持,但是不完全。而第三方的gevent为Python提供了比较完善的协程支持。gevent是第三方库,通过greenlet实现协程,其基本思想是:当一个greenlet遇到IO操作时,比如访问网络&#xff0c…

qa/qc_专业QA如何实施可靠的CI / CD管道?

qa/qc过时的传统软件开发方法并不能接管不断升级的市场趋势,并且这些方法缺乏解决方案,无法解决引入“ 持续集成(CI)和持续交付(CD) ”的快速软件发布需求的增长。 除了CI / CD之外,您还需要具有…

程序员分类

1.优秀的debug能力 10K程序员:实现功能就不错了 20K程序员:编程我最牛,debug?我不太会! 30K程序员:编程有点慢,debug快速搞定,回家睡觉! 40K程序员:基本不写…

三菱q系列plc连接电脑步骤_三菱Q系列PLC与三菱变频器的CC-link通讯技术(我的学习笔记)...

三菱变频器可以通过CC-LINK的接线进行控制(但需要另购买选件FR-A7NC,这选件是与变频器配套的通讯适配器,插在三菱变频器的选件插槽中),从而可以减少接线提高效率减少错误,接CC-LINK只需4根线就可以完全控制…

react提交数据到数据库_React型关系数据库事务

react提交数据到数据库Spring Framework最近宣布将提供对React式事务管理的支持 。 让我们深入研究它对R2DBC(SQL数据库访问的React式规范)如何工作。 事务管理是一种模式,而不是特定于技术的。 从这个角度来看,它的属性和运行时…

实模式切换到保护模式,为什么要开启A20地址线(系统升级产生的兼容性问题)

【-1】写在前面: 以下部分内容总结于 http://blog.csdn.net/ruyanhai/article/details/7181842 complementary: 兼容性是指运行在前期CPU,如8086/8088上的的程序,也可以运行在其以后的处理器,如80286上; 【0】看看in…

Windows 记事本的 ANSI、Unicode、UTF-8 这三种编码模式有什么区别?

先来解释一下这三种编码的历史吧: ANSI:最早的时候计算机ASCII码只能表示256个符号(含控制符号),这个字符集表示英文字母足够,其中,我们键盘上可见的符号的编码范围是从32到126(大小…

python编程、abc最大值_Python中abc

import abc指定metaclass属性将类设置为抽象类,抽象类本身只是用来约束子类的,不能被实例化class Animal(metaclassabc.ABCMeta): # 统一所有子类的方法abc.abstractmethod # 该装饰器限制子类必须定义有一个名为talk的方法def say(self):print(‘动物基…

(实模式+保护模式)模式切换的过程步骤(代码+文字解析)

【0】写在前面 文末的个人总结是干货,前面代码仅供参考的,且source code from orange’s implemention of a os. ; ; pmtest2.asm ; 编译方法:nasm pmtest2.asm -o pmtest2.com ; %include "pm.inc" ; 常量, 宏, 以及一些说…

骆驼(camel)命名法_Apache Camel 3 –骆驼核心vs骆驼核心引擎(较小的核心)

骆驼(camel)命名法Camel团队目前正在忙于Apache Camel 3的开发。已经完成了许多工作,到目前为止,我们已经发布了3个里程碑版本。 下一个里程碑版本4具有一些出色的新创新功能,这些功能我将在接下来的几个月中发布。 该博客的主题是我们在将骆…

Maven的依赖插件

文章目录mvn dependency:copy-dependenciesmvn dependency:treemvn dependency:listmvn dependency:copy-dependencies 导出项目所依赖的所有 jar 包,默认导出到 target/dependency 目录中。 1.第一种方式 在命令终端中,进入 pom.xml 所在的目录&…

安装telnet_Flask干货:Memcached缓存系统——Memcached的安装

图 | 源网络文 | 5号程序员Memcached缓存系统是目前使用最广泛的高性能分布式内存缓存系统,是一个自由开源的高性能分布式内存对象缓存系统。国内外众多大型互联网应用都选择Memcached以提高网站的访问性能。缓存系统一般可以将一些不需要实时更新但是又极其消耗数据…