汇编--栈和寄存器

栈是一种运算受限的线性表,其限定仅在表尾进行插入和删除操作的线性表,表尾也被叫做栈顶。简单概括就是我们对于元素的操作只能够在栈顶进行,也造就了其先进后出的结构特性。

 这种内存空间其实本质上有两种操作:将数据放入栈中和在栈中取出数据,相对应的我们管这两种操作叫做入栈出栈,而栈顶的元素总是最后入栈,需要出栈时又最先被取出的现象我们将其称为LIFO(Last In First Out,后进先出)

栈顶就是一个指针,它永远指向栈中需要最先出栈的元素。

入栈的最基本的指令就是push + 操作数,这里的操作数既可以是存储器或者寄存器的名称,也可以是立即数(通过段地址:偏移地址的形式)。

CPU是通过CS,IP两个寄存器存放的段地址和偏移地址来获取物理地址到存储单元中查找指令数据。CPU针对栈顶应该也有对应的寄存器记录,8086寄存器中有两个寄存器段地址寄存器SS以及偏移地址寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中,PUSH指令与性的时候从SS:SP中获取到栈顶的地址。

PUSH指令的执行过程:

  1. SS:SP指向当前栈顶前面的单元,以当前单元前面的单元作为新的栈顶。偏移地址改变
  2. 将指定数据送入SS:SP指向的内存单元处,SS:SP此时指向新的栈顶。

POP指令的格式是POP 寄存器其指令含义就是用一个寄存器来保存出栈的数据,因此POP指令后面不能够加立即数。

栈底
此时我们要拆入一个2字节数据,CPU会将数据放在,我们执行PUSH操作的时候,会将数据首先放入高位存储单元。

高位存储单元: 即物理地址数字更大的单元

特别注意栈顶越界的问题,不仅仅是PUSH操作,也包含POP操作在内。

数据

在汇编语言中,入栈push和出栈pop可以对数据进行操作,这里进行操作的数据有如下的特征

  • 数据从寄存器和内存中来
  • 数据是字型数据,操作的是16位寄存器或内存中的字型数据

入栈
将16位寄存器或内存中的字型数据放到栈顶标记的上方
修改栈顶标记

出栈
将栈顶标记的字型数据 放到16位寄存器或内存中
修改栈顶标记

从上面我们可以看出,栈顶标记本质是一个内存地址,往栈(连续内存区域中)写入和拿出数据,都是针对相关内存地址进行修改;而在8086CPU中,在任意时刻,将段地址寄存器SS和偏移地址寄存器SP所组合出来的内存地址当作栈顶标记

push

push ax 所做的事情如下
修改SP寄存器中的数值:SP=SP-2
将AX中的字型数据->放到SS:SP所组合的内存地址中,入栈

pop

pop bx
将SS:SP所组合出的内存地址中的字型数据->bx
修改栈顶标记 SP=SP+2,出栈

栈顶越界

当push入栈数据大小或者pop出栈数据大小大于栈顶标记与栈的起始地址所组成的栈空间时,便会发生栈顶越界问题,但汇编语言并不会像其他高级语言那样直接抛出异常和错误

汇编语言在任意时刻,都会将ss:sp所组成的地址认为为栈顶标记

栈的主要作用:临时性地保存数据(临时作用:交换数据)

在call指令和ret指令中,call转移指令临时地将吓一跳指令所在的地址保存了栈中栈顶位置,再通过ret指令从栈顶将保存的指令拿出

寄存器

一个典型的CPU由运算器,控制器,寄存器等器件组成,这些器件靠内部总线相连,内部总线实现CPU内部各个器件之间的联系,而CPU于外设(主板上的其他器件)之间的联系则由外部总线连接

简单来说,在CPU中:

1.运算器进行信息处理;

2.寄存器进行信息存储;

3.控制器控制各个器件进行工作;

4.内部总线连接各个器件,在他们之间进行数据的传送;

寄存器可以用来存储指令和数据。对于一个汇编程序员来说,CPU的主要部件是寄存器。寄存器是CPU中程序可以用指令读写的器件。程序员通过改变各种寄存器中内容来实现对CPU的控制。不同的CPU,寄存器的个数,结构式不同的。

例如:8086CPU有14个寄存器,每个寄存器有一个名字。这些寄存器名字分别是:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,ES,PSW。这些寄存器有着不同的功能,在不同的场合扮演不同的角色。

通用寄存器:AX,BX,CX,DX

8086CPU所有寄存器都是16位的,可以存放两个字节,上述4个寄存器通常用来存放一般性的数据,被称为通用寄存器。

AX可以分为AH,AL,同理,BX又可以分为BH,BL;CX和DX也可以这么拆(H表示hign,L表示low)

 AX的低8bits构成AL寄存器,高8bits构成了AH寄存器,AH和AL都是可以独立使用的寄存器。

mov ah,78H(已知该指令是将78H的数据传入ah寄存器中),该语句不会影响AL的值

字节存储
1字节等于8比特位,一个字等于两个字节

比特记为bit,字节记为Byte,字记为word,所以有如下关系:

1Byte=8bits,1word=2Bytes=16bits

而8086CPU出于兼容性的考虑,一次性可以处理两种尺寸的数据:字节以及子数据

一个寄存器可以存储一个字数据

内存单元是字节单元,也就是说一个字节单元对应一个内存单元。当我们要保存一个子数据时,我们应该用两个地址连续的内存单元来保存。数据的低字节存放在低地址单元中,高字节存放在高地址单元

当CPU操作内存时,内部有如下事件发生:

1)CPU中的相关部件提供了两个16位地址,一个称为段地址,一个称为偏移地址

2)段地址和偏移地址经过内部总线送入地址加法器

3)地址加法器将两个16位地址合成一个20位的物理地址

4)地址加法器将20位的物理地址通过内部总线送入输入输出控制电路

5)输入输出控制电路将20位地址送入地址总线

6)20位物理地址被地址总线送入存储器

地址加法器采用物理地址=段地址*16+偏移地址的方法来合成物理地址,这样一个16位机就可以 访问20位地址,寻址能力也从64KB扩大成1MB

四个段寄存器:CS,DS,SS,ES。当CPU要访问内存时,由他们提供短地址。这里我们看一下CS。

CS和IP是8086CPU中最关键的两个寄存器。他们指示CPU当前要读取的指令的地址。CS称之为代码段寄存器,IP为指令指针寄存器。

在8086CPU中,任意时刻设CS中的值为M,IP中的值为N,则CPU将从M*16+N地址单元中取出一条指令并执行。也就是说,当前执行的指令在哪由CS和IP来决定。可以表示为CS:IP。

           

            

参考:http://t.csdnimg.cn/8blus

参考:http://t.csdnimg.cn/BnUQd

参考http://t.csdnimg.cn/nS073

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python自动化测试五大框架(测试员收藏夹必备)

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

知从科技战略客户经理张志强受邀出席2024 AutoSec中国汽车网络安全与数据安全峰会

4月11-12日,AutoSec8周年年会暨中国汽车网络安全及数据安全合规峰会在上海成功举办。此次峰会吸引了来自全球各地的头部汽车网络安全企业、OEM厂商、安全专家和学者等齐聚盛会,零距离共话智能网联汽车产业的新发展、新趋势。 知从科技董事长成云霞亲自带…

番外篇 | YOLOv8改进之在C2f中引入MSBlock模块(来源于YOLO-MS) | 轻量化网络结构

前言:Hello大家好,我是小哥谈。YOLO-MS是一种基于YOLO(You Only Look Once)的目标检测算法,它利用多尺度特征图提取和融合的方式来检测不同尺度的物体。YOLO-MS在准确率和速度方面都有很好的表现,特别适用于实时场景下的物体检测。在YOLO-MS提出的一种针对于实时目标检测…

【intro】GraphSAGE

论文 https://arxiv.org/pdf/1706.02216 abstract 大图中节点的低维embedding已经被证明在各种预测任务中非常有用,然而,大多数现有的方法要求在embedding训练期间图中的所有节点都存在;这些先前的方法属于直推式(transductive&#xff09…

Vue2——前端笔记

Vue 一、Vue核心1.1、vue简介1.2、初始vue1.3、模板语法1.4、数据绑定1.5、el与data的两种写法1.6、MVVM模型1.7、Vue中的数据代理1.7.1、Object.defineProperty() 理解1.7.2、Vue中的数据代理 1.8、事件处理1.8.1、事件的基本用法1.8.2、事件修饰符1.8.3、键盘事件 1.9、计算属…

【递归、回溯和剪枝】二叉树中的深搜

⼆叉树中的深搜深度优先遍历(DFS,全称为 Depth First Traversal),是我们树或者图这样的数据结构中常⽤的⼀种遍历算法。这个算法会尽可能深的搜索树或者图的分⽀,直到⼀条路径上的所有节点都被遍历完毕,然后…

推荐 3 个 yyds 的开源项目!

本期推荐开源项目目录: 1. AI 搜索引擎 2. 大模型聊天框架 3. 模仿抖音的移动端短视频 01 AI 搜索引擎 Perplexica 是一个开源的、由 AI 驱动的搜索引擎。它深入互联网寻找答案,不仅搜索网络,还理解您的问题。 Perplexica 受到 Perplexity AI…

系统安全与应用【2】

1.开关机安全控制 1.1 GRUB限制 限制更改GRUB引导参数 通常情况下在系统开机进入GRUB菜单时,按e键可以查看并修改GRUB引导参数,这对服务器是一个极大的威胁。可以为GRUB 菜单设置一个密码,只有提供正确的密码才被允许修改引导参数。 实例&…

YOLOv9改进策略 | 添加注意力篇 | 一文带你改进GAM、CBAM、CA、ECA等通道注意力机制和多头注意力机制

一、本文介绍 这篇文章给大家带来的改进机制是一个汇总篇,包含一些简单的注意力机制,本来一直不想发这些内容的(网上教程太多了,发出来增加文章数量也没什么意义),但是群内的读者很多都问我这些机制所以单…

CUDA调整指令级原语

在GPU上运行的运算密集型应用程序,处理器的计算吞吐量可以用它在一段时间内执行操作的数量来衡量。因为GPU有很多SIMT指令和计算核心,所以其峰值计算吞吐量通常比其他的处理器高。 对应用程序的吞吐量和正确性进行优化时,理解不同低级原语的…

SOCKET编程(1):基本概念

基本概念 socket分类 socket提供了**流(stream)和数据报(datagram)**两种通信机制,即流socket和数据报socket 流socket基于TCP协议,是一个有序、可靠、双向字节流的通道,传输数据不会丢失、不会重复、顺序也不会错乱 数据报socket基于UDP…

子查询之一(单行子查询, 多行子查询)

1. 子查询 子查询是指一个查询语句嵌套在另一个查询语句内部的查询.这个特性在MySQL4.1开始引入. SQL中子查询的使用大大增强了SELECT查询的能力.因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得到一个数据结果,然后与这个数据结…

在Windows中创建和管理组策略管理模板的中央存储

本文参考于: 创建和管理中央存储 - Windows Client | Microsoft Learn 管理模板文件存储 Windows使用中央存储来存储管理模板,与组策略不同,ADM文件夹并不是通过组策略对象(GPO)来创建的。由于Windows版本与Windows…

OpenAI 发布 AI 生成图片检测器;Meta 推出 AI 广告创意工具;Google 正式发布 Pixel 8a,主打 AI

OpenAI 发布 AI 生成图片检测器 OpenAI 昨日官宣推出专用的 AI 监测工具,用于监测图片是否由其旗下 AI 图片生成工具 DALL-E 生成,准确率高达 98.8%。 不过该公司表示,这个检测工具并非旨在检测 Midjourney 和 Stability 等其他流行生成器生…

Java基于Spring Boot框架毕业生实习与就业管理系统的设计与实现(附源码,说明文档)

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…

vue+springboot实现excel批量数据的导入导出

①后端配置端口:修改UserController UserController: package com.example.springboot.controller;import cn.hutool.core.util.StrUtil; import cn.hutool.poi.excel.ExcelReader; import cn.hutool.poi.excel.ExcelUtil; import cn.hutool.poi.excel.…

IPFoxy Tips:什么是静态住宅IP?静态ISP代理指南

静态住宅代理(也称为静态ISP代理)是最流行的代理类型之一。它们也是隐藏您的身份并保持在线匿名的最佳方法之一。您为什么要使用住宅代理而不是仅使用常规代理服务?下面我具体分享。 一、什么是静态住宅代理? 首先,我…

Pentaho Community Edition 下载安装和运行

1 访问网站 https://www.hitachivantara.com/pentaho/pentaho-plus-platform/data-integration-analytics/pentaho-community-edition.html ,点击 Download Now 。 2 选中,然后点击 Proceed to Download。 3 页面往下滑,选择合适的版本&…

关于线程池,它的扩展问题你知道吗?(自己总结)

专门想一下为什么线程池不用Excutors,之前的印象是错的,居然还拿来面试里讲,惭愧,这里暂时整理俩小问题,其他的后续可能会更新。。 线程池是创建的越大越好嘛 #线程池创建的越大越好吗 Tip:2024-04-10 更…

YOLOv5-7.0改进(三)添加损失函数EIoU、AlphaIoU、SIoU、WIoU、MPDIoU、NWD

前言 损失函数的改进一直是涨点的重要技巧,本篇博客将使用六个不同损失函数对算法进行改进,并绘制出改进结果对比图~ 往期回顾 YOLOv5-7.0改进(一)MobileNetv3替换主干网络 YOLOv5-7.0改进(二)BiFPN替换…
最新文章