59
微微微微微微微微微 微微微

微机原理与接口技术

Embed Size (px)

DESCRIPTION

微机原理与接口技术. 第九讲. § 3-3 8086 的 指令系统. 指令系统. 一、数据传送指令 二、算术运算指令. 三、逻辑运算和移位指令 四、串操作指令 五、转移指令. 六、处理器控制指令. 2. § 3-3 8086 的 指令系统. 五、控制转移指令. 【 作用 】. 改变 CS 和 IP 的值,从而 改变指令的执行顺序 。. 【 类型 】.  无条件转移和过程调用指令  条件转移指令.  条件循环控制指令  中断指令. 3. § 3-3 控 制转移指令. 【 8086 的指令系统 】 4. - PowerPoint PPT Presentation

Citation preview

Page 1: 微机原理与接口技术

微机原理与接口技术

第九讲

Page 2: 微机原理与接口技术

2

§3-3 8086 的指令系统

指令系统

一、数据传送指令二、算术运算指令三、逻辑运算和移位指令四、串操作指令五、转移指令六、处理器控制指令

Page 3: 微机原理与接口技术

3

五、控制转移指令

【作用】

改变 CS 和 IP 的值,从而改变指令的执行顺序。

【类型】

无条件转移和过程调用指令

条件转移指令

条件循环控制指令

中断指令

§3-3 8086 的指令系统

Page 4: 微机原理与接口技术

中断溢出中断中断返回

INTINTOIRET

中 断

CX≠0 则循环CX≠0 和 ZF=1 则循环CX≠0 和 ZF=0 则循环

CX=0 则转移

LOOPLOOPE / LOOPZ

LOOPNE / LOOPNZJCXZ

条件循环控制

直接标志转移间接标志转移

JZ / JE (10 条指令 )JA / JNBE (8 条指令 )

条件转移 ( 见教材 71 页 )

无条件转移过程调用过程返回

JMPCALLRET

无条件转移和过程调用指令

§3-3 控制转移指令 【 8086 的指令系统】

4

Page 5: 微机原理与接口技术

1. 无条件转移和过程调用指令( Unconditional Transfer and Call )

⑴JMP 无条件转移指令 (Jump)

指令格式: JMP 目的

指令功能:程序无条件地转移到指定的目的地址去执行。

两种转移类型: 段内转移或近 (NEAR) 转移

转移指令的目的地址和 JMP 指令在同一代码段中,转移时,仅改变 IP

寄存器的内容,段地址 CS 的值不变。 段间转移,又称为远 (FAR) 转移

转移指令的目的地址和 JMP 指令不在同一段中,转移时, CS 和 IP 的 值都要改变,程序转到另一代码段去执行。

5

§3-3 控制转移指令 【 8086 的指令系统】

Page 6: 微机原理与接口技术

两种提供地址的方式:

直接转移指令码中直接给出转移的目的地址,目的操作数用一个标号来表示,它又可分为段内直接转移和段间直接转移。

间接转移目的地址包含在某个 16 位寄存器或存储单元中, CPU 根据寄存器或存储器寻址方式,间接地求出转移地址。这种转移类型又可分为段内间接转移和段间间接转移。

转移类型和提供地址的方式的组合可形成不同指令,如下表所示:

6

§3-3 控制转移指令 【 8086 的指令系统】

Page 7: 微机原理与接口技术

JMP FAR PTR PROG_F

JMP DWORD PTR [DI]

立即转移( 32 位)存储器( 32 位)

直接间接

段间转移

JMP BX

JMP WORD PTR [BX]

寄存器( 16 位)存储器( 16 位)

间接间接

JMP SHORT PROG_S

JMP NEAR PTR ROG_N

立即短转移( 8 位)立即近转移( 16 位)

直接直接段内

转移

指令举例寻址目标方式类型

无条件转移指令的类型和方式

§3-3 控制转移指令 【 8086 的指令系统】

7

Page 8: 微机原理与接口技术

标号JMP NEAR PTR 标号 (或: JMP 标号)

特点:

▲目的操作数均用标号表示;

▲程序转向的有效地址 EA=当前 IP 寄存器的内容+ 8/16 位位移量 (DISP)。16 位 : 近转移,范围在 -32768 ~ +32767 个字节之间;8 位 : 短转移,范围在 -128 ~ +127 个字节之间;

▲位移量带符号 : 正的向高地址转移;负的向低地址转移,且必须用补码表示。

8

§3-3 控制转移指令

①段内直接转移指令

指令格式: JMP SHORT

【 8086 的指令系统】

Page 9: 微机原理与接口技术

▲段内近 / 短转移指令的机器码及其操作功能如下图所示。其中第一个字节为操作码,后面的字节是位移量。注意: 8 位的位移量与 IP 相加时,用符号扩展法扩展成 16 位后再相加。

段内近转移指令

E9 DISP_L

执行操作: IP

DISP_H

← IP+16 位位移量

EB DISP_L

段内短转移指令

执行操作: IP ← IP+8 位位移量

9

§3-3 控制转移指令 【 8086 的指令系统】

Page 10: 微机原理与接口技术

10

近转移:标号前加说明符 NEAR PTR ,也可以省略不写。短转移:则在标号前需加说明符 SHORT PTR 。

JMP SHORT PTR PROG_S ;段内短转移JMP NEAR PTR PROG_N ;段内近转移 ( 或: JMP PROG_N)

机器码 程行号1

偏离量0000H

0000H

CODE

序SEGMENT

2 ASSUME CS : CODE

PROG_S : AL , 05H3

4

0000H

0002H

0405

90

ADD

NOP

PROG _SEBFB

90

5

6

7

0003H

0005H

0006H CODE

JMP SHORT

NOP

ENDS

8 END

§3-3 控制转移指令 【 8086 的指令系统】

Page 11: 微机原理与接口技术

位移量 DISP 的计算:DISP =目的地址偏移量- IP 的当前值

= 0000H - 0005H

=- 5H

补码为 FBH ,经符号扩展后为 FFFBH 。

IP 的修改:IP = IP + DISP

= 0005H + FFFBH

= 0000H

程序转到偏移量为 0 的位置,即标号为 PROG_S 处执行。

注意:段内近转移指令,和段内短转移指令类似,不过段内近转移指令占有 3个字节,计算时注意。它可以转移到段内任何地址去执行指令。

11

§3-3 控制转移指令 【 8086 的指令系统】

Page 12: 微机原理与接口技术

②段内间接转移指令 指令格式: JMP 16 位寄存器 / 字存储器单元

特点:

16 位有效地址存放在一个 16 位寄存器、字存储器单元;

寄存器间接寻址:有效地址存放在寄存器中,即 IP 寄存器内容;

存储单元间接寻址:有效地址存放在存储单元中,即 IP 字存储单元内容;

对于间接寻址,首先要计算出存储单元的物理地址,再从该地址处取一个字 送到 IP 。

12

§3-3 控制转移指令 【 8086 的指令系统】

Page 13: 微机原理与接口技术

【例】 JMP BX解: 若该指令执行前 BX = 4500H;

则指令执行时,将当前 IP 修改成 4500H ; 程序转向段内偏移地址为 4500H 处执行。

【例】 JMP WORD PTR [BX]解:设指令执行前, DS = 2000H , BX = 100H , (20105H) = 04F0H ;则指令执行后, IP = (20000H+100H+5H) = (20105H) = 04F0H ;转到代码段内偏移地址为 04F0H 处执行。

注意:指令的目的操作数前要加 WORD PTR ,表示进行的是字操作。

13

§3-3 控制转移指令 【 8086 的指令系统】

Page 14: 微机原理与接口技术

指令格式: JMP FAR 标号特点:

用远标号直接给出了转向的段地址和偏移量,即IP

CS

标号的段内偏移量 标号所在段的段地址

例 JMP FAR PTR PROG_F解:设标号 PROG_F 所在段的基地址= 3500H ,偏移地址= 080AH ; 则指令执行后, IP = 080AH , CS = 3500H ; 程序转到 3500 : 080AH 处执行。

14

§3-3 控制转移指令③段间直接 ( 远 ) 转移指令

【 8086 的指令系统】

Page 15: 微机原理与接口技术

④段间间接转移指令 指令格式: JMP DWORD PTR [ 存储单元 ]

特点:目的地址的段地址和偏移量放在存储器中的 4 个连续地址单元中:前两个字节为偏移量;后两个字节为段地址。指令中给出存放目标地址的存储单元的首字节地址值;

注意:指令的目的操作数前要加说明符 DWORD PTR 。

15

§3-3 控制转移指令 【 8086 的指令系统】

Page 16: 微机原理与接口技术

0000 00010010 010110 101 1001111 1111

DISP_HDISP_LMOD 101 R/MOP

【例】 JMP DWORD PTR [SI 十 0125H]解:设指令执行前: CS = 1200H , IP = 05H , DS = 2500H , SI = 1300H ; 内存单元 (26425H) = 4500H , (26427H) = 32F0H 。 指令中的位移量 D1SP = 0125H ,即: DISP_H = 01H , DISP_L = 25H 。

由附录 B 可知,该指令占 4 个字节。 第 1 个字节是操作码: FFH ; 第 2 个字节的编码: MOD 101 R/M ,查表 3-2 可得到 MOD = 10 , R/M = 100 ; 第 3 和第 4 字节:位移量低字节和高字节;

于是,机器码为 FF AC 25 01H ,该指令的编码格式为:

§3-3 控制转移指令 【 8086 的指令系统】

16

Page 17: 微机原理与接口技术

指令要转向的地址存放在内存单元 DS : (SI + DISP) 中,即 目的操作数地址= DS×16 + SI + DISP

= 25000H + 1300H + 0125H

= 26425H

从单元中取出转移地址,赋与 IP 和 CS : IP = 4500H , CS = 32F0H ;程序转到 32F0 : 4500H 处执行。

指令的执行过程如下图所示。

17

§3-3 控制转移指令 【 8086 的指令系统】

Page 18: 微机原理与接口技术

FA20

FC51

04

05

F3

02

1200H

0005H+ 12005H

CS

IP

2500H

+ 26425H

DS

DISP 0125H

1300HSI

现行代码段

JMP 指令操作码

DISP=0125H

现行数据段

新 IP=4500H

新 CS=32F0H

新的代码段32F0H : 4500H

JMP 指令转向地址

18

X10H

X10H

§3-3 控制转移指令 【 8086 的指令系统】

Page 19: 微机原理与接口技术

⑵过程调用和返回指令 (Call and Return)

过程:程序中能完成特定功能而又独立的模块,也称子程序。 过程嵌套:在过程运行中又去调用另一个过程。 过程调用和返回指令的格式: CALL 过程名 RET近过程调用:调用指令 CALL 和被调用的过程在同一代码段中。远过程调用:两者在不同代码段中。

CALL 指令执行时分两步:第一步:是将返回地址( CALL 指令下面那条指令的地址)推入堆栈。

近调用的操作: SP SP - 2 , IP入栈;远调用的操作: SP SP - 2 , CS入栈; SP SP - 2 , IP入栈

第二步:转到程序的入口地址去执行。寻址方法有四种:段内直接调用;段内间接调用;段间直接调用;段间间接

调用;(但没有段内短调用指令)

19

§3-3 控制转移指令 【 8086 的指令系统】

Page 20: 微机原理与接口技术

20

RET 指令:从栈中弹出返回地址,使程序返回主程序继续执行。这里分为两种情况:

如果从近过程返回:从栈中弹出一个字 如果从远过程返回:先从栈中弹出一个字

IP ,并且使 SP

IP ,并且使 SP

SP + 2

SP + 2 ;再从个字栈中弹出一个字 CS ,并使 SP

SP 十 2 。

①段内直接调用和返回例 CALL PROG_N ; PROG_N 是一个近标号

解:根据附录 B 可知,该指令含 3 字节,编码格式为: 调用之前: CS=2000H , IP=1050H , SS=5000H , SP=0100H , PROG_N 与 CALL 指令之间的距离等于 1234H( 即 DISP = 1234H) ,则

DISP_HDISP_LE8

§3-3 控制转移指令 【 8086 的指令系统】

Page 21: 微机原理与接口技术

21

SP SP 一 2 ,即新的 SP = 0100H 一 2 = 00FEH

返回地址的 IP入栈。 CALL 指令的首地址: CS : IP = 2000 : 1050H ; 指令占 3 字节; 指令结束后的地址: 2000 : 1053H ,即 IP = 1053H ,压入堆栈;

计算出新的 IP 值,作为子程序的入口地址,即IP = IP+DISP = 1053H+1234H = 2287H

RET 指令的执行过程: IP (SP 和 SP + 1) 单元内容,即 IP = 1053H

SP SP + 2 ,即新的 SP = 00FEH + 2 = 0100H

§3-3 控制转移指令

CALL 指令的执行过程:如图所示

【 8086 的指令系统】

Page 22: 微机原理与接口技术

22

2000:1050

:1053

:2287

5000:0100

返址入栈

转子程序

新 SP=00FE

原 SP=0100

E3

84

1 2

5 31 0

2000:1050

2000:1053转返址执行

(原 SP=00FE )新 SP=0100

:00FE

5000:0100

弹出返址

( a ) CALL PROG_G 指令 ( b ) RET 指令

5 31 0

§3-3 控制转移指令 【 8086 的指令系统】

Page 23: 微机原理与接口技术

23

操作步骤: SP SP 一 2 , IP入栈, IP EA (从目的操作数取得或计算)设: DS = 1000H , BX = 200H , SI = 300H , (10500H) = 3210H

例 1 中: EA = 0200H ; 例 2 中: EA = (16×DS + BX + SI)

= (10000H + 0200H + 0300H)=(10500H) = 3210H

返回:IP (SP 和 SP + 1) 单元内容(返回地址出栈)SP SP + 2 (修改栈顶指针)

§3-3 控制转移指令

②段内间接调用和返回 例 1 CALL BX ; 例 2 CALL WORD PTR [BX 十 SI] ;

【 8086 的指令系统】

Page 24: 微机原理与接口技术

③段间直接调用例 3-75 CALL FAR PTR PROG_F ; PROG_F 是一个远标号

解:指令为 5 字节,编码格式为:

调用之前:

CS=1000H , IP=205AH , SS=2500H , SP=0050H ,标号 PROG_F 的地址指针 CS=3000H , IP=0500H ;

存放 CALL 指令的内存首地址为 1000 : 205AH ,由于该指令长度为 5 个字节,所以返回地址应为 1000 : 205FH 。

24

SEG_LDISP_H SEG_HDISP_L9A

§3-3 控制转移指令 【 8086 的指令系统】

Page 25: 微机原理与接口技术

SP SP -2 ( SP = 0050H -2 = 004EH ), CS入栈( CS = 1000H );

SP SP-2 ( SP = 004CH ), IP入栈( IP = 205FH ); 转子程序: FROG_F 的段地址和偏移地址送 CS : IP , CS 3000H, IP 0500H

RET 指令执行过程: (寻址方式也是段间直接调用)

IP CS

栈中内容( IP 栈中内容( CS

205FH ), SP 1000H ), SP

SP + 2 ( SP SP + 2 ( SP

004C + 2 = 004EH )004EH + 2 = 0050H )

程序转返回地址 CS : IP = 1000:205FH 处执行。

25

§3-3 控制转移指令CALL 指令的执行过程:

【 8086 的指令系统】

Page 26: 微机原理与接口技术

26

1000

205A+ 1000 : 205A

CS

IP

2500

0050+

2500:0050(原栈顶 )

SS

SP

代码段

过程入口 CS

X10H

X10H

900

A05

03

00

下条指令

F0

5201

00

1000 : 205F( 返址 )

2500 : 004C( 新栈顶 )

操作码过程入口 IP

堆栈段(返址 IP )

(返址 CS )

新的代码段3000:0500

过程入口

图 3 - 22 段间调用指令的执行过程

§3-3 控制转移指令 【 8086 的指令系统】

Page 27: 微机原理与接口技术

④段间间接调用 操作数:必须是存储单元——存放的双字表示的入口地址,其中前 2 个字节 是偏移量,后两个字节为代码段基地址。 例 3-76 CALL DWORD PTR [BX] 解:设 DS = 1000H , BX = 200H , (10200H) = 31F4H , (10202) = 5200H 。

CALL 指令的执行过程: SP SP

SP 一 2 , CS入栈SP 一 2 , IP入栈

IP (10200H) = 31F4H , CS (10202) = 5200H

转子程序入口, CS : IP = 5200H : 31F4H

RET 指令执行过程: IP CS

栈中内容, SP 栈中内容, SP

SP + 2SP + 2

程序转返回地址 CS : IP 处执行。27

§3-3 控制转移指令 【 8086 的指令系统】

Page 28: 微机原理与接口技术

带参数的返回指令 RET n

n 称为弹出值, CPU 在弹出返回地址后,再从堆栈中弹出 n 个字节的数据。其值可以是 0000-0FFFFH 范围内的任何一个偶数。

用途: 调用过程的主程序通过堆栈向过程传递参数。 参数在调用过程前推入堆栈,过程运行中通过堆栈指针寻找; 过程返回时,用 RET n把它们从栈中弹出。

28

§3-3 控制转移指令 【 8086 的指令系统】

Page 29: 微机原理与接口技术

2. 条件转移指令 (Conditional Transfer)

根据上一条指令执行后的状态标志作为判别测试条件来决定是否转移。注意:

条件转移均为段内短转移。 目的地址=当前 IP 值+ 8 位相对位移量。 它与转移指令之后的那条指令间的距离,允许为 -128 ~ +127 字节; 8 位偏移量用符号扩展法扩展到 16 位与 IP 相加。

指令格式:条件操作符 标号条件转移指令共有 18 条,可以为两类:

直接标志转移指令 间接标志转移指令

29

§3-3 控制转移指令 【 8086 的指令系统】

Page 30: 微机原理与接口技术

有进位 转移无进位 转移结果为零 / 相等 转移不为零 / 相等 转移符号为负 转移符号为正 转移溢出 转移无溢出 转移奇偶位为 1/ 为偶 转移奇偶位为 0/ 为奇 转移

CF=1CF=0ZF=1ZF=0SF=1SF=0OF=1OF=0PF=1PF=0

JCJNCJZ/JE

JNZ/JNEJS

JNSJO

JNOJP/JPE

JNP/JPO

指令功能测试条件指令助记符

⑴直接标志转移指令 (10 条 )在指令助记符中直接给出标志状态的测试条件:以 CF , ZF , SF , OF 和 PF等 5个标志的 10 种状态为判断的条件。

§3-3 控制转移指令 【 8086 的指令系统】

30

Page 31: 微机原理与接口技术

31

例: 求 AL 和 BL 寄存器中的两数之和,若有进位,则 AH 置 1 ,否则 AH清 0 。【解】:可用如下程序段来实现该操作:

ADD

JC

MOV

JMP

AL , BL

NEXT

AH , 0

EXIT

;两数相加;若有进位,转 NEXT

;无进位, AH=0

;往下执行

MOV AH , 1NEXT :EXIT : ………

;有进位, AH 置 1

;程序继续进行

§3-3 控制转移指令 【 8086 的指令系统】

Page 32: 微机原理与接口技术

⑵间接标志转移

指令的助记符中不直接给出标志状态位的测试条件,而是标志的状态组合作为测试的条件。

指令应用:通常放在比较指令 CMP 之后,以比较两个数的大小。

无符号数比较测试指令中,指令助记符中的“ A” 是英文 Above 的缩写,表示“高于” 之意,“ B” 是英文 Below的缩写,表示“低于”之意;

带符号数比较测试指令中,指令助记符中的“ G” (Great than) 表示大于, “L”(Less than) 表示小于。

32

§3-3 控制转移指令 【 8086 的指令系统】

Page 33: 微机原理与接口技术

大于 / 不小于等于 转移大于等于 / 不小于 转移小于 / 不大于等于 转移小于等于 / 不大于 转移

(SF⊕OF) ∨ZF=0

SF⊕OF =0

SF⊕OF =1

(SF⊕OF)∨ZF=1

JG/JNLE

JGE/JNL

JL/JNGE

JLE/JNG

带符号数比较测试

高于 / 不低于等于 转移高于等于 / 不低于 转移低于 / 不高于等于 转移低于等于 / 不高于 转移

CF∨ZF =0

CF=0

CF=1

CF∨ZF=1

JA/JNBE

JAE/JNB

JB/JNAE

JBE/JNA

无符号数比较测试

指令功能测试条件指令助记符类别

间接标志条件转移指令

§3-3 控制转移指令 【 8086 的指令系统】

33

Page 34: 微机原理与接口技术

34

【例】 设某个学生的英语成绩已存放在 AL 寄存器中,若低于 60 分,则打印 F(FAIL) ;若高于或等于 85 分,则打印 G(GOOD) ;当在 60 分和 84 分之 间时,打印 P(PASS) 。

程序:

AL , 60

FAILAL , 85GOODAL ,’ P’PRINTAL ,’ F’PRINTAL ,’ G’

CMP

JBCMPJAEMOVJMP

FAIL : MOVJMP

GOOD : MOVPRINT :…

;与 60 分比较;< 60 ,转 FAIL;≥ 60 ,然后与 85 分比较;≥ 85 ,转 GOOD;其它,将 AL←’P’;转打印程序; AL←’F’;转打印程序; AL←’G’;打印存在 AL 中的字符

§3-3 控制转移指令 【 8086 的指令系统】

Page 35: 微机原理与接口技术

【例】 假设某温度控制系统中,从温度传感器输入一个 8 位二进制的摄氏温 度值。当系统中温度低于 100度时,则打开加热器;当温度上升到 100

度或 100度以上时,关闭加热器,进行下一步处理。设温度传感器的端 口号为 320H ,同时假设控制加热器的输出信号连到端口 321H 的最低有 效位,当将这一位置 1 时,加热器便打开,清 0 时则关闭加热器。

解:实现上述温度控制的程序如下:

35

§3-3 控制转移指令 【 8086 的指令系统】

Page 36: 微机原理与接口技术

36

GET_TEMP :

HEAT _ON :

HEAT _OFF :

DX , 320H

AL , DX

AL , 100

HEAT _ON

HEAT _OFF

AL , 01H

DX , 321H

DX , AL

GET_TEMP

AL , 01H

DX , 321H

DX , AL

MOV

IN

CMP

JB

JMP

MOV

MOV

OUT

JMP

MOV

MOV

OUT

; DX 指向温度输入端口; 读取温度值; 与 100 度比较;< 100 度,加热;≥ 100 度,停止加热; D0 位置 1 ,加热; 加热器口地址; 打开加热器; 继续检测温度; D0 位置 0 ,停止加热

; 关闭加热器;进行其他处理

§3-3 控制转移指令 【 8086 的指令系统】

Page 37: 微机原理与接口技术

3.循环控制指令 (Iteration Control)

特点:

是一组增强型的条件转移指令,控制程序段的重复执行,重复次数存于 CX 寄存器中。

指令的字节数均为 2 ,第一字节是操作码,第二字节是 8 位偏移量,转移的目标都是短标号。

循环指令中的偏移量都是负值。

循环控制指令均不影响任何标志。

这类指令共有 4 条。

37

§3-3 控制转移指令 【 8086 的指令系统】

Page 38: 微机原理与接口技术

(1)LOOP 循环指令 (Loop)

指令格式: LOOP 短标号

指令功能:控制重复执行一系列指令,重复次数放在 CX 寄存器中,每执行一次 LOOP 指令, CX自动减 1 。如果减 1 后 CX≠0 ,则转移到指令中所给定的标号处继续循环;若自动减 1 后 CX = 0 ,则结束循环。

一条 LOOP 指令相当于执行以下两条指令的功能:

DEC CX

JNZ 标号

38

§3-3 控制转移指令 【 8086 的指令系统】

Page 39: 微机原理与接口技术

39

【例】 设商店里有 8 种商品,价格分别为 83 元, 76 元, 65 元, 84 元, 7l 元, 49 元, 62 元和 58 元,现要将每种商品提价 7 元,编程计算每种商品提价后的价格。

OLD

NEW

83H , 76H , 65H , 84H71H , 49H , 62H , 58H8 DUP ( ?)

DBDBDB…

MOVMOV

NEXT : MOVADDDAAMOVINCLOOP

CX , 08HBX , 00HAL , OLD + [BX]AL , 7

NEW+[BX] , ALBXNEXT

;共 8 种商品; BX 作指针,初值为 0

;读入一个商品的原价;加上提价因子;调整为十进制;存放结果;地址指针加 1;如未加满 8次,继续循环;已加完 8次

§3-3 控制转移指令 【 8086 的指令系统】

Page 40: 微机原理与接口技术

40

【例】 这是一个用循环和跳转指令来控制 PC 机的扬声器发声的程序。在 PC 机中,61H端口的 D1 和 D0 位接到扬声器接口电路上,在 D0 = 0 的情况下:当 D1 = 1 时,扬声器被接通, D1 = 0 则断开,通过控制这一位的值,就能产生一个由 1 和 0构成的二进制序列,使扬声器发声。

INAND

MORE : XOROUTMOV

AL , 61HAL , 0FCHAL , 0261H , ALCX , 260

; AL←从 61H端口读取数据;保护 D7 ~ D2 位, D0 位清零;触发 D1 位,使之在 0 和 1 间变化;控制扬声器开关通断; CX= 循环次数

DELAY : LOOP DELAY ;循环延时JMP MORE ;再次触发

延时程序的实现:MOV CX , 10 ;循环次数为 10

DELAY : LOOP DELAY ;本指令重复执行 10次

§3-3 控制转移指令 【 8086 的指令系统】

Page 41: 微机原理与接口技术

⑵LOOPE/LOOPZ 相等或结果为零时循环 (Loop If Equal/Zero)

指令格式: LOOPE 标号 或 LOOPZ 标号指令功能:

LOOPE 是相等时循环; LOOPZ 是结果为零时循环; 指令执行前,先将重复次数送到 CX 中,每执行一次指令, CX自动减 1 , 若减 1 后 CX≠0 和 ZF = 1( 相等 ) ,则转到指令所指定的标号处重复执行; 若 CX = 0 或 ZF = 0 ,便退出循环。

41

§3-3 控制转移指令 【 8086 的指令系统】

Page 42: 微机原理与接口技术

42

【例】设有一个由 50 个字节组成的数组存放在 ARRAY开始的内存单元中,现要对该数组中的元素进行测试,若元素为 0 ,而且不是最后一个元素,便继续进行下一个元素的测试,直到找到第一个非零元素或查完了为止。

ARRAY : DB × ×, × ×,… ;含 50 个元素的数据…

MOV BX , OFFSET ARRAY ; BX 指向数组开始单元DEC

MOV

BX

CX , 50

;指针减 1

; CX= 元素个数NEXT : INC

CMP

LOOPE

BX

[BX] , 00H

NEXT

;指向数组的下 个元素;数组元素与 0比较;若元素为 0

;和 CX≠0 ,循环

… ;否则,继续查找

§3-3 控制转移指令 【 8086 的指令系统】

Page 43: 微机原理与接口技术

⑶LOOPNE/LOOPNZ 不相等或结果不为零循环 (Loop If Not Equal/Not Zero)

指令格式: LOOPNE 标号 或 LOOPNZ 标号

指令功能:

LOOPNE 是不相等时循环; LOOPNZ 是结果不为零循环。 指令执行前,应将重复次数送入 CX ,每执行一次, CX自动减 1 ,若减 1

后 CX≠0 和 ZF = 0 ,则转移到标号所指定的地方重复执行;若 CX = 0 或ZF = 1 ,则退出循环,顺序执行下一条指令。

43

§3-3 控制转移指令 【 8086 的指令系统】

Page 44: 微机原理与接口技术

44

【例】设一个由 17 个字符组成的字符串存放在 STRING开始的内存中,查找该字符串中是否包含空格符。若没有找到和尚未查完,测继续查找,直到找到第一个空格符或查完了才退出循环。

下面是实现上述操作的程序:

ARRAY DB ‘Personal Computer’ ;字符串…

MOV BX , OFFSET ARRAY ; BX 指向字符串的开始DEC

MOV

NEXT : INC

CMP

BX

CX , 17

BX

[BX] , 20H

; BX - 1

; CX= 字符串长度;指向下一个字符串;字符串元素与空格比较;空格的 ASCII 码为 20H

LOOPNE NEXT ;找到空格或 CX已为 0

§3-3 控制转移指令 【 8086 的指令系统】

Page 45: 微机原理与接口技术

⑷JCXZ 若 CX 为 0跳转 (Jump If CX Zero)

指令格式: JCXZ 标号指令功能: 若 CX 寄存器为零,则转移到指令中标号所指定的地址处,它不对

CX 寄存器进行自动减 1 的操作。 主要用在循环程序开始处,为跳过循环,把 CX 寄存器清零。

45

§3-3 控制转移指令 【 8086 的指令系统】

Page 46: 微机原理与接口技术

46

外部中断

内部中断:

引起中断的原因

中断源

(处理如系统掉电等重大故障)

引脚 INTR引入IF=1(允许响应 )

IF=0( 不允许响应 )

意外情况 如除法运算出错、溢出错误等;调试;中断指令 INT n ;

4. 中断指令 (Iterrupt)

⑴中断概念▲定义:计算机暂时中止当前程序的运行,执行中断服务程序去为临时发生

的事件服务,执行完毕后,返回正常程序继续运行,这个过程称为中断。

引脚 NMI引入(马上响应)

§3-3 控制转移指令 【 8086 的指令系统】

Page 47: 微机原理与接口技术

▲中断过程: 断点( CS,IP 值)、标志寄存器的值入栈保护 取入口地址(中断类型×4 得到中断向量的地址) 执行中断服务程序 执行中断返回指令 IRET ,从堆栈中恢复中断前 CPU 的状态和断点。

▲中断向量表 :

低 2 字节存放中断服务程序入口地址的偏移量 IP;

高 2 字节存放中断服务程序入口地址的段地址 CS;

中断服务程序入口地址=中断类型×4 ;

47

§3-3 控制转移指令 【 8086 的指令系统】

Page 48: 微机原理与接口技术

§3-3 控制转移指令 【 8086 的指令系统】

内部中断:专用中断,实现某种特定功能。除 NMI 外,其它几个都是软件中断。

① 除法错中断 (类型 0):除数为 0 ;商超过范围② 单步中断 (类型 1):单步标志 TF置 1;③ 不可屏蔽中断 (类型 2): NMI引脚上接收到由低变高的电平变化;④ 断点中断 (类型 3):调试程序时,程序执行到断点时便产生中断⑤ 溢出中断 (类型 4):溢出标志 OF置 l,溢出中断指令 INTO产生

(注意:除单步中断外,都不能被屏蔽,不受中断允许标志 IF 的控制)

48

Page 49: 微机原理与接口技术

⑵中断指令①软件中断指令 (Interrupt) : INT n

也称陷阱中断。 n 为中断类型号,范围 0 ~ 255 。

CPU 执行 INT n 指令的过程: 标志寄存器的内容入栈 ;

当前断点的段基地址 CS 、偏移地址 IP入栈 ; 清除中断标志 IF 、单步标志 TF ; 将中断类型号 n乘以 4 ,找到中断服务程序的入口地址表的表头地址,

获得中断服务程序的入口地址,置入 CS 和 IP 寄存器转到相应中断服务程序。

②溢出中断指令 (Interrupt On overflow) : INTO

带符号数进行算术运算时,若 OF = 1 ,则溢出中断指令 INTO产生类型为 4 的中断。可在带符号加减法运算之后安排一条 INTO 指令。

49

§3-3 控制转移指令 【 8086 的指令系统】

Page 50: 微机原理与接口技术

③中断返回指令 (Interrupt Return): IRET

实现中断返回。安排在中断服务程序的出口处。执行后:

首先从堆栈中依次弹出程序断点,送到 IP 和 CS 寄存器中; 接着弹出标志寄存器的内容,送回标志寄存器; CPU按 CS : IP 的值返回断点,继续执行原来被中断的程序。

50

§3-3 控制转移指令 【 8086 的指令系统】

Page 51: 微机原理与接口技术

进位标志清 0 ( Clear Crray )进位标志求反 (Complement Carry)

进位标志置 1 ( Set Carry )方向标志清 0 ( Clear Direction )方向标志置 1 ( Set Direction )中断标志清 0 ( Clear Interrupt )中断标志置 1 ( Set Interrupt )

CF←0

CF←/CF

CF←1

DF←0

DF←1

IF←0

IF←1

CLC

CMC

STC

CLD

STD

CLI

STI

指令名称操作指令助记符

六、处理器控制指令

1.标志操作指令( CF 、 DF 、 IF 位操作)

【 8086 的指令系统】

51

§3-3 8086 的指令系统

Page 52: 微机原理与接口技术

2.外部同步指令使 CPU 与其它协处理器同步工作的指令,用于多处理机;指令执行后均不影响标

志位。共 3 条。

⑴ESC换码指令 (Escape)指令格式: ESC 外部操作码,源操作数指令功能:换码指令用来实现 8086对 8087协处理器的控制。

⑵WAIT等待指令 (Wait)通常用在 CPU 执行 ESC 指令后,表示 8086CPU 正处于等待状态,它不断检测

8086 的测试引脚 TEST ,每隔 5 个时钟周期检测一次,若此脚为高电平,则重复执行 WAIT 指令,处理器处于等待状态。一旦 TEST引脚的信号变为低电平,便退出等待状态,执行下条指令。

⑶LOCK封锁总线指令 (Lock Bus)是一种前缀,加在指令的前端,用来维持 8086 的总线封锁信号 LOCK 有效,带

有 LOCK 前缀的指令在执行过程中,禁止其它协处理器使用总线。

52

六、处理器控制指令 【 8086 的指令系统】

Page 53: 微机原理与接口技术

3.停机指令和空操作指令

⑴HLT停机指令 (Halt)

CPU 进入暂停状态,不进行任何操作。下列情况发生时, CPU才脱离暂停状态: 在 RESET线上加复位信号; 在 NMI引脚上出现中断请求信号; 在允许中断的情况下,在 INTR引脚上出现中断请求信号;

⑵NOP空操作或无操作指令 (No Operation)

单字节指令,执行时需耗费 3 个时钟周期的时间,但不完成任何操作。 常在循环等操作中增加延时,或在调试程序时使用空操作指令。

53

§3-3 控制转移指令 【 8086 的指令系统】

Page 54: 微机原理与接口技术

表中的 EA项表示,该指令执行时还要考虑计算有效地址所需要的时间。

54

七、指令的执行时间和软件延时

8086 指令的执行速率是由晶振控制产生的时钟决定的,每条指令执行时都需要几个时钟周期。 已知 8086CPU 的工作时钟为 5MHZ ,则 1 个时钟周期为 0.2us 。

一些指令执行时需要的时钟数和时间值

0.2μs×2 = 0.4μs

0.2μs×19 = 3.8μs

0.2μs×(37+EA) μs

执行时间

2

19

37 + EA

MOV 寄存器,寄存器CALL 段内直接调用CALL 段间间接调用

时钟周期数指 令

§3-3 控制转移指令 【 8086 的指令系统】

Page 55: 微机原理与接口技术

6597 ~ 811 ~ 12

在程序中需要一定的延时或进行定时时,可以选用适当的指令 ( 如 NOP等 ) 和循环控制指令构成延时程序。这种方法常被称为软件延时或定时。

55

§3-3 控制转移指令

计算 EA所需要的时间

寻址方式

直接寻址寄存器间接寻址寄存器相对寻址基址变址寻址相对基址变址寻址

【 8086 的指令系统】

时钟周期数

Page 56: 微机原理与接口技术

例设 CPU 的时钟频率为 5MHZ ,试编写一个延时 1ms 的程序。解:程序如下:

;时钟周期×执行次数DEL_1MS :NEXT :

MOVNOPNOPLOOP

CX , N

NEXT

; 4 ×1; 3×N; 3×N;循环时为 17 ,不循环为 5

延时常数 N 的计算:•CPU 的时钟频率为 5MHZ ,则一个时钟周期为: 0.2us 。•延时 t = 1ms 所需要的总的时钟周期数 CT 为: CT = 1s/0.2us = 5000•总的时钟周期数 CT 又可以用循环常数 N 来表示:∵CT = 4 + 3N + 3N + 17(N - 1) + 5 = 23N - 8 = 5000∴N = (5000 + 8)/23 = 218 = 0DAH ,可实现 1ms 的精确延时。

(注:第一条指令只执行一次;两条 NOP 指令各执行 N次;最后的 LOOP 指令,共循环执行 N 一 1次,最后一次不循环)

56

§3-3 控制转移指令 【 8086 的指令系统】

Page 57: 微机原理与接口技术

例 若希望获得时间更长的延时,可以采用嵌套的多重循环程序来实现。这时程序

中往往有两个定时常数,通常先指定其中的一个,再计算出另一个。 ;时钟 ×次数

MOV BX , N1 ; 4 ×1

CNT1 :CNT2 :

MOVLOOPDECJNZ

CX , N2CNT2BXCNT1

; 4 ×N1;( 17×N2 - 12 ) ×N1; 2×N1; 16 ×N1 - 12

上面程序执行所需要的总的时钟周期数 CT 为:CT = 4 + (4×N1) + ((17×(N2 - 1) + 5)×N1) + (2×N1) + (16×(N1 - 1) + 4)

= 4 + (4×N1) + ((17×N2 - 12)×N1) + (2×N1) + (16×N1 - 12)= 17×N1×N2 + 10×N1 - 8假设 CPU 的时钟频率仍为 5MHz ,可根据所需的延时,计算出总的时钟周期数。然

后,先选定常数 N2 ,再根据上式算出 N1 来。

57

§3-3 控制转移指令 【 8086 的指令系统】

Page 58: 微机原理与接口技术

8086 指令的寻址方式类型:一、立即寻址方式

二、寄存器寻址方式

三、直接寻址方式

四、寄存器间接寻址方式

五、寄存器相对寻址方式

六、基址变址寻址方式

七、相对基址变址寻址方式

八、其它

58

指令分为以下六类:

一、数据传送指令

二、算术运算指令

三、逻辑运算和移位指令

四、字符串处理指令

五、控制转移指令

六、处理器控制指令

本 章 小 结

§3-3 控制转移指令 【 8086 的指令系统】

Page 59: 微机原理与接口技术

1.重点寻址方式、指令系统

2.难点指令的正确应用

3.作业

59

小 结