C++:提高篇: 栈-寄存器和函数状态:栈指针帧指针详解

news2024/11/25 13:35:18

栈指针和帧指针

  • 前言
  • 1、EBP和ESP详解
  • 2、push ,leave ,call汇编指令分析
  • 3、下面用一个图总结

前言

🚗🚗🚗:在刚接触 ESP和EBP概念时,我一直认为:ESP指向栈顶指针,EBP指向栈底指针,其实这么理解,只对了一半,如果这个栈只有一个 栈帧,那么上述理解就是正确的,如果这个栈再复杂点,存在多个栈帧,那么这个理解就存在问题了。
🛺🛺🛺:EBP不是指向栈底指针,而是指向 栈帧的底部,同样 ESP不是指
向栈的栈顶指针,而是指向 栈帧的顶部。
🚌🚌🚌:

  1. ESP:栈指针寄存器(extended stack pointer):内存存放着一个指针,这个指针永远指向系统栈最上面一个栈帧的栈顶。
  2. EBP:基址指针寄存器(extended base pointer):其内存存放着一个指针,这个指针永远指向系统栈上面一个栈栈的底部。

1、EBP和ESP详解

🛫🛫 1. %ebp叫帧指针,既然叫帧指针,那就是说它是用来存放各帧首地址的指针。
🛬🛬 2. 一个存储单元空间,有两个属性。

1:CPU访问这个存储单元需要依赖的地址值。
2:这个存储单元所存储的数值。

🚀🚀 3. 函数的帧,每个帧首作为存储单元空间,有标识自己的空间地址,同时这个空间地址也存储一个数值。

🚀🚀4. 栈帧灵活运用这个概念,让%ebp始终保存 当前帧首地址。在执行调用者函数caller 时,%ebp 保存这个帧首地址, 而当调用子函数时,子函数callee更细为当前帧,%ebp保存 子函数帧首地址(为了让子函数在返回时,更新%ebp, 使帧指针能顺利回到调用者caller的帧来),所以有必要在 %ebp指向 callee帧首的同时,更改帧首空间内所保存的值为 caller帧首地址, 这个就是概念:“被保存的%ebp” 或者“旧的%ebp值”,父函数(caller)调用时%ebp的值

🚀🚀5. 而%esp 保存 返回地址(这个返回地址就是子函数返回后,父函数需要执行下一条指令的地址)

2、push ,leave ,call汇编指令分析

在下面一段源代码中:

using namespace std;
int son_add(int a,int b) {
    return a+b;  
}

int father(){
    int a = 1;
    int b = 2;
    int sum = 0;
    sum = son_add(a,b);
    return sum;
}

int main(){
    father();
    return 0;
}

在这里插入图片描述
上述代码我从汇编指令角度做三方面分析:分别是 call , push ,leave

  1. call指令:call 指令可以看成近似如下操作,先 :push 返回地址(caller函数),%esp 、然后:jmp 子函数地址。当两个参数入栈完成后,接着就是 father函数的 返回地址(这个地址在子函数返回后,father函数下一条指令就是这个地址),至此函数调用的准备工作完成,可以通过指令jmp 调整到 add_son函数
  2. push %ebp: 在这条语句之前,它保存的是 father的帧首地址,当这条语句执行进行压栈时,push &ebp会使得该帧首地址被顺利放进 “返回地址”单元下面。并且此时:栈帧转移到 add_son的栈帧势力范围内,且又是栈顶,那么%esp就可以存储这个帧首地址***(旧的%ebp地址)***
  3. mov %esp,%ebp:将步骤2 %esp保存的栈顶地址赋值给 %ebp,所以son_add 函数返回前,%ebp作为当前的帧首就不会改变了。
  4. pop %rbp:这个指令实际会做下面两个指令

pop %rbp 等价于下面两个指令
1:move %ebp, %esp
2: pop %ebp
👏👏👏其中指令1完成这个功能 :
修改 %esp的值,让它指向 %ebp 而%ebp就是add_son的帧首地址,这样就完成了这个过程:%esp指向 father的返回地址。
👏👏👏👏 指令2完成这个功能
弹出%ebp即读取它存的数值,而它存的数值就是father的帧首地址。
经过这两个指令就破坏了 son_add 栈帧结构,并且回到了 father栈帧结构。

3、下面用一个图总结

在这里插入图片描述

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

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

相关文章

为什么说百度下个月推出文心一言会被ChatGPT完全碾压

作者,姚远: Oracle ACE(Oracle和MySQL数据库方向)华为云MVP 《MySQL 8.0运维与优化》的作者中国唯一一位Oracle高可用大师拥有包括 Oracle 10g和12c OCM在内的20数据库相关认证。曾任IBM公司数据库部门经理现在一家第三方公司任首…

操作系统——2.操作系统的特征

这篇文章,我们来讲一讲操作系统的特征 目录 1.概述 2.并发 2.1并发概念 2.1.1操作系统的并发性 3.共享 3.1共享的概念 3.2共享的方式 4.并发和共享的关系 5.虚拟 5.1虚拟的概念 5.2虚拟小结 6.异步 6.1异步概念 7.小结 1.概述 上一篇文章,我们…

实时数据仓库

1 为什么选择kafka? ① 实时写入,实时读取 ② 消息队列适合,其他数据库受不了 2 ods层 1)存储原始数据 埋点的行为数据 (topic :ods_base_log) 业务数据 (topic :ods_base_db) 2)业务数据的有序性&#x…

论文阅读 - Early Detection of Fake News by Utilizing the Credibility of News

论文链接:https://arxiv.org/pdf/2012.04233.pdf 目录 摘要 1 简介 2 相关工作 2.1 基于特征的方法 2.2 深度学习方法 3 问题表述 4 拟议的框架 4.2 用户可信度预测 4.3 虚假新闻分类 4.3.1 新闻内容表示 4.3.2 融合注意力单元 5 实验 5.1 数…

工厂模式--设计模式

分类: 1、简单工厂:可根据自变量的不同返回不同类的实例 应用:将类名和类的全路径放入到配置文件,通过文件流将内容读取放入到map集合中保存,通过反射读取类全路径读取到该类,然后调用类方法。 详细设计&…

山东大学2022算法期末

接力:山东大学2021算法期末 2022 SDU算法导论期末考试 2020 计科 计算题 三道 35’ (1) 画BFS树 (2) 做DFS说明各种边的分类使用floyd或者矩阵乘法求全源最短路,求最短路矩阵以及前驱矩阵(3个点,比较友好,应该没有…

idea推送镜像到desktop报错:Cannot run program “docker-credential-desktop“ 系统找不到指定的文件。

windows Docker 搭建仓库 打开docker desktop 。 打开windows cmd窗口或powershell窗口。 输入"docker run -d -p 5000:5000 --name test registry:2 "运行一个名字叫test的registry容器。 idea配置springboot项目的docker插件 在pom.xml中的plugins中加入下面代码…

Kaldi语音识别技术(五) ----- 特征提取

Kaldi语音识别技术(五) ----- 特征提取 文章目录Kaldi语音识别技术(五) ----- 特征提取一、识别流程二、MFCC特征提取概述三、文件格式文件格式说明提取部分数据修复提取数据提取剩余部分数据四、特征提取特征提取—C特征提取—并行提取特征提取—特征查看五、CMVNCMVN—脚本CM…

SpringMVC执行流程(面试题)

SpringMVC是Spring框架中的组成成员之一,是一个针对于Web开发的一个类似于Servlet技术的一个web应用框架,它包含了MVC架构的特点,让Web变得更加简单。在SpringMVC框架中,一个比较核心的组件就是他的前端控制器,这个前端…

sql复习(子查询、创建和管理表)

一、子查询 子查询 (内查询) 在主查询之前一次执行完成 子查询的结果被主查询(外查询)使用 1.单行子查询 只返回一行,使用单行比较操作符。 --谁的工资比Able高? select last_name,salary from employees where salary > (select salaryfrom empl…

idea插件生成dao类service类controller类以及mapper.xml

idea插件生成dao类service类controller类以及mapper.xml 安装插件Easycode和MybatisX,不用自己写代码 1.Files——》Settings——》Plugins,分别搜索Easycode和MybatisX,点击下载。 2.新建一个springboot模板,选择的依赖如下 3.…

初探Spring采用Spring配置文件管理Bean

文章目录Spring容器演示--采用Spring配置文件管理Bean(一)创建Maven项目(二)添加Spring依赖(三)创建杀龙任务类(四)创建勇敢骑士类(五)采用传统方式让勇敢骑士…

JAVA内存模型(JMM)

JMM一、JMM——原子性-(synchronized)二、JMM——可见性-问题2.1 退不出的循环2.2 可见性——解决2.3 可见性三、JMM——有序性-问题3.1 诡异的结果3.2 解决方法3.3 有序性理解3.4 happens-beforeJMM 即 Java Memory Model,简单地说,JMM定义了一套在多线…

JVM - 字节码执行引擎

目录 栈帧和局部变量表 概述 栈帧概述 栈帧概念结构 局部变量表 slot是复用的实例 操作数栈 概述 动态连接 方法调用 静态分派和动态分派 栈帧和局部变量表 概述 JVM的字节码执行引擎,功能基本就是输入字节码文件,然后对字节码进行解析并处理…

jdk19下载与安装教程(win10)超详细

一、下载安装步骤 1、官网下载还需要注册,可以点【我的网盘】目录下载,目录也有其它低版本的,如果有需要大家根据需要自行选择。 2、下载后直接点击安装程序,点击【运行】。这里我使用的是64位的。 3、点击【下一步】。 4、默认安…

28-Golang中的数组

Golang中的数组数组介绍数组的定义和内存布局数组的定义数组的内存图数组 的使用访问数组元素案例四种初始化的方式for-range结构遍历基本语法说明案例数组使用注意事项和细节数组应用案例1.创建一个byte类型的26个元素的数组,分别放置A-Z。使用for循环访问所有元素…

分享SEO优化的8个技巧

什么是SEO? SEO是Search Engine Optimization的缩写,直译过来就是“搜索引擎优化”的意识。故名意思,SEO是一种优化(提高)网站在搜索引擎内的自然排名的行为的统称。 当里个当,当里个当,闲言碎语不要讲&a…

Web应用程序自动化测试工具Selenium的主要功能有哪些?

Selenium是一个用于Web应用程序测试的工具。是一个开源的Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium可以直接运行在浏览器上,它支持…

VSCode最新版本下载安装详细教程(win10)

VSCode是Microsoft发布的一款运行于多个操作系统,针对于编写现代Web和云应用的跨平台的源代码编辑器, 可在桌面上运。它具有对JavaScript,TypeScript和Node.js的内置支持,并具有丰富的其他语言(例如C,C&…

vue-echarts实现多功能图表

前言作为前端人员,日常图表、报表、地图的接触可谓相当频繁,今天小编隆重退出前端框架之VUE结合百度echart实现中国地图各种图表的展示与使用;作为“你值得拥有”专栏阶段性末篇,值得一看主要实现功能——中国地图——环形图——折…