目录

0. REP 重复前缀

1. 串操作指令的基本概念

2. 串操作指令的指令类型

(1)串传送指令 MOVS

(2)串比较指令 CMPS

(3)串扫描指令 SCAS

(4)串装入指令 LODS

(5)串存储指令 STOS


0. REP 重复前缀

① REP 无条件重复前缀:重复执行规定的操作,直至 CX = 0 。

② REPE/REPZ 有条件重复前缀:相等或结果为 0 时重复,即 ZF = 1,并且 CX ≠ 0 。

③ REPNE/REPNZ 有条件重复前缀:不相等或结果不为 0 时重复,即 ZF = 0,并且 CX ≠ 0 。

REP 重复前缀操作不影响标志位。

先执行串操作指令,串操作指令可能会影响标志位。然后 CX - 1,并判断条件。

执行流程:

  • 执行串操作指令(会影响 FLAGS)
  • CX - 1(不会影响 FLAGS)
  • 判断 CX 和 ZF 是否仍满足条件

1. 串操作指令的基本概念

(1)定义

字符串:存储器中地址连续的若干单元的字符或数据称为字符串或数据串。

串操作指令:就是用来对串中每个字符或数据做同样操作的指令。

特点:每执行一次操作后自动修改指针,再执行下一次操作。

串操作指令是 8086 指令系统中 唯一 能直接处理源和目的操作数都在存储单元的指令。

(2)共同特点

① 源串默认为数据段,允许段重设,偏移地址用 SI 寄存器指定,即源串指针为 DS:SI 。

② 目的串默认为附加段,不允许段重设,偏移地址用 DI 寄存器指定,即目的串指针为 ES:DI 。

③ 串长度值放在 CX 寄存器中。

④ 在对每个字节或字操作后,SI 和 DI 寄存器的内容自动修改。

修改方向与标志位 DF 有关:

  • 若 DF = 0,SI 和 DI 按地址增量方向修改;
  • 若 DF = 1,SI 和 DI 按地址减量方向修改。

对字节操作加/减 1,对字操作加/减 2 。

⑤ 可以在串操作指令前使用重复前缀,在每次串操作后 CX 的内容自动减 1,直至 CX = 0 或不满足指定的条件为止。

2. 串操作指令的指令类型

(1)串传送指令 MOVS

3 种格式:

MOVS OPRD1, OPRD2  ; OPRD1为目的串地址,OPRD2为源串地址
MOVSB              ; 一次完成一个字节的传送
MOVSW              ; 一次完成一个字的传送

第一种格式多用于需要段重设的情况。

执行:

  • DS:[SI] → ES:[DI]
  • SI + n → SI,DI + n → DI

n 的值取 1 或 2,分别对应字节和字。

MOVS 指令不影响标志位,常用无条件重复前缀 REP 联合使用。

加上 REP 后执行流程:

  • 执行串操作指令(会影响 FLAGS)
  • CX - 1(不会影响 FLAGS)
  • 判断 CX 是否仍满足条件

应用举例:

将数据段 2000H:1200H 地址开始的 100 个字节传送到 6000H:0000H 开始的内存单元。

MOV AX, 2000H    ; 初始化化段寄存器
MOV DS, AX       ; 立即数不能直接送入段寄存器
MOV SI, 1200H    ; 初始化偏移地址MOV AX, 6000H
MOV ES, AX
MOV DI, 0MOV CX, 100      ; 初始化计数器
CLD              ; 设置地址指针修改方向
REP MOVSB        ; 进行串传送HLT

CLD:将 DF 位清零。地址指针按自增方式进行。

(2)串比较指令 CMPS

3 种格式:

CMPS OPRD1, OPRD2  ; OPRD1为目的串地址,OPRD2为源串地址
CMPSB              ; 按照字节进行比较
CMPSW              ; 按照字进行比较

第一种格式多用于需要段重设的情况。

执行:

  • DS:[SI] - ES:[DI](不会改变操作数本身)
  • SI + n → SI,DI + n → DI

这里是源操作数 - 目的操作数,其实无所谓谁减谁。

CMPS 指令要影响标志位。

CMPS 指令常与重复前缀 REPE/REPZ 或 REPNE/REPNZ 联合使用,用来检查两个字符串是否相等或不相等:

  • REPE/REPZ,若 ZF = 1 且 CX ≠ 0,则重复比较。
  • REPNE/REPNZ,若 ZF = 0 且 CX ≠ 0,则重复比较。

ZF 位取决于串比较的结果。

应用举例:

比较两个字符串是否相同,并找出其中第一个不相同字符的地址,将该地址送 BX,不相同的源字符送 AL 。字符串长度均为 200 字节,M1 为源串起始偏移地址,M2 为目的串起始偏移地址。

    MOV SI, M1    ; 初始化偏移地址MOV DI, M2    ; 初始化偏移地址MOV CX, 200   ; 初始化计数器CLD           ; 设置地址指针修改方向REP CMPSB     ; 进行串比较JZ STOP       ; 针对全部字符相同的情况DEC SI        ; 减去SI自动加的1MOV BX, SIMOV AX, [SI]STOP:HLT

(3)串扫描指令 SCAS

3 种格式:

SCAS OPRD    ; OPRD为目的串
SCASB        ; 按照字节进行比较
SCASW        ; 按照字进行比较

执行:

  • AL/AX - ES:[DI](不会改变操作数本身)
  • DI + n → DI(不会改变 SI 寄存器)

累加器 AL/AX 作源操作数,ES:[DI] 作目的操作数。

SCAS 指令要影响标志位。

应用举例(必考双重循环):

在 ES 段中从 2000H 单元开始存放了 10 个字符,编程计数这串字符中有多少个 “A”,并将计数值存入寄存器 BX 中。

    MOV DI, 2000HMOV CX, 10MOV AL, 'A'    ; 设置比较内容MOV BX, 0CLD            ; 初始化地址指针修改方向
NEXT:REP SCASBJNZ STOP       ; 针对全部字符相同的情况INC BXCMP CX, 0      ; 判断是否还有字符未比较JNZ NEXT
STOP:HLT

(4)串装入指令 LODS

 3 种格式:

LODS OPRD    ; OPRD为源串
LODSB        ; 将源串按字节装入AL
LODSW        ; 将源串按字装入AX

执行:

  • DS:[SI] → AL/AX
  • SI + n → SI(不会改变 DI 寄存器)

DS:[SI] 作源操作数,累加器 AL/AX 作目的操作数。

LODS 指令不影响标志位。

一般不带重复前缀指令,避免后面装入的数据覆盖前面装入的数据。

; LODSB等价于
MOV AL, [SI]
INC SI; LODSW等价于
MOV AX, [SI]
INC SI
INC SI

(5)串存储指令 STOS

  3 种格式:

STOS OPRD    ; OPRD为目的串
STOSB        ; 将AL内容按字节装入目的串
STOSW        ; 将AX内容按字装入目的串

执行:

  • AL/AX → ES:[DI]
  • DI + n → DI(不会改变 SI 寄存器)

累加器 AL/AX 作源操作数,ES:[DI] 作目的操作数。

STOS 指令不影响标志位。

STOS 指令利用重复前缀 REP 可对连续存储单元存入相同的值。

; STOSB等价于
MOV [DI], AL
INC DI; STOSW等价于
MOV [DI], AX
INC DI
INC DI

应用举例:

用串存储指令实现对 6000H:1200H 开始的 100 个字单元内容清零。

MOV AX, 6000H
MOV ES, AX
MOV DI, 1200HMOV CX, 100
MOV AX, 0      ; 设置装入内容
CLD            ; 设置地址指针修改方向
REP STOSWHLT

注意要点:

① 操作对象是源串还是目的串,进而确定使用的段寄存器和变址寄存器。

② 别忘了设置地址指针修改方向。

③ 分类讨论全部字符相同的情况。

DJ12-2 8086 系列指令系统(第三节课)相关推荐

  1. DJ12-2 8086 系列指令系统(第一节课)

    目录 1. 加法指令 (1)ADD 指令 (2)ADC 指令 (3)INC 指令 2. 减法指令 (1)SUB 指令 (2)SBB 指令 (3)DEC 指令 (4)NEG 求补指令 (5)CMP 比较 ...

  2. php魔鬼训练课训练第一阶段,【三节课】运营系列P1课程之魔鬼训练营第一周感想...

    运营,越来越火的一个名词.但每当别人问起?我却怎么也讲不明白. 所以我接下来我们聊聊老黄和他的三节课. 1 三节课课程分为P1/P2/P3/P4/P5以上级别.简单说说区分: P1比较适合小白或者1年 ...

  3. 微机原理8086/8088——指令系统与寻址方式

    微机原理8086/8088概念系列 微机原理8086/8088--微型计算机组成 微机原理8086/8088--微处理器功能结构 微机原理8086/8088--内部寄存器 微机原理8086/8088- ...

  4. 从三节课看中国互联网人教育的再发展

    众所周知,在互联网这个生态大熔炉里,每时每刻都有新事物在诞生,也有旧事物在灭亡.互联网人也在调查中明确指出"在工作中缺少有力的指导"这一严峻的现实问题,而传统的高等教育已经不能跟得 ...

  5. 微机笔记2——8086/8088指令系统

    8086/8088寻址方式 寄存器寻址 操作数存放在寄存器中 立即寻址 操作数存放在内存代码段 直接寻址 操作数存放在内存 寄存器间接寻址 操作数存放在内存 变址寻址 操作数存放在内存 基址加变址寻址 ...

  6. Lance老师UI系列教程第三课-QQ登录注册界面的实现(android-2012最新版)

    分类: android UI教程2012-08-06 22:37 3731人阅读 评论(6) 收藏 举报 uiandroidqqlayoutbutton UI系列教程第三课:腾讯登录注册界面的实现 今 ...

  7. 汇编语言(四)-8086的指令系统

    8086的指令系统 1. 数据传送指令 1.1 通用数据传送 1.2 地址传送指令 1.3 标志寄存器传送 1.4 累加器专用指令 2. 算术指令 2.1 加法运算指令 2.2 减法运算指令 2.3 ...

  8. Qt 5.9.5学习笔记第三节课

    Qt 5.9.5学习笔记第三节课 学习目标 1.Qt资源图标添加和使用 1.1添加资源文件 1.2qmake让资源文件生效 1.3修改widget应用程序窗口ICO 1.3.1第一种方法 1.3.2 ...

  9. 三节课-产品视角养成

    三节课-产品视角养成 产品视角看什么? ·产品形态:产品是做什么呢?用户之间是怎么连接的? ·关键业务逻辑:关键功能的使用过程是什么? ·功能流程:具体某个功能和迭代点是怎么实现的? ·交互体验:页面 ...

最新文章

  1. SFB 项目经验-65-使用域管理员安装不了Exchange 2010 SP3 CU21
  2. Java实战应用50篇(一)-Java并发编程:volatile关键字解析
  3. BigDecimal源码解析
  4. 关于LR录制时不能自动启动IE浏览器的解决方法
  5. 前端学习(2842):UI组件的开发和配置
  6. Java-数据结构与算法-逢3减1
  7. MFC:2个重载中没有一个可以转换所有参数类型
  8. mysql 修改单表导入大小_MySQL更改大库大表存储引擎方案
  9. 志汇超级外卖餐饮 5.9.2 + 超级跑腿 v1.9.5 打包下载 小程序模块
  10. git rebase --onto
  11. 使用SVN clang: error: linker command failed with exit code 1 (use -v to see invocation)
  12. GStreamer基础教程01 - Hello World
  13. IntelliJ IDEA运行内存设置
  14. 关于linux python3.7版本 No module named ‘_ssl‘报错
  15. linux设置小技巧
  16. 【golang】golang使用cmd去ping网址在window和linux的区别
  17. 二分查找算法应用-实现求平方根函数
  18. 疑因内部宫斗被离职,中兴70后程序员从公司坠楼 ​​​​
  19. python_numpy_计算对数收益率和还原问题
  20. Others10_玩转信用卡之信用卡黑话

热门文章

  1. 使用Redis实现整个页面的缓存
  2. 未选择的路*弗罗斯特
  3. PTA字符串关键字的散列映射 (哈希表)
  4. 如何知道当前操作系统是centos的哪个版本和内核版本?
  5. 黑马程序员——C语言基础--数组和字符串
  6. IDEA 加断点debug时阻塞问题
  7. final修饰的变量就是常量?
  8. TCP 和 UDP 可以使用相同端口吗?
  9. yocto(二)——bitbake工作流程
  10. 【往届EI已检索】2023年第三届应用数学、建模与智能计算国际研讨会(CAMMIC2023)