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, 0

MOV 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自动加的1
    MOV BX, SI
    MOV 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, 2000H

    MOV CX, 10
    MOV AL, 'A'    ; 设置比较内容
    MOV BX, 0
    CLD            ; 初始化地址指针修改方向
NEXT:
    REP SCASB
    JNZ STOP       ; 针对全部字符相同的情况
    INC BX
    CMP 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, 1200H

MOV CX, 100
MOV AX, 0      ; 设置装入内容
CLD            ; 设置地址指针修改方向
REP STOSW

HLT


注意要点:

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

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

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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值