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

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

  • 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

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

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