3.8 串操作指令

在这里插入图片描述

🎓 微机原理考点专栏(通篇免费)

欢迎来到我的微机原理专栏!我将帮助你在最短时间内掌握微机原理的核心内容,为你的考研或期末考试保驾护航。

为什么选择我的视频?

  • 全程考点讲解:每一节视频都紧扣考试要点,拒绝冗余,专注于最关键的知识点。
  • 系统且高效:我已经为你精心准备了系统的学习资料,让你不再迷茫。

🔗 点击这里观看我的视频讲解 🔗

我需要你的支持

我为这套视频投入了大量精力,希望它能对你的学习有所帮助。如果你觉得内容有用,请给我的视频点个赞、评论、并关注我,这将是我继续创作的最大动力!

🙏 感谢你的支持!祝你学有所成! 🙏


3.8 串操作指令

基础知识

源串存放在数据段 (DS)
  • 用SI提供源串的偏移地址。****DS:SI为寻址源串
目的串存放在附加段 (ES)
  • 用DI提供目的串的偏移地址。****ES:DI为寻址目的串
方向标志 (DF)
  • DF=0:SI、DI寄存器自动增加(加1用于字节串,加2用于字串),实现从低地址到高地址的操作。
  • DF=1:SI、DI寄存器自动减少(减1用于字节串,减2用于字串),实现从高地址到低地址的操作。

重复前缀 (REP/REPE/REPNE)

REP:****无条件重复
  • CX寄存器存储重复次数,每执行一次串操作后,CX减1,直到CX为0。
REPE/REPZ ****当相等/为零时重复串操作
REPNE/REPNZ 当不相等/不为零时重复串操作

执行步骤如下:

①先判断CX的内容,如(CX)=0ZF=1,则串操作停止,否则执行第②步;

(CX)-1→CX

③执行其后的串操作指令,转第①步。

数据字节串/字串传送指令 (MOVSB/MOVSW)

  • <font style="color:#DF2A3F;">MOVSB</font>(Move String Byte): 逐字节移动数据。
  • <font style="color:#DF2A3F;">MOVSW</font>(Move String Word): 逐字移动数据(16位)。
  • 功能:将源段 DS:SI 指向的字节或字串传送到目标段 ES:DI,同时根据方向标志 DF 修改 SI 和 DI 的值,指向下一个字节或字。
示例:将内存单元首地址3100H起的100个字节传送到首地址2800H的内存单元
CLD                ; 清除方向标志DF,使传送方向为从低地址到高地址
MOV SI, 3100H      ; 将源串的起始地址3100H加载到SI
MOV DI, 2800H      ; 将目的串的起始地址2800H加载到DI
MOV CX, 100        ; 将传送字节数100加载到CX
REP MOVSB          ; 重复执行MOVSB指令,传送100个字节

这段代码用于将内存中从地址3100H开始的100个字节复制到从地址2800H开始的位置。以下是每个步骤的详细解析,包括数据移动的方式:

  1. CLD (Clear Direction Flag):
    • 清除方向标志DF,使其等于0。方向标志DF决定了字符串操作指令(如MOVSB)在每次操作后地址指针是增加还是减少。DF = 0 表示指针会递增,也就是说数据从低地址向高地址传输。
  2. MOV SI, 3100H:
    • 将源数据的起始地址3100H加载到SI寄存器。SI(Source Index)用于指向源字符串的当前字节地址。
  3. MOV DI, 2800H:
    • 将目标数据的起始地址2800H加载到DI寄存器。DI(Destination Index)用于指向目标字符串的当前字节地址。
  4. MOV CX, 100:
    • 将传送的字节数100加载到CX寄存器。CX寄存器作为计数器,用来指示需要传输的字节数量。在每次传输后,CX会自动减1,直到CX减为0,表示传输完成。
  5. REP MOVSB:
    • REP指令前缀与MOVSB(Move String Byte)指令结合使用。MOVSB指令从SI指向的源地址复制一个字节到DI指向的目标地址,然后SI和DI各自递增(因为DF = 0)。REP指令会重复执行MOVSB指令,直到CX寄存器的值减为0为止。

数据传输过程:

  • 第一次传输
    • SI = 3100H,DI = 2800H。
    • 从地址3100H读取一个字节,存放到地址2800H。
    • SI递增为3101H,DI递增为2801H,CX减1。
  • 第二次传输
    • SI = 3101H,DI = 2801H。
    • 从地址3101H读取一个字节,存放到地址2801H。
    • SI递增为3102H,DI递增为2802H,CX再减1。
  • 重复上述过程
    • 这个过程会持续进行,直到传输了100个字节(CX = 0)。最后一次传输时:
    • SI = 3199H,DI = 2899H。
    • 从地址3199H读取一个字节,存放到地址2899H。
    • SI递增为319AH,DI递增为289AH,CX减为0,传输结束。

最终,地址3100H到3199H的100个字节的数据被完整复制到了地址2800H到2899H的位置。

数据字节串/字串比较指令 (CMPSB/CMPSW)

  • 功能:比较源段 DS:SI 和目标段 ES:DI 指向的字节或字串,不返回结果,仅根据比较结果修改标志位,同时根据方向标志 DF 修改 SI 和 DI 的值,指向下一个字节或字。
示例:检查内存单元首地址2200H起的50个字节与首地址3200H起的50个字节是否相等
CLD                ; 清除方向标志DF,使比较方向为从低地址到高地址
MOV SI, 2200H      ; 将源串的起始地址2200H加载到SI
MOV DI, 3200H      ; 将目的串的起始地址3200H加载到DI
MOV CX, 50         ; 将比较字节数50加载到CX
REPE CMPSB         ; 如果相等且ZF=1,继续比较,直到CX=0或发现不相等
JZ LP1             ; 如果ZF=1,则跳转到标签LP1,表示所有字节都相等
DEC SI             ; 如果不相等,将SI指针减1,指向第一个不相等的字节
MOV BX, SI         ; 将第一个不相等字节的地址存入BX
MOV AL, [SI]       ; 将源串中第一个不相等的字节内容存入AL
JMP LP2            ; 跳转到标签LP2

LP1: MOV BX, 0     ; 如果所有字节相等,则将BX置为0
LP2:               ; 继续执行后续代码

数据字节串/字串检索指令(SCASB/SCASW)

功能:

  • SCASB(Scan String Byte):逐字节比较 <font style="color:#DF2A3F;">AL</font>** 寄存器中的值与 [ES:DI] 段内存中的值。
  • SCASW(Scan String Word):逐字比较 <font style="color:#DF2A3F;">AX</font>** 寄存器中的值与 [ES:DI] 段内存中的值。

关键点:

  • 比较的结果不会返回到寄存器中,而是影响标志位,如ZF(Zero Flag),CF(Carry Flag)等。
  • 在比较完成后,DI 指针会自动递增(或递减)指向下一个字节(字),这取决于CLDSTD指令设置的方向标志。
示例: 在内存附加段(ES段)4300H地址开始的100个字节中查找字符 *。如果找到,偏移地址存入BX寄存器;如果未找到,BX = 0。
CLD                   ; 清除方向标志,设置为向前搜索
MOV DI, 4300H         ; 初始化DI为4300H,指向内存中的第一个字节
MOV AL, '*'           ; 在AL中加载要查找的字符 '*'
MOV CX, 100           ; 设置搜索范围为100个字节

REPNZ SCASB           ; 逐字节比较,直到找到'*' 或 CX=0
JNZ LP1               ; 如果未找到(ZF=0),跳转到LP1

DEC DI                ; 减小 DI,因为 SCASB 会多移动一个字节
MOV BX, DI            ; 将找到的位置偏移地址存入BX
JMP LP2               ; 跳转到 LP2

LP1:
MOV BX, 0             ; 未找到 '*',将 BX 设为 0
LP2:
; 继续其他代码

总结(CMPSB/CMPSW)和(SCASB/SCASW)的区别

  • CMPSB/CMPSW:
    • 比较操作: 两个字符串的内容逐字节或逐字进行比较。
    • 应用场景: 用于比较两个字符串,通常用于验证它们是否相等或查找不同之处。
  • SCASB/SCASW:
    • 检索操作: 搜索单个字符串中的特定值。
    • 应用场景: 用于在字符串中查找特定的字节或字,并根据标志位确定是否找到了目标值。

简而言之,CMPSB/CMPSW 是比较两个字符串中的数据,而 SCASB/SCASW 是在一个字符串中搜索特定的数据。

只能操纵指定的寄存器

这些字符串操作指令在 x86 汇编中只能操纵特定的寄存器,这是指令设计的一个特点。具体来说:

  1. CMPSB/CMPSW:
    源寄存器: SI(Source Index),指向源字符串的内存地址,使用DS(Data Segment)段。
    目标寄存器: DI(Destination Index),指向目标字符串的内存地址,使用ES(Extra Segment)段。
    比较寄存器:比较操作隐式地使用 AL 或 AX 寄存器(实际比较操作由 CMPSB 或 CMPSW 执行的内存位置与内存位置之间进行)。
  2. SCASB/SCASW:
    目标寄存器: DI,指向字符串的内存地址,使用 ES 段。
    比较寄存器: AL(对于 SCASB)或 AX(对于 SCASW)是隐式指定的寄存器。指令将 AL 或 AX 中的值与 ES:DI 指向的内存内容进行比较。CMPSB/CMPSWSCASB/SCASW 指令只能操纵指定的寄存器,即 SIDIALAX。这些寄存器在指令中是隐式使用的,不能被其他寄存器替代。

CMPSB/CMPSWSCASB/SCASW 指令只能操纵指定的寄存器,即 SIDIALAX。这些寄存器在指令中是隐式使用的,不能被其他寄存器替代。

数据字节串/字串读出指令(LODSB/LODSW)

功能:

  • LODSB(Load String Byte):将[DS:SI]的字节数据加载到AL寄存器中,并将SI指针指向下一个字节。
  • LODSW(Load String Word):将[DS:SI]的字数据加载到AX寄存器中,并将SI指针指向下一个字(16位)。
示例 :使用 LODSB 读取数据
CLD               ; 清除方向标志DF,使操作从低地址到高地址
MOV SI, 2200H     ; 将源串的起始地址2200H加载到SI
MOV CX, 10        ; 准备读取10个字节的数据

READ_LOOP:
    LODSB         ; 将[DS:SI]中的字节数据加载到AL寄存器中,并将SI指针加1
    ; 这里可以对AL中的数据进行处理,例如存入其他寄存器或执行运算
    DEC CX        ; 将CX减1
    JNZ READ_LOOP ; 如果CX不为0,继续循环

; 循环结束后,AL中保存了最后一个读取的字节数据,SI指向最后一个字节之后的地址

数据和指针的移动

  • 数据存入AL:每次 LODSB 指令执行时,当前 SI 地址的字节数据被加载到 AL 寄存器中。处理完后,AL 寄存器中存储了当前读取的数据。
  • SI 寄存器的移动**:每次执行 LODSB 后,SI 的值增加 1。假设初始值为 2200H,经过一次 LODSB 操作后,SI 会变为 2201H,然后是 2202H,如此继续直到读取完 10 个字节。因此,SI 最终会指向最后一个字节之后的位置,即 2200H + 10 = 220AH
  • 最终状态
    • AL:保存了最后读取的字节数据,即第 10 个字节。
    • SI:指向最后一个读取字节的下一个地址,即 220AH

总结

  • LODSB 通过从当前 SI 指向的地址读取一个字节数据到 AL 寄存器,并将 SI 自动增加 1,从而实现从低地址到高地址的遍历。
  • 经过 10 次 LODSB 操作后,SI 指向的是最后一个读取字节之后的位置(220AH),AL 中则保存了最后一个读取的字节数据。

数据字节串/字串写入指令(STOSB/STOSW)

功能:

  • STOSB(Store String Byte):将AL寄存器的内容存入[ES:DI],并将DI指针指向下一个字节。
  • STOSW(Store String Word):将AX寄存器的内容存入[ES:DI],并将DI指针指向下一个字(16位)。
示例 :使用 STOSB 写入数据
CLD               ; 清除方向标志DF,使操作从低地址到高地址
MOV DI, 3200H     ; 将目的串的起始地址3200H加载到DI
MOV CX, 10        ; 准备写入10个字节的数据
MOV AL, 42H       ; 将字节42H加载到AL(假设需要写入的值是42H)

WRITE_LOOP:
    STOSB         ; 将AL寄存器中的值存入[ES:DI],并将DI指针加1
    DEC CX        ; 将CX减1
    JNZ WRITE_LOOP ; 如果CX不为0,继续循环

; 循环结束后,内存地址[3200H]到[3209H]中存储的都是42H,DI指向下一个位置320AH

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

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

相关文章

2024 高教社杯 数学建模国赛 (C题)深度剖析|农作物的种植策略|数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题&#xff01; CS团队倾注了大量时间和心血&#xff0c;深入挖掘解…

ChauffeurNet:通过模仿最佳驾驶和合成最坏情况进行学习驾驶

ChauffeurNet: Learning to Drive by Imitating the Best and Synthesizing the Worst ChauffeurNet&#xff1a;通过模仿最佳驾驶和合成最坏情况进行学习驾驶 https://arxiv.org/abs/1812.03079 Abstract Our goal is to train a policy for autonomous driving via imit…

4000字三合一!Stata、SPSS、MATLAB实现多元线性回归详解!

参加数学建模的小伙伴要注意了&#xff1a;多元线性回归几乎是所有分析方式里面最核心、最常用、最全面的模型&#xff0c;博主本科大致参加了10次数模&#xff0c;还有一次正大杯市场调研赛&#xff0c;其中获得拿得出手的奖有9次&#xff0c;有5次都用到了多元线性回归——至…

分享7款实现社会实践报告AI生成论文网站

在当今社会&#xff0c;AI技术的快速发展极大地改变了我们的生活方式和工作方式。特别是在学术研究和写作领域&#xff0c;AI工具的应用已经变得越来越普遍。本文将详细介绍7款实现社会实践报告AI生成的论文网站&#xff0c;并重点推荐千笔-AIPassPaper。 1. 千笔-AIPassPaper…

Flink 1.14.*中flatMap,filter等基本转换函数源码

这里以flatMap&#xff0c;filter为例&#xff0c;介绍Flink如果要实现这些基本转换需要实现哪些接口&#xff0c;Flink运行时调用这些实现类的入口&#xff0c;这些基本转换函数之间的类关系 一、创建基本转换函数需要实现类继承AbstractRichFunction并实现特性接口1、RichFla…

批量为某跟空间下的pod添加env(例如标签)

1、修改kube-apiserver配置文件&#xff0c;添加PodNodeSelector参数&#xff1a; –enable-admission-pluginsPodNodeSelector # 多个参数&#xff0c;则用逗号隔开systemctl daemon-reload systemctl restart kube-apiserver 2、修改指定命名空间内容&#xff1a; kubec…

SprinBoot+Vue校园活动报名微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

C# NX二次开发-获取体全部面

使用 UF_MODL_ask_body_faces 或获取一个体的全部面&#xff1a; 代码&#xff1a; theUf.Modl.AskBodyFaces(body.Tag, out var face_list);face_list.Foreach(x > x.NxListing()); 免责声明&#xff1a; 只用于参考&#xff0c;如果有什么问题不要找我呀。

Web开发的艺术:C#开发中实现代码简洁性与规范性的终极指南

一、变量的要求 变量名 1.简短有意义: 合适: student_count&#xff0c;student_ids&#xff0c;student_enable_list, water_price 不合适: numberOfItemsInTheCart, totalPriceOfTheOrderInTheShoppingCart,temp, data,list 2.变量名之间不要太像: 合适: totalAmount, disc…

NetSuite AI 图生代码

去年的ChatGPT热潮期间&#xff0c;我们写过一篇文章说GTP辅助编程的事。 NetSuite GPT的辅助编程实践_如何打开netsuite: html script notes的视图-CSDN博客文章浏览阅读2.2k次&#xff0c;点赞4次&#xff0c;收藏3次。作为GPT综合症的一种表现&#xff0c;我们今朝来探究下…

Kettle 锁表原因及解决办法【源码级分析】

文章目录 背景源码分析锁表场景1:资源库锁表锁表场景2:写日志锁表在哪里配置的kettle_log_table?官方解释自增 SQL 获取 BatchI 原理解决自增 SQL 获取 BatchID背景 Kettle 7.1.0 经常出现锁表的情况,体现为在数据库里有一条锁表 SQL,然后整个 Kettle 都无法运行。😂�…

【Python】简单的数据类型——int、float、bool、str

目录 1. 整数类型 int 2. 浮点数类型 float 3. 布尔类型 bool 4. 字符串 str 5. 类型转换 5.1 隐式类型转换 5.2 显示类型转换 6. 输出 6.1 print函数 6.2 格式化输出 7. 输入 1. 整数类型 int a 10 print(type(a)) print(type(-2))<class int> <class i…

HBase 部署及shell操作

HBase 数据库 一、HBase 概述1.1 HBase 是什么HBase 的特点 二、HBase 模型及架构2.1 HBase 逻辑模型2.2 HBase 数据模型2.3 HBase 物理模型2.3.1 列簇物理模型2.3.2 Rowkey 字段排序2.3.3 Region 存储到不同节点2.3.4 Region 结构 2.4 HBase 基本架构 三、搭建 HBase 分布式集…

ArcGIS栅格裁剪与合并,制作等高线

1、下载高程数据&#xff08;DEM&#xff09; https://mp.weixin.qq.com/s/ewlUUVV0PwdcspPGtSdCog 项目区域对应的卫片&#xff0c;也可以在谷歌地图里看大致经纬度范围 2、项目区域 确定项目区域&#xff0c;例如某个县区范围 3、栅格裁剪与合并 将DEM多个栅格数据合并&#…

DevOps学习笔记

记录以下DevOps学习笔记&#xff0c;这里是笔记的入口汇总&#xff0c;可以直观的看到所有的笔记&#xff0c;还没有入口的部分&#xff0c;在下正在努力编写中。 gitlab jenkins docker 1.docker安装 2.数据卷、挂载 artifactory 1.artifactory安装 2.artifactory使用 …

hyperf json-rpc

安装 安装docker hyperf 安装 hyperf-rpc-server-v8 &#xff08;服务端&#xff09; docker run --name hyperf-rpc-server-v8 \ -v /www/docker/hyperf-rpc-server:/data/project \ -w /data/project \ -p 9508:9501 -it \ --privileged -u root \ --entrypoint /bin/sh \…

使用 streamlink 把 m3u8 转为 mp4

问题描述&#xff0c; 背景&#xff0c; 来源&#xff1a; 下载 m3u8 ts —> 转为mp4, 按照以往的做法&#xff0c; 就是使用 python requests 一步一步地下载 m3u8, ts&#xff0c; 然后转换。 但是个人写的东西&#xff0c;毕竟问题比较多。 而且&#xff0c; 但是&…

2024国赛数学建模备赛|30种常用的算法模型之最优算法-非线性规划

1.1 非线性规划的实例与定义 如果目标函数或约束条件中包含非线性函数&#xff0c;就称这种规划问题为非线性规划问题。一般说来&#xff0c;解非线性规划要比解线性规划问题困难得多。而且&#xff0c;也不象线性规划有 单纯形法这一通用方法&#xff0c;非线性规划目前还没…

C#上位机使用Microsoft.Office.Interop.Excel和EPPlus库对Excel或WPS表格进行写操作

C#上位机使用Microsoft.Office.Interop.Excel和EPPlus库对Excel或WPS表格进行写操作 一、使用Microsoft.Office.Interop.Excel库 1、通过NuGet包管理器添加引用 按照下图中红框所示进行操作。 需要安装Microsoft.Office.Interop.Excel包 添加Microsoft Office 16.0 Object …

[全网首发]2024国赛数学建模ABCE题完整思路+py(matlab)代码+成品论文参考+持续更新

AB题详细思路(含问题一问题二模型) CE题问题一代码思路已经写好[pythonmatlab两种都会更新 需要完整版的看这里&#xff1a; 点击链接加入群聊【2024数学建模国赛资料汇总】&#xff1a;http://qm.qq.com/cgi-bin/qm/qr?_wv1027&klZncBILk30DuPRI1Bd8X-3Djv7ZVZyAv&…