目录
1. REP 重复前缀
2. 串操作指令的基本概念
3. 串操作指令的指令类型
(1)串传送指令 MOVS
(2)串传送指令 CMPS
(3)串扫描指令 SCAS
(4)串装入指令 LODS
(5)串存储指令 STOS
(1)REP 无条件重复前缀
重复执行规定的操作,直至CX=0。
(2)REPE/REPZ 有条件重复前缀
相等或结果为 0 时重复,即 ZF = 1,并且 CX ≠ 0 。
(3)REPNE/REPNZ 有条件重复前缀
不相等或结果不为 0 时重复,即 ZF = 0,并且 CX ≠ 0 。
REP 重复前缀操作不影响标志位。
先执行串操作指令,串操作指令可能会影响标志位。然后 CX - 1,并判断条件。
执行流程:
(1)定义
字符串:存储器中地址连续的若干单元的字符或数据称为字符串或数据串。
串操作指令:就是用来对串中每个字符或数据做同样操作的指令。
特点:每执行一次操作后自动修改指针,再执行下一次操作。
串操作指令是8086指令系统中唯一能直接处理源和目标操作数都在存储单元的指令。
(2)共同特点
① 源串默认为数据段,允许段重设,偏移地址用 SI 寄存器指定,即源串指针为 DS:SI。
② 目的串默认为附加段,不允许段重设,偏移地址用 DI 寄存器指定,即目的串指针为 ES:DI。
③ 串长度值放在 CX 寄存器中。
④ 在对每个字节或字操作后,SI 和 DI 寄存器的内容自动修改。修改方向与标志位 DF 有关:
对字节操作加/减 1,对字操作加/减 2 。
⑤ 可以在串操作指令前使用重复前缀,在每次串操作后 CX 的内容自动减 1,直至 CX = 0 或不满足指定的条件为止。
格式:MOVS OPRD1,OPRD2
实际使用:
执行:
MOVS 指令不影响标志位,常用无条件重复前缀 REP 联合使用。
加上 REP 后执行流程:
例题
将数据段 2000H:1200H 地址开始的 100 个字节传送到 6000H:0000H 开始的内存单元。
格式:CMPS OPRD1,OPRD2
实际使用:
执行:
这里是源 - 目的,其实无所谓谁减谁。
CMPS 指令要影响标志位。
CMPS 指令常与重复前缀 REPE/REPZ 或 REPNE/REPNZ 联合使用,用来检查两个字符串是否相等或不相等:
ZF 位取决于串比较的结果。
例题
比较两个字符串是否相同,并找出其中第一个不相同字符的地址,将该地址送 BX,不相同的源字符送 AL。字符串长度均为 200 字节,M1 为源串起始偏移地址,M2 为目的串起始偏移地址。
格式:SCAS OPRD
实际使用:
执行:
累加器 AL/AX 作源操作数,ES:[DI] 作目的操作数。
SCAS 指令要影响标志位。
例题
在 ES 段中从 2000H 单元开始存放了 10 个字符,编程计数这串字符中有多少个 “A”,并将计数值存入寄存器 BX 中。
(必考)双重循环
格式:LODS OPRD
实际使用:
执行:
DS:[SI] 作源操作数,累加器 AL/AX 作目的操作数。
LODS 指令不影响标志位。
一般不带重复前缀指令,避免后面装入的数据覆盖前面装入的数据。
格式:STOS OPRD
实际使用:
执行:
累加器 AL/AX 作源操作数,ES:[DI] 作目的操作数。
STOS 指令不影响标志位。
STOS 指令利用重复前缀 REP 可对连续存储单元存入相同的值。
例题
用串存储指令实现对 6000H:1200H 开始的 100 个字单元内容清零。