【汇编语言】寄存器(内存访问)(七)—— CPU提供的栈机制

在这里插入图片描述

文章目录

  • 前言
  • 1. CPU提供的栈机制
  • 2. push指令
  • 3. 问题
  • 4. 问题的分析与解答
  • 5. pop指令
  • 结语

前言

📌

汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅从课程的角度出发就太片面了,其实学习汇编语言可以深入理解计算机底层工作原理,提升代码效率,尤其在嵌入式系统和性能优化方面有重要作用。此外,它在逆向工程和安全领域不可或缺,帮助分析软件运行机制并增强漏洞修复能力。

本专栏的汇编语言学习章节主要是依据王爽老师的《汇编语言》来写的,和书中一样为了使学习的过程容易展开,我们采用以8086CPU为中央处理器的PC机来进行学习。

1. CPU提供的栈机制

现今的CPU中都有栈的设计,8086CPU也不例外。8086CPU提供相关的指令来以栈的方式访问内存空间。这意味着,在基于8086CPU编程的时候,可以将一段内存当作栈来使用

8086CPU提供入和出栈指令,最基本的两个是PUSH(入栈)和POP(出栈)

比如,push ax 表示将寄存器ax中的数据送入栈中,pop ax 表示从栈顶取出数据送入 ax。

8086CPU的入栈和出栈操作都是以字为单位进行的。

举例说明:

下面举例说明,我们可以将10000H-1000FH这段内存当作栈来使用。下图描述了下面一段指令的执行过程。

在这里插入图片描述

注意,字型数据用两个单元存放,高地址单元存放高8位,低地址单元存放低8位

大家看到上图所描述的 push 和 pop指令的执行过程,是否有一些疑惑?

总结一下,大概是这两个问题。

  • 其一,我们将10000H-1000FH这段内存当作来使用,CPU执行push和pop令时,将对这段空间按照栈的后进先出的规则进行访问。但是,一个重要的问题是,CPU如何知道10000H-1000FH这段空间被当作栈来使用?
  • 其二,push ax等入栈指令执行时,要将寄存器中的内容放入当前栈顶单元的上方,成为新的栈顶元素;pop ax等指令执行时,要从栈顶单元中取出数据,送入寄存器中。显然,push、pop在执行的时候,必须知道哪个单元是栈顶单元,可是,如何知道呢?

这不禁让我们想起之前另外一个讨论过的问题,就是,CPU如何知道当前要执行的指令所在的位置?我们现在知道答案,那就是CS、IP中存放着当前指令的段地址和偏移地址。

现在的问题是:CPU如何知道栈顶的位置?显然,也应该有相应的寄存器来存放栈顶的地址,8086CPU中,有两个寄存器,段存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中任意时刻,SS:SP指向栈顶元素。push指令和pop指令执行时,CPU从SS和SP中得到栈顶的地址。

2. push指令

现在,我们可以完整地描述push和pop指令的功能了,例如push ax。

push ax的执行,由以下两步完成。

(1)SP=SP-2,SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶

(2)将ax中的内容送入 SS:SP指向的内存单元处,SS:SP 此时指向新栈顶。

下图描述了8086CPU 对 push 指令的执行过程。

在这里插入图片描述

从图中我们可以看出,8086CPU中,入栈时,栈顶从高地址向低地址方向增长。

3. 问题

如果将10000H-1000FH这段空间当作,初始状态栈是空的,此时,SS=1000H,SP=?

思考后看分析。

4. 问题的分析与解答

SP=0010H,如下图所示。

在这里插入图片描述

我们将10000H-1000FH这间当作栈段,SS=1000H,空间大小为16字节,最底部的字单元地址为1000:000E。任意时刻,SS:SP指向顶,当中只有一个元素的时候,SS=1000H,SP=000EH。

栈为空,就相当于中唯一的元素出栈,出后SP=SP+2,SP原来为000EH,加2后SP=10H,所以,当为空的时候,SS=1000H,SP=10H。

换一个角度看,任意时刻,SS:SP指向栈顶元素,当栈为空的时候,栈中没有元素,也就不存在栈顶元素,所以SS:SP只能指向栈的最底部单元下面的单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2,栈最底部字单元的地址为1000:000E,所以栈空时,SP=0010H。

5. pop指令

接下来,我们描述pop指令的功能,例如pop ax。

pop ax的执行过程和 push ax 刚好相反,由以下两步完成。

(1)将SS:SP指向的内存单元处的数据送入ax中

(2)SP=SP+2,SS:SP指向当前栈顶下面的单元,以当前顶下面的单元为新的栈顶

下图描述了8086CPU对pop指令的执行过程。

在这里插入图片描述

注意

上图中,出栈后,SS:SP指向新的顶1000EH,pop操作前的顶元素1000CH处的2266H依然存在,但是,它已不在栈中。当再次执行push等入指令后SS:SP移至1000CH,并在里面写入新的数据,它将被覆盖。

结语

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下。

也可以点点关注,避免以后找不到我哦!

Crossoads主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的动力!

在这里插入图片描述

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

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

相关文章

基于Java的茶叶商城设计与实现(源码+定制+开发)茶叶电商系统开发、茶叶电商平台开发、茶叶在线销售平台设计与开发

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

英伟达开源最新大模型Nemotron 70B后,只有OpenAI o1一个对手了

来源 | 机器之心 今天,英伟达又开源了一个性能超级强大的模型 —— Llama-3.1-Nemotron-70B-Instruct,它击败了 OpenAI 的 GPT-4o 和 Anthropic 的 Claude-3.5 Sonnet 等多个开闭源模型。 从命名来看,显然 Llama-3.1-Nemotron-70B-Instruct …

2024.09.27校招 实习 内推 面经

🛰️ :neituijunsir 交* 流*裙 ,内推/实习/校招汇总表格 1、校招丨小米2024届补录招聘正式回归(内推) 校招丨小米2024届补录招聘正式回归(内推) 2、校招丨移动研究院2025届校园招聘全面启…

DE项目整里

系列文章目录 文章目录 系列文章目录一、Airflow-AWS ETL项目二、snowflake ETL项目三、AWS DE的快速入门课程 一、Airflow-AWS ETL项目 项目作者:tuplespectra(主要是AWS,EC2,GLUE 的项目)项目地址: htt…

MySQL-15.DQL-排序查询

一.DQL-排序查询 -- 排序查询 -- 1.根据入职时间,对员工进行升序排序 select * from tb_emp order by entrydate asc ;-- 2.根据入职时间,对员工进行降序排序 select * from tb_emp order by entrydate desc ;-- 3.根据 入职时间 对公司员工进行 升序排序…

selenium自动化关闭

该段代码属于固定代码,直接誊抄即可使用!!!!!!! !!!!!建议整理到小本本上!!! #设置关闭selenium的自动化特性和拓展,防止被网站检测…

【MogDB】MogDB5.2.0重磅发布第三篇-支持astore下的rowid

一、背景 从ORACLE迁移到国产数据库,经常会遇到rowid的兼容性问题,可能是不支持rowid这个关键字,也可能是rowid数据类型或rowid的行为和oracle不一样。 rowid特征: rowid是表上的一个伪列rowid字段在数据字典中不存在select * …

scala 高阶函数(2)上

学习目录 一.reduce reduce的含义 idea实例 二.reduceLeft-reduceRight reduceLeft-reduceRight的含义 idea实例 练习:求最值

word建立目录以及修改页码

1、为word建立新的目录 (1)选中word中的标题设置为第几级标题,将所有的标题均设置完成。最后可以鼠标右击标题,对不同的标题字体大小等进行设置。右击-->修改-->格式-->段落 (2)在word中插入新的…

【多模态大模型】 端侧多模态模型 Qwen2-VL-2B-Instruct

【多模态大模型】 端侧多模态模型 Qwen2-VL-2B-Instruct Qwen2-VL-2B-Instruct 模型介绍模型测评运行环境安装运行模型Image Resolution for performance boosttwo methods for fine-grained control over the image size input to the model: 下载开源协议参考 Qwen2-VL-2B-In…

sql之update语句

SQL(Structured Query Language)是一种用于管理和操作关系数据库的强大语言。UPDATE语句是SQL中用于修改数据库中已存在记录的一种方法。以下是一些经典的UPDATE语句案例: 1.更新特定行的列值: UPDATE employees SET salary sa…

专题十二_floodfill(洪水灌溉)算法_算法专题详细总结

目录 1. 图像渲染(medium) 解析: 函数头: 函数体:固定模板 设置全局变量: 总结: 2. 岛屿数量(medium) 解析: 注意: 总结: …

补题:B. Hemose Shopping

传送门:Problem - B - Codeforces 题意:给定由 n 个元素组成的数组,现给定操作 选取索引 i j ,如果 abs( i - j ) > x 就可以交换 swap( a[i] , a[j] ),可以进行任意次操作,如果操作后的数组是不递减的…

利用由 Search AI 提供支持的自动导入功能加速 Elastic Observability 中的日志分析

作者:来自 Elastic Bahubali Shetti 通过自动化自定义数据集成,以创纪录的速度将日志迁移到 AI 驱动的日志分析。 Elastic 正在通过自动提取自定义日志来加速采用 AI 驱动的日志分析(AI-driven log analytics),随着基…

时间序列预测(六)——循环神经网络(RNN)

目录 一、RNN的基本原理 1、正向传播(Forward Pass): 2、计算损失(Loss Calculation) 3、反向传播——反向传播通过时间(Backpropagation Through Time,BPTT) 4、梯度更新&…

Flink时间语义和时间窗口

前言 在实际的流计算业务场景中,我们会发现,数据和数据的计算往往都和时间具有相关性。 举几个例子: 直播间右上角通常会显示观看直播的人数,并且这个数字每隔一段时间就会更新一次,比如10秒。电商平台的商品列表&a…

MySQL-15.DQL-分页查询

一.DQL-分页查询 -- 分页查询 -- 1. 从 起始索引0 开始查询员工数据,每页展示5条记录 select * from tb_emp limit 0,5; -- 2.查询 第1页 员工数据,每页展示5条记录 select * from tb_emp limit 0,5; -- 3.查询 第2页 员工数据,每页展示5条记…

pta-6-5 图书和音像租赁

图书和音像店提供出租服务,包括图书和DVD的出租。图书包括书名(String,一个词表示)和价格(double),DVD包括片名(String,一个词表示)。它们都是按天出租&#…

6.计算机网络_UDP

UDP的主要特点: 无连接,发送数据之前不需要建立连接。不保证可靠交付。面向报文。应用层给UDP报文后,UDP并不会抽象为一个一个的字节,而是整个报文一起发送。没有拥塞控制。网络拥堵时,发送端并不会降低发送速率。可以…

Scala内部类和Java内部类的不同

Scala内部类和Java内部类在概念上是相似的,都允许一个类定义在另一个类的内部。 不过,由于Scala和Java在语言设计哲学和语法上的差异,它们在实现细节和使用方式上存在一些不同之处。 Scala内部类和Java内部类之间的主要区别: 1…