Upload
dorie
View
232
Download
0
Embed Size (px)
DESCRIPTION
6. 处理机控制指令 1) 标志处理指令 CLC, STC, CMC, CLD, STD, CLI, STI 2) 处理机控制指令 HLT, NOP, WAIT, ESC, LOCK. 1) 标志处理指令 ▲ 设置和清除标志的指令,只影响指令指定的标志. 2) 处理机控制指令 ① 暂停指令 HLT 格式 HLT 执行 使 CPU 处于暂停状态 用于等待外部中断,中断处理结束后, 继续执行 HLT 后的下一条指令 例 、、、 、、、 - PowerPoint PPT Presentation
Citation preview
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
本节结束,谢谢合作!请继续学习下面的内容!