6. 处理机控制指令 1) 标志处理指令 CLC, STC, CMC, CLD, STD, CLI, STI 2) ...

41
1 6. 处处处处处处处 1) 处处处处处处 CLC, STC, CMC, CLD, STD, CLI, STI 2) 处处处处处处处 HLT, NOP, WAIT, ESC, LOCK

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

Transcript of 6. 处理机控制指令 1) 标志处理指令 CLC, STC, CMC, CLD, STD, CLI, STI 2) ...

Page 1: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

1

6. 处理机控制指令

1) 标志处理指令

CLC, STC, CMC, CLD, STD, CLI, STI

2) 处理机控制指令

HLT, NOP, WAIT, ESC, LOCK

Page 2: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

2

1) 标志处理指令

▲设置和清除标志的指令,只影响指令指定的标志

指令格式 执行操作CLC CF=0

STC CF=1

CLM CF ← CF

CLD DF=0

STD DF=1

CLI IF=0

STI IF=1

Page 3: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

3

2) 处理机控制指令

① 暂停指令 HLT

格式 HLT

执行 使 CPU 处于暂停状态

用于等待外部中断,中断处理结束后,继续执行 HLT 后的下一条指令

例 、、、 、、、

STI ; 允许外部中断 HLT ; 等待中断 MOV AX, 0

、、、 、、、

Page 4: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

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 指令进行短延时 ( 教材中的一些例子用到)

其机器码占一个字节单元, 在调试程序时,修改程序用。

Page 5: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

5

7 .串处理指令

串的基本概念 顺序存放在内存中的一组数据,称为串。 用串的首(末)地址、元素类型、串的长度表示。

1234:0000string

DS:BX

‘A’ ‘B’ ‘C’ ‘D’ ‘ ’ ‘E’ 、、、 ‘Y’ ‘Z’

112233

1a2b3c4d

Page 6: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

6

串操作种类

①串传送 将串从内存某一区域传送到另一区域。 ② 从串取 从串中取出某一元素。 ③ 存入串 将某个数据存入串中。 ④ 串比较 对两个串进行比较。 ⑤ 搜索串 在串中搜索(查找)某数据(关键字)

Page 7: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

7

串处理指令格式

重复控制前缀   串指令

控制重复次数  基本操作

MOVSB 、 MOVSW 串传送REP LODSB 、 LODSW 从串取REPZ STOSB 、 STOSW 存入串REPNZ CMPSB 、 CMPSW 串比较 SCASB 、 SCASW 搜索串

例 REP MOVSB REPZ CMPSB REPNZ SCASW

Page 8: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

8

① 串指令

串传送 MOVS

从串取 LODS

存入串 STOS

串比较 CMPS

搜索串 SCAS

Page 9: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

9

▲串指令的特点

① 指令给出串操作的种类、类型,而操作数隐含给出。 如 MOVSB ; 字节 MOVSW ; 字

② 源串 由 DS : SI 指向的单元 目的串 由 ES : DI 指向的单元

③ 指令执行后,指针据 DF 标志、操作类型自动修改 字节操作 1 ; 字操作 2

DF= 0 用 + ; DF= 1 用 -

Page 10: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

10

④ 对只有一个存储器操作数的串指令 如 LODS (从串取) STOS (存入串) SCAS (搜索串)

另一个操作数在 AL ( 字节操作 ) 或 AX ( 字操作 )

⑤ CMPS( 串比较 ) 、 SCAS( 串搜索 ) 影响标志, MOVS( 串传送 ) 、 LODS( 从串取 ) 、 STOS( 存入串 ) 不影响标志。

Page 11: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

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 修改目的串指针

Page 12: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

12

从串取◢ ◢ 格式 LODSB 取字节 LODSW 取字

◢◢ LODSB 执行操作 (AL) ← (DS:SI )   从源串取入 AL

(SI ) ← (SI ) 1 修改源串指针

◢◢ LODSW 执行操作 (AX ) ← (DS:SI )   从源串取入 AX

(SI ) ← (SI ) 2 修改源串指针

Page 13: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

13

存入串

◢ ◢ 格式 STOSB 存入字节 STOSW 存入字

◢◢ STOSB 执行操作 (ES:DI) ← (AL)   将 AL 存入目的串 (DI ) ← (DI ) 1 修改目的串指针

◢◢ STOSW 执行操作 (ES:DI) ← (AX)   将 AX 存入目的串 (DI) ← (DI ) 2 修改目的串指针

Page 14: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  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. 两数相减,只影响标志,不影响操作数

Page 15: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

15

搜索串

◢ ◢ 格式 SCASB 取字节 SCASW 取字

◢◢ SCASB 执行操作 (AL) - (ES:DI )   从目的串搜索字节

(DI ) ← (DI ) 1 修改目的串指针

◢◢ SCASW 执行操作 (AX ) - (ES:DI )   从目的串搜索字节

(DI) ← (DI ) 2 修改目的串指针

两数相减,只影响标志,不影响操作数。

Page 16: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

16

② 重复控制前缀

重复前缀 REP

当相等重复前缀 REPZ /REPE

当不相等重复前缀 REPNZ /REPNE

Page 17: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

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 ?

Page 18: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

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 ?

Page 19: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

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 ?

Page 20: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

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

Page 21: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

21

例 1 编程将存放在 str1 中的 4 字节字符串传送到 str2 定义的缓冲区中。

‘D’‘C’‘B’‘A’str1

str2

Page 22: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

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

Page 23: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

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

假设程序经汇编、连接后,装入内存的情况如下:

Page 24: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

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

程序执行结果:

Page 25: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

25

例 2 比较 string1 和 string2 的两串 , 长度为 8 字节

string1 112233

、、、

、、、1a2b3c

4d

string2112233

、、、

、、、

1a1122

34

Page 26: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

26

用 REPZ CMPS 进行串比较

编程:① 设置比较方向 (STD 或 CLD)

② 设置源串、目的串地址 将源串首地址 (DF=0 时 ) ,或末地址( DF=1 时)放入 DS 、 SI

将目的串首地址 (DF=0 时 ) ,或末地址( DF=1 时)放入ES 、 DI

③ 设置串长度 将串的长度放入 CX 中④ 按字节比较用 REPZ CMPSB

按字比较用 REPZ CMPSW

Page 27: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

27

执行完 REPZ CMPS 后,根据 ZF 判断两串比较结果。

▲若 ZF=1, 两串相等,此时: CX=0, 表明串中所有元素已比较完毕 SI 、 DI 指向串尾的下一单元。

▲若 ZF=0, 两串不等,此时: CX 的值为剩下的未比较的元素个数。 SI 、 DI 指向不相等元素的下一元素。

Page 28: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

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

Page 29: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

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: 、、、

Page 30: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

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 串尾的下一单元

Page 31: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

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 指向不相等元素的下一元素。

Page 32: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

32

例 3 用 REPNZ SCAS 在串中找关键字。

编程步骤:①设置查找方向②设置串地址 将串的首地址 (DF=0 时 ) ,或末地址( DF=1 时)放入 ES 、DI 中。③设置关键字 将关键字放入 AL ( 关键字为字节 ) 或 放入 AX( 关键字为字 ) 。④设置串长度 将串的长度放入 CX 中。⑤查找字节用 REPNZ SCASB

查找字用 REPNZ SCASW

Page 33: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

33

执行完 REPNZ SCAS 后,根据 ZF 判断查找结果。

▲若 ZF=1, 则串中有关键字,此时: CX 的值为剩下的未搜索的元素个数, DI 指向关键字元素的下一元素, 而关键字在 ( DI )-1 的位置

▲若 ZF=0, 则串中无关键字,此时: CX=0 ,表明串中所有元素以搜索完毕 DI 指向串尾的下一单元。

Page 34: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

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的位置

Page 35: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

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: 、、

说明:

Page 36: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

36

下面程序段完成字传送 (8000:1000H) ← (4000:2000H)

MOV AX, 4000H

MOV DS, AX

MOV SI, 2000H

MOV AX, 8000H

MOV ES, AX

MOV DI, 1000H

MOVSW

Page 37: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

37

▲可在有源操作数的串指令前使用段跨越前缀, 此时:源串操作数的段值由段跨越前缀指定。 包括指令 MOVS 、 LODS 、 CMPS

例 ES : MOVSB

执行 ( ES:DI ) ← (ES:SI)

而不是 ( ES:DI ) ← (DS:SI)

ES: SCASB 没有源串ES: STOSW

▲目的串操作数不允许使用段跨越前缀,即串指令前的段跨越前缀必指源串操作数。

Page 38: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

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执行流程

Page 39: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

39

操作类型默 认段寄存器

是否允许段 跨 越 有效地址

取指令 CS 否 IP

以 BP做基址的 操 作 数

SS CS、DS、ES EA

直接寻址、以 BX做基址的 操 作 数

DS CS、SS、ES EA

堆栈操作 SS 否 SP

源 串 DS CS、SS、ES SI串操作 目的串 ES 否 DI

几种操作复习

Page 40: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

40

DSESSSCS

IP

数据暂存器

PSW 标志寄存器 执行部件控制电路

指令译码器

AXBXCXDX

AHBHCHDH

SIDIBPSP

ALBLCLDL

寄存器组

指令队列

总线接口控制电路

运算器

地址加法器

、、、指令 1

指令 2

指令 3

指令 4

、、、数据 1

数据 2

数据 3

、、、

地址总线 AB

数据总线 DB

控制总线 CB

Page 41: 6.  处理机控制指令 1)  标志处理指令 CLC,  STC,  CMC, CLD,  STD,  CLI,  STI  2)  处理机控制指令

41

本节结束,谢谢合作!请继续学习下面的内容!