当前位置: 首页 > news >正文

速通汇编(六)认识栈,SS、SP寄存器,push和pop指令的作用

一,栈

(一)栈的特点

栈是一种具有特殊访问方式的存储空间,特殊在于,进出这块存储空间的数据,“先进后出,后进先出”

由于栈的这个“先进后出”的特点,我们可以利用其来很好的操作内存

在《王爽汇编》中,作者用三本书十分形象地来描述了入栈和出栈的操作,对栈比较陌生的同学可以仔细理解,很理解的同学则可跳过

入栈的方式

出栈的方式

入栈:将数据放在栈的顶部

出栈:将栈顶部的数据取出

也就是说,无论是入栈和出栈,当前操作的数据一定是当前栈中最顶部的数据,我们假想有一个指针,它会一直指着栈顶数据,帮助我们定位

(二)CPU中的栈机制

栈先进后出的这个特点对于我们操作数据是十分方便的一个机制,因此CPU中设计好了提供给我们相关的指令用这种机制来访问内存

简而言之,我们可以主观地将某块内存视作栈(实际上它在内存中是没变的,只是我们主观去刻意认为),然后用相关指令来操作它

最基本的两个入栈和出栈命令是:push(入栈),pop(出栈)

注意,入栈和出栈的操作都是以(一个字等于两个字节,1 word == 2 byte)为单位的,这意味着任何一次出入栈操作的数据一定是十六位的

例:

push ax        (√)

push bh        (×)bh是bx的高八位寄存器

pop cx          (√)

pop dl           (×)dl是dx的低八位寄存器

①初始空栈

规定为,如果将一块内存视作栈,那么这块内存最小的地址处(低地址)为栈顶,反之(高地址)为栈底,例如下图,[10000]为栈顶,[1000F]为栈底,你可以认为只不过是把从左到右(由低地址到高地址)的一块内存顺时针旋转了90度立起来方便我们看而已

此时栈指针指向[10010]处,即栈最底部[1000F]的再下一处,因为是空栈

下面将10000~1000F这段内存视作栈,并用相关指令来操作它

②【mov ax,0123】【push ax

将0123赋值给ax,然后把ax的值压入栈中

这里再次涉及到小端存储数据的方式(现有的机器基本都是小端存储),ax分为ah高位的01和al低位的23

因此高位的01应该放在[1000F]处,低位的23放在[1000E]处,因此执行完这两条汇编之后,栈中的数据应如下图所示

此时栈指针指向[1000E]处,栈顶数据是23

③【mov bx,2266】【push bx

这一步和②同理,高位的22被压入相对高位的[1000D]处,低位的66被压入相对低位的[1000C]处

此时栈指针指向[1000C]处,栈顶数据是66

 ④【mov cx,1122】【push cx

这一步和②③同理,高位的11被压入相对高位的[1000B]处,低位的22被压入相对低位的[1000A]处

此时栈指针指向[1000C]处,栈顶数据是22

(接下来3步我们整合在一起)

形如【pop 寄存器】指令的作用:将当前栈指针指向的数据放入寄存器中

⑤【pop ax】,栈指针指向[1000A]处,因此将66放入al,22放入ah(别忘了push和pop一定是以字为单位操作数据的,而不是字节),因此执行完后,ax==1122

⑥【pop bx】,同理,栈指针指向的是[1000C],将66放入bl,22放入bh,bx==2266

⑦【pop cx】,同理,栈指针指向的是[1000E],将23放入cl,01放入ch,cx==0123

最后,栈指针再次归位到[10010]处,因为栈空

总结:

①内存中地址从左到右由低到高,栈中地址从上到下由低到高,可以认为栈不过是一块内存顺时针旋转了90度立起来方便我们看而已

②假想一个栈指针,它会时刻指向栈中目前最顶部的数据

③push、pop指令操作的是至少是一个字(不能单独操作一个字节),一个字(word)==两个字节(byte)

④每使用push指令压入一个字,栈指针会向栈顶(低地址)处移动一个字的大小(相当于-2);每使用pop指令弹出一个字,栈指针会向栈底(高地址)处移动一个字的大小(相当于+2)


二,SS、SP寄存器和push、pop的作用

(一)SS、SP寄存器

在前文中,我们反复提到以下两点:

①栈是我们主观假想出来的具有特殊存储方式的内存,与普通内存别无二致

②假想一个栈指针,它会时刻指向栈中目前最顶部的数据

怎么让cpu知道我们把哪块内存视作栈了呢?这个假想出来的栈指针要如何表现呢?cpu提供给我们两个寄存器解决了这两个问题

回想一下,其实就像学习CS、IP寄存器时一样,我们当时解决的问题是“汇编指令和普通数据在内存中存储起来后没有差别(都是二进制数),但是cpu会将[CS:IP]指向的地址视作汇编来执行”;

所以现在举一反三,又需要两个这样的寄存器,一个用来标识段地址,一个用来标识偏移地址,它们共同指向我们主观视作栈的一块内存的栈顶数据,它的地址则是[SS:SP]

因此,[SS:SP]就是实际cpu中的栈指针

(二)push指令

 push指令主要有两种用法:

push 寄存器,例如:【push ax】

此处必须是十六位寄存器(前文已经阐述过)

当本条指令被执行之后,cpu会将指定寄存器ax的数据赋值给[SS:SP]处(即栈顶)

执行完后,SP寄存器的值会-2,因为新压入了两个字节的数据成为了新的栈顶数据,栈指针会向低地址偏移两个字节

push [偏移地址],例如:【push [0011]】

当本条指令被执行之后,cpu会将指定物理地址[DS:0011]处(不明白为什么是DS的,请仔细复习上一篇<速通汇编(五)>)的数据(同样是十六位数据,如FFFF)赋值给[SS:SP]处(即栈顶)

执行完后,SP寄存器的值会-2,因为新压入了两个字节的数据成为了新的栈顶数据,栈指针会向低地址偏移两个字节

实例:

①先用r命令查看寄存器,观察到SS和SP的值,然后用d命令查询[SS:SP]处内存的值

②在[0000:0000]处提前写入数据12ab34cd,修改DS的值为0000(这样待会push [0]时,[0]就代表[0000:0000])

④a命令在[CS:IP]即[073f:0100]处写入汇编

mov ax,1234】【push ax

push [0]

⑤执行前两条汇编【mov ax,1234】【push ax】,执行完后查看栈的变化

观察到,ax中的1234被压入栈中,ah的12在高地址,al的34在低地址,且SP==00FD-2==00FB,符合预期

(注:观察到此处栈顶数据左边的内存数据发生变化,这是正常现象,无需关心)

⑥执行第3条汇编【push [0]】,执行完后查看栈的变化

观察到,[0000:0000]处的两个字节12和AB,分别被压入栈的低和高地址处,且SP==00FB-2==00F9,符合预期

(三)pop指令

(pop指令用来弹出栈顶数据,弹出后不是说消失了,你要找个其它位置存放的)

pop指令主要有两种用法:

pop 寄存器,例如:【pop ax】

此处必须是十六位寄存器(前文已经阐述过)

当本条指令被执行之后,cpu会将[SS:SP]处(即栈顶)的数据弹出,赋值给指定寄存器ax

执行完后,SP寄存器的值会+2,因为弹出了栈顶数据,栈指针会向高地址处偏移2个字节

pop [偏移地址],例如:【pop [0011]】

当本条指令被执行之后,cpu会将[SS:SP]处(即栈顶)的数据弹出,赋值给指定物理地址[DS:0011]处

执行完后,SP寄存器的值会+2,因为弹出了栈顶数据,栈指针会向高地址处偏移2个字节

实例:

①a命令在在[CS:IP]处写入汇编

pop ax】【pop [0011]

②执行第一条汇编【pop ax】,执行完后查看栈与ax的变化

观察到,栈顶数据12AB被弹出,低位的12放入al中,高位的AB放入ah中,ax==AB12

且SP==00F9+2==00FB,符合预期

③执行第二条汇编【pop [0011]】,执行完后查看栈与[0000:0011]处的变化

观察到,栈顶数据3412被弹出,低位的34放入低位的[0000:0011]处,高位的12放入高位的[0000:0012]处

且SP==00FB+2==00FD,符合预期


三,栈越界相关问题

(以下是《王爽汇编》原文节选,提到的CPU通指8086CPU)

上文已经完全说明,CPU由SS和SP来指向栈顶地址,并提供push和pop指令来出入栈

有个问题是,CPU不会保证我们对栈的操作不超界

也就是说,CPU只知道栈顶在何处(由[SS:SP]指示),而不知道我们安排的栈空间有多大。这点就好像 CPU 只知道当前要执行的指令在何处(由CS:IP指示),而不知道要执行的指令有多少从这两点上我们可以看出CPU的工作机理,它只考虑当前的情况:当前的顶在何处、当前要执行的指令是哪一条

我们在编程的时候要自己操心栈顶超界的问题,要根据可能用到的最大栈空间,来安排栈的大小,防止入栈的数据太多而导致的超界;执行出栈操作的时候也要注意,以防栈空的时候继续出栈而导致的超界

相关文章:

速通汇编(六)认识栈,SS、SP寄存器,push和pop指令的作用

一&#xff0c;栈 &#xff08;一&#xff09;栈的特点 栈是一种具有特殊访问方式的存储空间&#xff0c;特殊在于&#xff0c;进出这块存储空间的数据&#xff0c;“先进后出&#xff0c;后进先出” 由于栈的这个“先进后出”的特点&#xff0c;我们可以利用其来很好的操作内…...

【Python机器学习】NLP信息提取——值得提取的信息

目录 提取GPS信息 提取日期 如下一些关键的定量信息值得“手写”正则表达式&#xff1a; GPS位置&#xff1b;日期&#xff1b;价格&#xff1b;数字。 和上述可以通过正则表达式轻松捕获的信息相比&#xff0c;其他一些重要的自然语言信息需要更复杂的模式&#xff1a; 问…...

代理IP批理检测工具,支持socks5,socks4,http和https代理批量检测是否可用

代理IP批理检测工具,支持socks5,socks4,http和https代理批量检测是否可用 工具使用c编写&#xff1a; 支持ipv4及ipv6代理服务器。 支持http https socks4及socks5代理的批量检测。 支持所有windows版本运行&#xff01; 导入方式支持手工选择文件及拖放文件。 导入格式支持三…...

AI视觉算法盒是什么?如何智能化升级网络摄像机,守护全方位安全

在智能化浪潮席卷全球的今天&#xff0c;以其创新技术引领行业变革&#xff0c;推出的集高效、智能、灵活于一体的AI视觉算法盒。这款革命性的产品&#xff0c;旨在通过智能化升级传统网络摄像机&#xff0c;为各行各业提供前所未有的安全监控与智能分析能力&#xff0c;让安全…...

【Vue】VueRouter路由

系列文章目录 第七章 VueRouter路由 文章目录 系列文章目录第一节&#xff1a;VueRouter基础一、安装&#xff1a;二、基本使用&#xff1a;1. 创建路由代码&#xff1a;Single Page Application&#xff1a;SPA2. 使用路由3. 展示路由&#xff1a; 二、嵌套路由三、路由传参1…...

idea多模块启动

文章目录 idea多模块启动2018版本的idea2019版本的idea idea多模块启动 2018版本的idea 1.首先看一下view> Tool Windows下有没有Run Dashboard 如果有&#xff0c;点击一下底部的窗口就会出现 如果不存在&#xff0c;执行下一步 2.查看自己项目的工作空间位置 点击 File&…...

23:SPI二:W25Q64存储器模块的使用

W25Q64存储器模块的使用 1、W25Q64的简介2、模块内部结构2.1&#xff1a;引脚结构2.2&#xff1a;内部存储结构2.3&#xff1a;此模块的注意事项 3、程序模拟SPI读写W25Q644、片上外设SPI读写W25Q64 1、W25Q64的简介 其中最主要的特点就是掉电不丢失。 由上图所示&#xff1a…...

论文解读《COMMA: Co-articulated Multi-Modal Learning》

系列文章目录 文章目录 系列文章目录论文细节理解1. 研究背景2. 论文贡献3. 方法框架4. 研究思路5. 实验6. 限制结论 论文细节理解 这段话中&#xff0c;the vision branch is uni-directionally influenced by the text branch only 什么意思&#xff1f;具体举例一下 以下是…...

10款电脑加密软件超好用推荐|2024年常用电脑加密软件排行榜

随着数据隐私和信息安全意识的增强&#xff0c;电脑加密软件已成为日常工作和个人生活中不可或缺的工具之一。无论是保护公司机密文件&#xff0c;还是保障个人数据的安全&#xff0c;合适的加密软件都能提供强有力的保护。本文将推荐2024年超好用的10款电脑加密软件&#xff0…...

用户态缓存:环形缓冲区(Ring Buffer)

目录 环形缓冲区&#xff08;Ring Buffer&#xff09;简介 为什么选择环形缓冲区&#xff1f; 代码解析 1. 头文件与类型定义 1.1 头文件保护符 1.2 包含必要的标准库 1.3 类型定义 2. 环形缓冲区结构体 2.1 结构体成员解释 3. 辅助宏与内联函数 3.1 min 宏 3.2 is…...

Harmony应用 ArkTs AES 加密方法之GCM对称加密

加解密介绍 在数据存储或传输场景中&#xff0c;可以使用加解密操作用于保证数据的机密性&#xff0c;防止敏感数据泄露。 使用加解密操作中&#xff0c;典型的场景有&#xff1a; 使用对称密钥的加解密操作。 使用非对称密钥的加解密操作。 使用RSA&#xff08;PKCS1_OAEP…...

热成像在战场上的具体作用!!!

1. 探测和跟踪敌人 原理&#xff1a;人体和许多类型的军事设备都会发热&#xff0c;热成像技术通过探测这些红外辐射&#xff0c;能够在远距离探测和跟踪敌人的位置。 应用场景&#xff1a;这一功能在夜间或有覆盖物&#xff08;如草丛、树林&#xff09;的情况下尤为有效&am…...

2024年09月20日《每日一练》

1、 根据我国“十三五”规划纲要&#xff0c;&#xff08;&#xff09;不属于新一代信息技术产业创新发展的重点。 A 人工智能 B 移动智能终端 C 先进传感器 D 4G D P13 此题考察的是新一代信息技术&#xff0c;必须掌握&#xff0c;高频考点 国在“十三五“规划纲要中&#x…...

使用 SSCB 保护现代高压直流系统的优势

在各种应用中&#xff0c;系统效率和功率密度不断提高&#xff0c;这导致了更高的直流系统电压。然而&#xff0c;传统的电路保护解决方案不足以在保持高可靠性和安全性的同时有效保护这些高压配电系统。 固态断路器 &#xff08;SSCB&#xff09; 和电熔断器具有众多优点&…...

Linux基础命令——文件系统的日常管理

目录 一.如何查看当前工作目录?&#xff08;你现在所处的位置路径&#xff09; 二.命令touch的用途是什么?还有别的方法新建文件吗? &#xff08;1&#xff09;创建空文件 &#xff08;2&#xff09;如果已经存在这个文件&#xff0c;就会更新创建时间。 &#xff08;3…...

uniapp使用高德地图设置marker标记点,后续根据接口数据改变某个marker标记点,动态更新

最近写的一个功能属实把我难倒了,刚开始我请求一次数据获取所有标记点,然后设置到地图上,然后后面根据socket传来的数据对这些标记点实时更新,改变标记点的图片或者文字, 1:第一个想法是直接全量替换,事实证明这样不行,会很卡顿,有明显闪烁感,如果标记点比较少,就十几个可以用…...

坦白了,因为这个我直接爱上了 FreeBuds 6i

上个月&#xff0c;华为发布的 FreeBuds 6i 联名了泡泡玛特真的超级惊艳&#xff0c;不少宝子被这款耳机的颜值所吸引&#xff0c;而它的实力更是不容小觑的。FreeBuds 6i 是一款性能强大的降噪耳机&#xff0c;它一直在强调平均降噪深度&#xff0c;但是应该很多人对这个概念很…...

006.MySQL_查询数据

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…...

【C#生态园】从图像到视觉:Emgu.CV、AForge.NET、OpenCvSharp 全面解析

C#图像处理库大比拼&#xff1a;功能对比、安装配置、API概览 前言 图像处理和计算机视觉在现代软件开发中扮演着重要角色&#xff0c;而C#作为一种流行的编程语言&#xff0c;拥有许多优秀的图像处理库。本文将介绍几个用于C#的图像处理和计算机视觉库&#xff0c;包括Image…...

1、无线通信的发展概况

无线通信是指双方至少一方使用无线方式进行信息的交换与传输&#xff0c;包括移动体&#xff08;行人、车辆、船舶以及飞机&#xff09;和移动体之间的通信&#xff0c;也包括移动体与固定点&#xff08;固定点的移动电台或有线通信&#xff09;之间的通信。 随着无线通信的范围…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...