【汇编语言】寄存器(内存访问)(七)—— 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.rhkb.cn/news/451623.html

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

相关文章

fmql之Linux Uart

正点原子第48章。 串口收发测试 正点原子教程 RS232和RS485的串口收发测试是一样的。 // 设置串口波特率为115200 stty -F /dev/ttyPS1 ispeed 115200 ospeed 115200 cs8// 发送字符串 echo "www.openedv.com" >/dev/ttyPS1// 接收数据 cat /dev/ttyPS1 fmql测…

强烈推荐Kafka动画入门概念的3个讲座

强烈推荐Kafka动画入门概念的3个讲座,3个都是动画讲解,十分不错, 1、主题、偏移量和分区 ~ Kafka核心概念(Part1) 地址:主题、偏移量和分区 ~ Kafka核心概念(Part1)_哔哩哔哩_bilibili 2、偏移量提交、重平衡和消费者组 ~ Kafka核…

C Primer Plus 第9章——第一篇

你该逆袭了 文章目录 一、复习函数1、定义带形式参数的函数2、声明带形式参数函数的原型3、使用 return 从函数中返回值(1)、返回值不仅可以赋给变量,也可以被用作表达式的一部分。(2)、返回值不一定是变量的值&#x…

【Linux】进程池

目录 进程池 进程池的概念: 手搓进程池: 1、创建信道和子进程 2、通过channel控制子进程 3、回收管道和子进程 进程池 进程池的概念: 定义一个池子,在里面放上固定数量的进程,有需求来了,就拿一个池中…

微信小程序考试系统(lw+演示+源码+运行)

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了微信小程序考试系统的开发全过程。通过分析微信小程序考试系统管理的不足,创建了一个计算机管理微信小程序考试系统的方案。文章介绍了微信小程序考…

Leetcode 二叉搜索树的第 K 个元素

复习一下二叉搜索树 二叉搜索树 (Binary Search Tree, 简称 BST) 是一种特殊的二叉树(可以为空),其中每个节点都有一个值,并且满足以下特点: 定义: 左子树节点的值小于根节点的值:对于每个节点,左子树中所…

力扣66~70题

题66(简单): python代码: class Solution:def plusOne(self, digits: List[int]) -> List[int]:s_str.join([str(i) for i in digits])nstr(int(s_str)1)n_strlist(n)res[int(i) for i in n_str]return res题67(简…

Vscode的远程开发之VScode优势(一)

一、VSCode 优势 时代的弄潮儿 vscode是微软开源的基于electron的编辑器,通过各种各样的插件,它能够变成你最花里胡哨的IDE。 vscode 最大的特点与优势就是它将Server与Client解耦: 作为Client的vscode,他只负责作为文本编辑器…

kali的学习

一、Namp的使用 首次使用时,要确保Metasploitable已经启动并正在运行 nmap扫描原理: 首先判断nmap传输的命令行中是否包含域名,如果包含需要利用DNS服务器进行域名分析,然后发送ICMP Echo Request 来探测主机存活性。 nmap默认扫描…

判断在子集

今天晚上练习赛的A没写括号&#xff0c;搞了好久&#xff0c;真的是醉了。。。 #include<bits/stdc.h> using namespace std; typedef long long ll; int t; int main() {cin>>t;while(t--){ll x,y;cin>>x>>y;if(x<y)swap(x,y);if(xy)cout<<0…

构建现代化车辆管理系统:SpringBoot实践

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理车辆管理系统的相关信息成为必然。开发合适…

理解VSCODE基于配置的设置,避免臃肿

这节课我们讲两点&#xff1a; &#xff08;一&#xff09;下载、安装、汉化及美化 VSCODE&#xff1b; &#xff08;二&#xff09;理解VSCODE中基于配置&#xff08;Profiles&#xff09;的设置&#xff08;Settings&#xff09;&#xff0c;让 VSCODE 保持清爽。 &#xff0…

基于SpringBoot+Vue+uniapp的电影信息推荐APP的详细设计和实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

CTFHUB技能树之SQL——Refer注入

开启靶场&#xff0c;打开链接&#xff1a; 直接挑明是Refer注入 用burp抓包发送到repeater&#xff1a; 发现缺少referer报文头&#xff0c;添加一下&#xff0c;判断是整数型注入还是字符型注入&#xff1a; Referer: 1 and 11# 正常回显 1 and 12# 回显错误&#xff0c;说…

外星人木乃伊---我的收藏

我收藏了一个与我们星球上任何已知物种无关的非人类标本的明显例子&#xff0c;这具木乃伊遗骸作为地球上存在「非人类」外星人证据。测试证实这些遗骸含有「不来自任何已知物种」的DNA。7%的遗骸DNA“不来自任何已知物种”。这标本不属于我们的陆地进化。它们不是不明飞行物坠…

【android开发】android端部署yolov11-pose实现体测计数

android端部署yolov11-pose实现体测计数 系统概述一、自制关键点数据集预览二、Android Studio项目结构预览三、平板端运行效果预览 系统概述 自制引体、俯卧撑、仰卧起坐数据集&#xff0c;使用自制数据集训练yolo11-pose模型&#xff0c;通过ncnn进行模型转换&#xff0c;得…

【GAMES101笔记速查——Lecture 17 Materials and Appearances】

目录 1 材质和外观 1.1 自然界中&#xff0c;外观是光线和材质共同作用的结果 1.2 图形学中&#xff0c;什么是材质&#xff1f; 1.2.1 渲染方程严格正确&#xff0c;其中BRDF项决定了物体的材质 1.2.2 漫反射材质 &#xff08;1&#xff09;如何定义漫反射系数&#xff1…

数字图像处理:频率域滤波

数字图像处理&#xff1a;频率域滤波 笔者相关内容笔记&#xff1a; 1.傅里叶变换与图像处理 2.傅利叶变换在图像处理的应用 1.1 频率域滤波总体流程 1.2 DFT/IDFT DFT的例子 1.3 常见频率域滤波器 过滤高频信息&#xff0c;保留低频信息&#xff0c;则图像模糊 过滤…

特步引入IPD管理,钉钉项目 Teambition 助力高效产品研发管理

中国是全球第二大消费市场&#xff0c;运动鞋服行业拥有着巨大的发展潜力。在过去五年时间里&#xff0c;随着中国产品品牌和质量的提升&#xff0c;体育市场的占有率格局发生了显著变化&#xff0c;不同于部分国际品牌巨头营收持续减弱&#xff0c;国产领军体育运动品牌「特步…

RK平台 GPIO序号转换软件

RK平台 GPIO序号转换软件 下载地址 https://download.csdn.net/download/ruidongren/89900151 链接: link