DJ12-2 8086 系列指令系统(第三节课)
目录
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 系列指令系统(第三节课)相关推荐
- DJ12-2 8086 系列指令系统(第一节课)
目录 1. 加法指令 (1)ADD 指令 (2)ADC 指令 (3)INC 指令 2. 减法指令 (1)SUB 指令 (2)SBB 指令 (3)DEC 指令 (4)NEG 求补指令 (5)CMP 比较 ...
- php魔鬼训练课训练第一阶段,【三节课】运营系列P1课程之魔鬼训练营第一周感想...
运营,越来越火的一个名词.但每当别人问起?我却怎么也讲不明白. 所以我接下来我们聊聊老黄和他的三节课. 1 三节课课程分为P1/P2/P3/P4/P5以上级别.简单说说区分: P1比较适合小白或者1年 ...
- 微机原理8086/8088——指令系统与寻址方式
微机原理8086/8088概念系列 微机原理8086/8088--微型计算机组成 微机原理8086/8088--微处理器功能结构 微机原理8086/8088--内部寄存器 微机原理8086/8088- ...
- 从三节课看中国互联网人教育的再发展
众所周知,在互联网这个生态大熔炉里,每时每刻都有新事物在诞生,也有旧事物在灭亡.互联网人也在调查中明确指出"在工作中缺少有力的指导"这一严峻的现实问题,而传统的高等教育已经不能跟得 ...
- 微机笔记2——8086/8088指令系统
8086/8088寻址方式 寄存器寻址 操作数存放在寄存器中 立即寻址 操作数存放在内存代码段 直接寻址 操作数存放在内存 寄存器间接寻址 操作数存放在内存 变址寻址 操作数存放在内存 基址加变址寻址 ...
- Lance老师UI系列教程第三课-QQ登录注册界面的实现(android-2012最新版)
分类: android UI教程2012-08-06 22:37 3731人阅读 评论(6) 收藏 举报 uiandroidqqlayoutbutton UI系列教程第三课:腾讯登录注册界面的实现 今 ...
- 汇编语言(四)-8086的指令系统
8086的指令系统 1. 数据传送指令 1.1 通用数据传送 1.2 地址传送指令 1.3 标志寄存器传送 1.4 累加器专用指令 2. 算术指令 2.1 加法运算指令 2.2 减法运算指令 2.3 ...
- Qt 5.9.5学习笔记第三节课
Qt 5.9.5学习笔记第三节课 学习目标 1.Qt资源图标添加和使用 1.1添加资源文件 1.2qmake让资源文件生效 1.3修改widget应用程序窗口ICO 1.3.1第一种方法 1.3.2 ...
- 三节课-产品视角养成
三节课-产品视角养成 产品视角看什么? ·产品形态:产品是做什么呢?用户之间是怎么连接的? ·关键业务逻辑:关键功能的使用过程是什么? ·功能流程:具体某个功能和迭代点是怎么实现的? ·交互体验:页面 ...
最新文章
- SFB 项目经验-65-使用域管理员安装不了Exchange 2010 SP3 CU21
- Java实战应用50篇(一)-Java并发编程:volatile关键字解析
- BigDecimal源码解析
- 关于LR录制时不能自动启动IE浏览器的解决方法
- 前端学习(2842):UI组件的开发和配置
- Java-数据结构与算法-逢3减1
- MFC:2个重载中没有一个可以转换所有参数类型
- mysql 修改单表导入大小_MySQL更改大库大表存储引擎方案
- 志汇超级外卖餐饮 5.9.2 + 超级跑腿 v1.9.5 打包下载 小程序模块
- git rebase --onto
- 使用SVN clang: error: linker command failed with exit code 1 (use -v to see invocation)
- GStreamer基础教程01 - Hello World
- IntelliJ IDEA运行内存设置
- 关于linux python3.7版本 No module named ‘_ssl‘报错
- linux设置小技巧
- 【golang】golang使用cmd去ping网址在window和linux的区别
- 二分查找算法应用-实现求平方根函数
- 疑因内部宫斗被离职,中兴70后程序员从公司坠楼 ​​​​
- python_numpy_计算对数收益率和还原问题
- Others10_玩转信用卡之信用卡黑话