6. 处理机控制指令 1) 标志处理指令 clc, stc, cmc, cld, std, cli, sti 2) ...
DESCRIPTION
6. 处理机控制指令 1) 标志处理指令 CLC, STC, CMC, CLD, STD, CLI, STI 2) 处理机控制指令 HLT, NOP, WAIT, ESC, LOCK. 1) 标志处理指令 ▲ 设置和清除标志的指令,只影响指令指定的标志. 2) 处理机控制指令 ① 暂停指令 HLT 格式 HLT 执行 使 CPU 处于暂停状态 用于等待外部中断,中断处理结束后, 继续执行 HLT 后的下一条指令 例 、、、 、、、 - PowerPoint PPT PresentationTRANSCRIPT
1
6. 处理机控制指令
1) 标志处理指令
CLC, STC, CMC, CLD, STD, CLI, STI
2) 处理机控制指令
HLT, NOP, WAIT, ESC, LOCK
2
1) 标志处理指令
▲设置和清除标志的指令,只影响指令指定的标志
指令格式 执行操作CLC CF=0
STC CF=1
CLM CF ← CF
CLD DF=0
STD DF=1
CLI IF=0
STI IF=1
3
2) 处理机控制指令
① 暂停指令 HLT
格式 HLT
执行 使 CPU 处于暂停状态
用于等待外部中断,中断处理结束后,继续执行 HLT 后的下一条指令
例 、、、 、、、
STI ; 允许外部中断 HLT ; 等待中断 MOV AX, 0
、、、 、、、
4
② 空操作指令 NOP
格式 NOP
指令不执行任何操作
mov BX, [100] 00B8
01
07
3Acmp AL,[BX]
B8FE11
mov BX, [100] 00B8
01
90
90
cmp AL,[BX]
90
3A07
nopnopnop
mov CX, 20HB9 20 00
例:
(也可用 NOP 指令进行短延时 ( 教材中的一些例子用到)
其机器码占一个字节单元, 在调试程序时,修改程序用。
5
7 .串处理指令
串的基本概念 顺序存放在内存中的一组数据,称为串。 用串的首(末)地址、元素类型、串的长度表示。
1234:0000string
DS:BX
‘A’ ‘B’ ‘C’ ‘D’ ‘ ’ ‘E’ 、、、 ‘Y’ ‘Z’
112233
1a2b3c4d
6
串操作种类
①串传送 将串从内存某一区域传送到另一区域。 ② 从串取 从串中取出某一元素。 ③ 存入串 将某个数据存入串中。 ④ 串比较 对两个串进行比较。 ⑤ 搜索串 在串中搜索(查找)某数据(关键字)
7
串处理指令格式
重复控制前缀 串指令
控制重复次数 基本操作
MOVSB 、 MOVSW 串传送REP LODSB 、 LODSW 从串取REPZ STOSB 、 STOSW 存入串REPNZ CMPSB 、 CMPSW 串比较 SCASB 、 SCASW 搜索串
例 REP MOVSB REPZ CMPSB REPNZ SCASW
8
① 串指令
串传送 MOVS
从串取 LODS
存入串 STOS
串比较 CMPS
搜索串 SCAS
9
▲串指令的特点
① 指令给出串操作的种类、类型,而操作数隐含给出。 如 MOVSB ; 字节 MOVSW ; 字
② 源串 由 DS : SI 指向的单元 目的串 由 ES : DI 指向的单元
③ 指令执行后,指针据 DF 标志、操作类型自动修改 字节操作 1 ; 字操作 2
DF= 0 用 + ; DF= 1 用 -
10
④ 对只有一个存储器操作数的串指令 如 LODS (从串取) STOS (存入串) SCAS (搜索串)
另一个操作数在 AL ( 字节操作 ) 或 AX ( 字操作 )
⑤ CMPS( 串比较 ) 、 SCAS( 串搜索 ) 影响标志, MOVS( 串传送 ) 、 LODS( 从串取 ) 、 STOS( 存入串 ) 不影响标志。
11
串传送
◢ ◢ 格式 MOVSB 字节传送 MOVSW 字传送
◢◢ MOVSB 执行操作 (ES:DI ) ← (DS:SI ) 字节传送 (SI ) ← (SI ) 1 修改源串指针
(DI) ← (DI ) 1 修改目的串指针 其中: DF = 0 ,用 + DF = 1 ,用 -
◢◢ MOVSW 执行操作 (ES:DI ) ← (DS:SI ) 字传送 (SI ) ← (SI ) 2 修改源串指针
(DI ) ← (DI ) 2 修改目的串指针
12
从串取◢ ◢ 格式 LODSB 取字节 LODSW 取字
◢◢ LODSB 执行操作 (AL) ← (DS:SI ) 从源串取入 AL
(SI ) ← (SI ) 1 修改源串指针
◢◢ LODSW 执行操作 (AX ) ← (DS:SI ) 从源串取入 AX
(SI ) ← (SI ) 2 修改源串指针
13
存入串
◢ ◢ 格式 STOSB 存入字节 STOSW 存入字
◢◢ STOSB 执行操作 (ES:DI) ← (AL) 将 AL 存入目的串 (DI ) ← (DI ) 1 修改目的串指针
◢◢ STOSW 执行操作 (ES:DI) ← (AX) 将 AX 存入目的串 (DI) ← (DI ) 2 修改目的串指针
14
串比较◢ ◢ 格式 CMPSB 字节比较 CMPSW 字比较
◢◢ CMPSB 执行操作 (DS:SI ) - (ES:DI ) 字节比较
(SI ) ← (SI ) 1 修改源串指针 (DI ) ← (DI ) 1 修改目的串指针
◢◢ CMPSW 执行操作 (DS:SI ) - (ES:DI ) 字比较
(SI ) ← (SI ) 2 修改源串指针 (DI ) ← (DI ) 2 修改目的串指针
注意: 1. 源串 - 目的串 2. 两数相减,只影响标志,不影响操作数
15
搜索串
◢ ◢ 格式 SCASB 取字节 SCASW 取字
◢◢ SCASB 执行操作 (AL) - (ES:DI ) 从目的串搜索字节
(DI ) ← (DI ) 1 修改目的串指针
◢◢ SCASW 执行操作 (AX ) - (ES:DI ) 从目的串搜索字节
(DI) ← (DI ) 2 修改目的串指针
两数相减,只影响标志,不影响操作数。
16
② 重复控制前缀
重复前缀 REP
当相等重复前缀 REPZ /REPE
当不相等重复前缀 REPNZ /REPNE
17
重复前缀 REP
执行过程:(1) 当 (CX)= 0 ,结束 REP , 执行 REP 下一条指令。(2) 当 (CX)≠0 ,将 CX 的 内容减1 , 执行 REP 后的串指令,返回 (1) 。
例 LEA DI, destination LEA SI, source MOV CX , 20 REP MOVSB MOV AX, 0
只在 (CX)=0 时退出循环
REP执行流程
(CX)=(CX)-1
REP后的串 指 令
Y
NCX=0 ?
18
当相等重复前缀 REPZ
执行过程:(1) 当 (CX)= 0 , 结束 REPZ , 执行 REPZ 下一条指令;(2) 当 (CX)≠0 ,将 CX 的内容减 1 , 执行 REPZ 后的串指令;(3) 当 ZF = 1, 返回 (1) ;(4) 当 ZF≠1, 则结束 REPZ,
执行 REPZ 下一条指令。
(CX) 减 1 操作不影响标志 ZF 标志由串操作决定 REPZ执行流程
(CX)=(CX)-1
REPZ后的串 指 令
Y
N
Y
N
CX=0?
ZF=1 ?
19
当不相等重复前缀 REPNZ
执行过程:(1) 当 (CX )= 0 , 结束 REPNZ , 执行 REPNZ 下一条指令。(2) 当 (CX)≠0 ,将 CX 的内容减 1 , 执行 REPNZ 后的串指令。(3) 当 ZF = 0, 返回 (1) ;(4) 当 ZF≠0, 则结束 REPNZ,
执行 REPNZ 下一条指令。
REPNZ执行流程
(CX)=(CX)-1
REPNZ后的串 指 令
Y
N
Y
N
CX=0 ?
ZF=0 ?
20
例 1 用 REP MOVS 进行数据块传送。 编程:①设置传送方向 用 CLD 使 DF = 0, 地址增加方向(正向) 用 STD 使 DF = 1, 地址减小方向(反向)②设置源串地址 将源串首地址 (DF=0) ,或末地址( DF=1 )放入 DS 、 SI 中。③设置目的串地址 将目的串首地址 (DF=0) ,或末地址( DF=1 )放入 ES 、 DI中。④设置串长度 将串的长度(传送次数)放入 CX 中。⑤字节传送用 REP MOVSB 字传送用 REP MOVSW
21
例 1 编程将存放在 str1 中的 4 字节字符串传送到 str2 定义的缓冲区中。
‘D’‘C’‘B’‘A’str1
str2
22
data1 SEGMENT str1 DB ‘ABCD’ ; 源串data1 ENDSdata2 SEGMENT str2 DB 4 DUP(?) ; 缓冲区data2 ENDScode SEGMENT 、、、、、、
CLD ;DF=0, 正方向传送 MOV AX , data1 ; 源串首地址的段值→ DS MOV DS , AX LEA SI , str1 ; 源串首地址的偏值→ SI MOV AX , data2 ; 目的串首地址的段值→ ES
MOV ES , AX LEA DI , str2 ; 目的串首地址的偏值→ DI
MOV CX, 4 ; 串长度 CX REP MOVSB ; 串传送
、、、、、、code ENDS
23
‘D’‘C’
‘B’‘A’
00H00H00H00H
FC、、、、F3
1234:0000str1
1235:0000str2
A4
1236:0000
程 序
CLD
REPMOVS
BB
data1 SEGMENTstr1 DB ‘ABCD’data1 ENDS
data2 SEGMENTstr2 DB 4 DUP(?)data2 EMDS
code SEGMENT 、、、、、、 CLD MOV AX , data1 MOV DS , AX LEA SI , str1 MOV AX , data2 MOV ES , AX LEA DI , str2 MOV CX, 4 REP MOVSB 、、、、、、
code ENDS
假设程序经汇编、连接后,装入内存的情况如下:
24
‘D’‘C’
‘B’‘A’
00H00H00H00H
1234:0000DS:SI
1235:0000ES:DI
(CX)=4
执行 REP前各寄存器的设置
执行一次 MOVSB后
‘D’‘C’
‘B’‘A’
‘A’00H00H00H
1234:0001DS:SI
1235:0001ES:DI
(CX)=3
执行完 REP后
‘D’‘C’
‘B’‘A’
‘A’‘B’‘C’‘D’
1234:0004DS:SI
1235:0004ES:DI
(CX)=0
程序执行结果:
25
例 2 比较 string1 和 string2 的两串 , 长度为 8 字节
string1 112233
、、、
、、、1a2b3c
4d
string2112233
、、、
、、、
1a1122
34
26
用 REPZ CMPS 进行串比较
编程:① 设置比较方向 (STD 或 CLD)
② 设置源串、目的串地址 将源串首地址 (DF=0 时 ) ,或末地址( DF=1 时)放入 DS 、 SI
将目的串首地址 (DF=0 时 ) ,或末地址( DF=1 时)放入ES 、 DI
③ 设置串长度 将串的长度放入 CX 中④ 按字节比较用 REPZ CMPSB
按字比较用 REPZ CMPSW
27
执行完 REPZ CMPS 后,根据 ZF 判断两串比较结果。
▲若 ZF=1, 两串相等,此时: CX=0, 表明串中所有元素已比较完毕 SI 、 DI 指向串尾的下一单元。
▲若 ZF=0, 两串不等,此时: CX 的值为剩下的未比较的元素个数。 SI 、 DI 指向不相等元素的下一元素。
28
code SEGMENT 、、、、、、 CLD ;DF=0, 正向比较 MOV AX , SEG string1 ; 源串首地址→ DS:SI MOV DS , AX LEA SI , string1 MOV AX , SEG string2 ; 目的串首地址→ ES:DI MOV ES , AX LEA DI , string2 MOV CX, 8 ; 串长度→ CX REPZ CMPSB ; 串比较 JZ equal ; 利用 ZF 判断比较结果 不相等处理 JMP exit
equal: 相等处理 exit: 、、、code ENDS
29
code SEGMENT 、、、、、、 CLD ;DF=0, 正向比较 MOV AX , SEG string1 ; 源串首地址→ DS:SI MOV DS , AX LEA SI , string1 MOV AX , SEG string2 ; 目的串首地址→ ES:DI MOV ES , AX LEA DI , string2 MOV CX, 8 ; 串长度→ CX REPZ CMPSB
JZ equal 不相等处理 JMP exit equal: 相等处理 exit: 、、、code ENDS
JNZ notequ 相等处理 JMP exit notequ: 不相等处理exit: 、、、
30
、、、 、、、112233
44
1a2b3c
4d
11223344
1a2b3c
4d
string1 string2
DS:SI ES:DI (CX)=0, ZF=1
执行完 REPZ CMPSB 后,此时:ZF=1, 两串相等CX=0 , 两串所有元素已比较完SI 、 DI 串尾的下一单元
例
31
、、、 、、、112233
44
1a
4d
11223344
2c
4d
2b3c
3b3c
string1 string2
DS:SI ES:DI (CX)=3,ZF=0
执行完 REPZ CMPSB 后,此时:ZF=0, 两串不等CX=3, 剩下的未比较的元素个数SI 、 DI 指向不相等元素的下一元素。
例
32
例 3 用 REPNZ SCAS 在串中找关键字。
编程步骤:①设置查找方向②设置串地址 将串的首地址 (DF=0 时 ) ,或末地址( DF=1 时)放入 ES 、DI 中。③设置关键字 将关键字放入 AL ( 关键字为字节 ) 或 放入 AX( 关键字为字 ) 。④设置串长度 将串的长度放入 CX 中。⑤查找字节用 REPNZ SCASB
查找字用 REPNZ SCASW
33
执行完 REPNZ SCAS 后,根据 ZF 判断查找结果。
▲若 ZF=1, 则串中有关键字,此时: CX 的值为剩下的未搜索的元素个数, DI 指向关键字元素的下一元素, 而关键字在 ( DI )-1 的位置
▲若 ZF=0, 则串中无关键字,此时: CX=0 ,表明串中所有元素以搜索完毕 DI 指向串尾的下一单元。
34
例 、、、 REPNZ SCASB JZ found 未找到处理 JMP exitfound: 找到处理exit: 、、、
关键字元素( DI ) = 0003‘C’
‘$’
‘B’
‘A’
‘D’ ( CX) = 0002 ZF=1
执行后
( DI ) = 0000
(CX) = 0005
(AL) = ‘$’
执行前
注意:$ 字符在(DI)-1=0002H的位置
35
▲串指令可单独使用
MOV AL, [SI]
MOV ES:[DI], AL 等价于 MOVSB
INC SI
INC DI ( 假设 DF=0)
next: JCXZ exit
DEC CX
MOVSB 等价于 REP MOVSB
JMP next
exit: 、、
说明:
36
下面程序段完成字传送 (8000:1000H) ← (4000:2000H)
MOV AX, 4000H
MOV DS, AX
MOV SI, 2000H
MOV AX, 8000H
MOV ES, AX
MOV DI, 1000H
MOVSW
37
▲可在有源操作数的串指令前使用段跨越前缀, 此时:源串操作数的段值由段跨越前缀指定。 包括指令 MOVS 、 LODS 、 CMPS
例 ES : MOVSB
执行 ( ES:DI ) ← (ES:SI)
而不是 ( ES:DI ) ← (DS:SI)
ES: SCASB 没有源串ES: STOSW
▲目的串操作数不允许使用段跨越前缀,即串指令前的段跨越前缀必指源串操作数。
38
▲重复前缀中 CX 减 1 操作,不影响标志。
REPNZ执行流程
(CX)=(CX)-1
REPNZ后的串 指 令
Y
N
Y
N
CX=0 ?
ZF=0 ?
REP执行流程
(CX)=(CX)-1
REP后的串 指 令
Y
NCX=0 ?
(CX)=(CX)-1
REPZ后的串 指 令
Y
N
Y
N
CX=0?
ZF=1 ?
REPZ执行流程
39
操作类型默 认段寄存器
是否允许段 跨 越 有效地址
取指令 CS 否 IP
以 BP做基址的 操 作 数
SS CS、DS、ES EA
直接寻址、以 BX做基址的 操 作 数
DS CS、SS、ES EA
堆栈操作 SS 否 SP
源 串 DS CS、SS、ES SI串操作 目的串 ES 否 DI
几种操作复习
40
DSESSSCS
IP
数据暂存器
PSW 标志寄存器 执行部件控制电路
指令译码器
AXBXCXDX
AHBHCHDH
SIDIBPSP
ALBLCLDL
寄存器组
指令队列
总线接口控制电路
运算器
地址加法器
、、、指令 1
指令 2
指令 3
指令 4
、、、数据 1
数据 2
数据 3
、、、
地址总线 AB
数据总线 DB
控制总线 CB
地
址
译
码
器
41
本节结束,谢谢合作!请继续学习下面的内容!