3.7 控制转移类指令

38
第 3 第 3.7 第第第第第第第 控控控控控控控控控控控控控 控控控 控控控控控控控控 控 、、, 控控控 控控控控控控控控 控控控控JMP/Jcc/LOOP CALL/RET INT n/IRET 控控控 控控控控 控控控控 一: LOOPZ/LOOPNZ INTO 控控控控控控控控控控控 IP CS 控控控控控 控控控控控控

description

3.7 控制转移类指令. 控制转移类指令 用于实现分支、循环、过程等程序结构,是仅次于传送 指令的最常用指令 重点掌握: JMP/Jcc/LOOP CALL/RET INT n/IRET 常用系统功能调用 一般了解: LOOPZ/LOOPNZ INTO. 控制转移类指令通过 改变 IP (和 CS ) 值,实现程序执行顺序的改变. 3.7.1 无条件转移指令. JMP. JMP label ;程序转向 label 标号指定的地址. 只要执行无条件转移指令 JMP ,就使程序转到指定的目标地址处,从目标地址处开始执行那里的指令 - PowerPoint PPT Presentation

Transcript of 3.7 控制转移类指令

Page 1: 3.7   控制转移类指令

第 3 章第 3 章 3.7 控制转移类指令

控制转移类指令用于实现分支、循环、过程等程序结构,是仅次于传送指令的最常用指令

重点掌握: JMP/Jcc/LOOP CALL/RET

INT n/IRET 常用系统功能调用一般了解: LOOPZ/LOOPNZ INTO

控制转移类指令通过 改变 IP (和 CS )值,实现程序执行顺序的改变

Page 2: 3.7   控制转移类指令

第 3 章第 3 章 3.7.1 无条件转移指令

只要执行无条件转移指令 JMP ,就使程序转到指定的目标地址处,从目标地址处开始执行那里的指令

操作数 label 是要转移到的目标地址(目的地址、转移地址)

JMP 指令不影响标志位。 JMP 指令分成 4 种类型:

⑴ 段内转移、直接寻址⑵ 段内转移、间接寻址⑶ 段间转移、直接寻址⑷ 段间转移、间接寻址

JMP label ;程序转向 label 标号指定的地址

JMP label ;程序转向 label 标号指定的地址

JMPJMP

Page 3: 3.7   控制转移类指令

第 3 章第 3 章 目标地址的寻址方式

直接寻址方式 转移地址象立即数一样,直接在

指令的机器代码中,就是直接寻址方式

间接寻址方式 转移地址在寄存器或主存单元中,

就是通过寄存器或存储器的间接寻址方式

用标号表达

用寄存器或存储器操作数表达

JMPJMP

Page 4: 3.7   控制转移类指令

第 3 章第 3 章 目标地址的范围:段内

段内转移——近转移( near ) 在当前代码段 64KB 范围内转移

( ±32KB 范围) 不需要更改 CS 段地址,只要改

变 IP 偏移地址段 内 转 移 —— 短 转 移 ( shor

t ) 转移范围可以用一个字节表达,

在段内- 128 ~+ 127 范围的转移

代码

代码

JMPJMP

Page 5: 3.7   控制转移类指令

第 3 章第 3 章例如:代码段内有一条无条件转移指令在汇编语言中使用符号地址。 JMP SHORT NEXT 指令执行过程:

NEXT— 在汇编语言中使用符号地址( IP )←( IP )当前 +D8

源程序 :JMP SHORT 条件转移指令: next

. . .

. . .

. . .

next: MOV AL,03H

OP

50H

.. .

. . .

OP

03H

.. .

. . .

3000:1000H

3000:1050H

(IP)当前 D8=50H=1050H-1000H

(IP)=(IP) +D8当前

内存

Page 6: 3.7   控制转移类指令

第 3 章第 3 章 目标地址的范围:段间

段 间 转 移 —— 远 转 移 ( far ) 从当前代码段跳转到另一个

代码段,可以在 1MB 范围 需要更改 CS 段地址和 IP 偏

移地址 目标地址必须用一个 32 位数

表达,叫做 32 位远指针,它就是逻辑地址

代码

代码

段 实际编程时,汇编程序会根据目标地址的距离,

自动处理成短转移、近转移或远转移 程序员可用操作符 short 、 near ptr 或 far ptr

强制

JMPJMP

Page 7: 3.7   控制转移类指令

第 3 章第 3 章JMPJMP段内转移、直接寻址

JMP label ; IP←IP+ 位移量位移量是紧接着 JMP 指令后的那条指令的偏移

地址,到目标指令的偏移地址的地址位移当向地址增大方向转移时,位移量为正;向地址

减小方向转移时,位移量为负jmp again ;转移到 again 处继续执行……

again: dec cx ;标号 again 的指令……jmp output ;转向 output……

output: mov result,al ;标号 output 的指令

实际为相对寻址

Page 8: 3.7   控制转移类指令

第 3 章第 3 章 段内转移、间接寻址

JMP r16/m16 ; IP←r16/m16将一个 16 位寄存器或主存字单元内容送入

IP 寄存器,作为新的指令指针,但不修改 CS寄存器的内容

jmp ax ; IP←AXjmp word ptr [2000h] ; IP←[2000h]

JMPJMP

Page 9: 3.7   控制转移类指令

第 3 章第 3 章 段间转移、直接寻址

JMP far ptr label; IP←label 的偏移地址; CS←label 的段地址

将标号所在段的段地址作为新的 CS 值,标号在该段内的偏移地址作为新的 IP 值;这样,程序跳转到新的代码段执行

jmp far ptr otherseg;远转移到代码段 2 的 otherse

g

JMPJMP

Page 10: 3.7   控制转移类指令

第 3 章第 3 章FAR 远属性标号 , 标号与控制转移指令不在同一段中。

在汇编语言中,在机器语言中存放如下:

例:

C1 SEGMENT

JMP FAR PTR next_prog

C1 ENDS

C2 SEGMINT

next_prog : …

C2 ENDS

E A5 00 20 02 0

OP 码新 (IP)=0250H

新 (CS)=2000HJMP 指令

C1 段

… …

C2 段

… …

… …

20000H

next_prog: 20250H

… …2000:0250H

Page 11: 3.7   控制转移类指令

第 3 章第 3 章 段间转移、间接寻址

JMP far ptr mem; IP←[mem] , CS←[mem+2]

用一个双字存储单元表示要跳转的目标地址。这个目标地址存放在主存中连续的两个字单元中的,低位字送 IP 寄存器,高位字送 CS 寄存器

mov word ptr [bx],0mov word ptr [bx+2],1500hJMP far ptr [bx] ;转移到 1500h:0

JMPJMP

Page 12: 3.7   控制转移类指令

第 3 章第 3 章 3.7.2 条件转移指令

指定的条件 cc 如果成立,程序转移到由标号 label 指定的目标地址去执行指令;条件不成立,则程序将顺序执行下一条指令

操作数 label 是采用短转移,称为相对寻址方式

JccJcc

Jcc label ;条件满足,发生转移: IP←IP + 8位位移量 ;条件不满足,顺序执行

Jcc label ;条件满足,发生转移: IP←IP + 8位位移量 ;条件不满足,顺序执行

Page 13: 3.7   控制转移类指令

第 3 章第 3 章 相对寻址方式

Jcc 指令的操作数 label 是一个标号一个 8 位位移量,表示 Jcc 指令后的那

条指令的偏移地址,到目标指令的偏移地址的地址位移

8 位位移量是相对于当前 IP 的,且距当前 IP 地址- 128 ~+ 127 个单元的范围之内,属于段内短距离转移

Jcc 目标地址就采用这种相对寻址方式Jcc 指令为 2 个字节,条件不满足时

的顺序执行就是当前指令偏移指针 IP加 2

JccJcc

Page 14: 3.7   控制转移类指令

第 3 章第 3 章

注意几点:注意几点:

所有条件转移指令都是相对转移形式,范围( -128~+127 )。

当需往一个较远地方进行条件转移时,

选用条件转移转到附近一个单元,

然后,再用无条件转移转到较远的目的地。 条件转移指令中,相当一部分指令是在比较完二个数大小后,

根据结果而决定是否转移。 条件转移指令不影响标志位。

Page 15: 3.7   控制转移类指令

第 3 章第 3 章 Jcc 指令的分类

Jcc 指令不影响标志,但要利用标志。根据利用的标志位不同, 16条指令分成 4 种情况:⑴ 判断单个标志位状态⑵ 比较无符号数高低⑶ 比较有符号数大小⑷ 判断计数器 CX 为 0

JccJcc

Page 16: 3.7   控制转移类指令

第 3 章第 3 章 判断单个标志位状态

这组指令单独判断 5 个状态标志之一⑴JZ/JE 和 JNZ/JNE :利用零标志 ZF ,判断

结果是否为零(或相等)⑵JS 和 JNS :利用符号标志 SF ,判断结果

是正是负⑶JO 和 JNO :利用溢出标志 OF ,判断结果

是否产生溢出⑷JP/JPE 和 JNP/JPO :利用奇偶标志 PF ,判断结果中“ 1” 的个数是偶是奇⑸JC/JB/JNAE 和 JNC/JNB/JAE :利用进位

标志 CF ,判断结果是否进位或借位

JccJcc

例题 3.38例题 3.38

例题 3.39例题 3.39

例题 3.40例题 3.40

例题 3.41例题 3.41

例题 3.42例题 3.42

Page 17: 3.7   控制转移类指令

第 3 章第 3 章 比较无符号数高低

无符号数的大小用高( Above )低( Below )表示

利用 CF确定高低、利用 ZF 标志确定相等( Equal )

两数的高低分成 4 种关系:⑴ 低于(不高于等于): JB ( JNAE )⑵ 不低于(高于等于): JNB ( JAE )⑶ 低于等于(不高于): JBE ( JNA )⑷ 不低于等于(高于): JNBE ( JA )

JccJcc

Page 18: 3.7   控制转移类指令

例 3.43a :比较无符号数

cmp ax,bx ;比较 ax 和 bxjnb next ;若 ax≥bx ,转移xchg ax,bx ;若 ax< bx ,交换

next: ...

结果: AX保存较大的无符号数

Page 19: 3.7   控制转移类指令

第 3 章第 3 章 比较有符号数大小

有符号数的大( Greater )小( Less )需要组合 OF 、 SF 标志,并利用ZF 标志确定相等( Equal )

两数的大小分成 4 种关系:⑴ 小于(不大于等于): JL ( JNGE )⑵ 不小于(大于等于): JNL ( JGE )⑶ 小于等于(不大于): JLE ( JNG )⑷ 不小于等于(大于): JNLE ( JG )

JccJcc

Page 20: 3.7   控制转移类指令

例 3.43b :比较有符号数

cmp ax,bx ;比较 ax 和 bxjnl next ;若 ax≥bx ,转移xchg ax,bx ;若 ax< bx ,交换

next: ...

结果: AX保存较大的有符号数

Page 21: 3.7   控制转移类指令

第 3 章第 3 章 计数器 CX 为 0 转移

这是一条较特殊的指令CX 寄存器通常在程序中用做计数器JCXZ 指令用来判断计数是否为 0

JCXZ label ; CX= 0 ,发生转移: IP←IP + 8位位移量 ; CX≠0 ,顺序执行

JCXZ label ; CX= 0 ,发生转移: IP←IP + 8位位移量 ; CX≠0 ,顺序执行

Page 22: 3.7   控制转移类指令

第 3 章第 3 章 判断计数器为 0

mov cx,100again: movsb ;传送一个字节

dec cx ;传送次数减 1jnz again ;判断传送次数 cx 是否为 0;不为 0 ( ZF=0 ),则转移;否则,结束

mov cx,100again: jcxz next ;判断传送次数 cx 是否为 0

movsbdec cxjmp again

next: ...cmp cx,0jz next

Page 23: 3.7   控制转移类指令

第 3 章第 3 章 3.7.3 循环指令( loop )

循环指令利用 CX计数器自动减 1 ,方便实现计数循环的程序结构

label 操作数采用相对寻址方式

LOOP label ; CX←CX - 1 , ; CX≠0 ,循环到标号 labelLOOP label ; CX←CX - 1 , ; CX≠0 ,循环到标号 label

LOOPZ label ; CX←CX - 1 , ; CX≠0且ZF= 1 ,循环到标号 label

LOOPZ label ; CX←CX - 1 , ; CX≠0且ZF= 1 ,循环到标号 labelLOOPNZ label ; CX←CX - 1 , ; CX≠0且ZF= 0 ,循环到标号 label

LOOPNZ label ; CX←CX - 1 , ; CX≠0且ZF= 0 ,循环到标号 label

Page 24: 3.7   控制转移类指令

例 3.44:记录空格个数

mov cx,count ;设置循环次数lea si,stringxor bx,bx ; bx清 0 ,用于记录空格

数mov al,20h

again: cmp al,es:[si]jnz next ; ZF=0 ,非空格,转移inc bx ; ZF=1 ,是空格,个数加

1next: inc si

loop again;字符个数减 1 ,不为 0 继续循环dec cxjnz again

Page 25: 3.7   控制转移类指令

第 3 章第 3 章 3.7.4 子程序指令

子程序是完成特定功能的一段程序当主程序(调用程序)需要执行这个

功能时,采用 CALL 调用指令转移到该子程序的起始处执行

当运行完子程序功能后,采用 RET返回指令回到主程序继续执行

演示演示

Page 26: 3.7   控制转移类指令

第 3 章第 3 章 3.7.5 中断指令

中断( Interrupt )是又一种改变程序执行顺序的方法

中断具有多种中断类型中断的指令有 3 条:

INT N IRET INTO本节主要掌握类似子程序调用指令

的中断调用指令 INT N ,进而学习使用 DOS 功能调用

Page 27: 3.7   控制转移类指令

第 3 章第 3 章 中断指令 INT

INT N;中断调用指令:产生N号中断

IRET;中断返回指令:实现中断返回

INTO;溢出中断指令:;若溢出标志 OF=1 ,产生4号中断;否则顺序执行

Page 28: 3.7   控制转移类指令

第 3 章第 3 章 3.8 处理机控制类指令

这些指令在特定的情况下,必须使用对标志位进行设置的指令

CLC STC CMC CLD STD CLI STI

对 CPU状态进行控制的指令 NOP CS: SS: DS: ES: LOCK HLT ESC WAIT

Page 29: 3.7   控制转移类指令

第 3 章第 3 章 进位标志操作指令

用于任意设置进位标志CLC ;复位进位标志: CF←0STC ;置位进位标志: CF←1CMC ;求反进位标志: CF← ~ CF

Page 30: 3.7   控制转移类指令

第 3 章第 3 章 方向标志操作指令

串操作指令中,需要使用CLD ;复位方向标志: DF←0STD ;置位方向标志: DF←1

Page 31: 3.7   控制转移类指令

第 3 章第 3 章 中断标志操作指令

在编写中断服务程序时,需要控制可屏蔽中断的允许和禁止

CLI ;复位中断标志: DF←0

STI ;置位中断标志: DF←1

Page 32: 3.7   控制转移类指令

第 3 章第 3 章 空操作指令

NOP不执行任何操作,但占用一个字节存

储单元,空耗一个指令执行周期NOP 常用于程序调试

在需要预留指令空间时用 NOP填充 代码空间多余时也可以用 NOP填充还可以用 NOP 实现软件延时

事实上, NOP 和 XCHG AX,AX 的指令代码一样,都是 90H

NOPNOP

Page 33: 3.7   控制转移类指令

第 3 章第 3 章 暂停指令

HLT ;进入暂停状态暂停指令使 CPU进入暂停状态,这时

CPU 不进行任何操作。当 CPU 发生复位或来自外部的中断时, CPU脱离暂停状态

HLT 指令可用于程序中等待中断。当程序中必须等待中断时,可用 HLT ,而不必用软件死循环。然后,中断使CPU脱离暂停状态,返回执行 HLT 的下一条指令

Page 34: 3.7   控制转移类指令

第 3 章第 3 章 封锁前缀指令

LOCK ;封锁总线这是一个指令前缀,可放在任何指

令前这个前缀使得在这个指令执行时间

内, 8086 处理器的封锁输出引脚有效,即把总线封锁,使别的控制器不能控制总线;直到该指令执行完后,总线封锁解除

Page 35: 3.7   控制转移类指令

第 3 章第 3 章 换码指令

ESC mem;把浮点指令交给浮点处理器执行

浮点协处理器 8087 指令是与 8086 的整数指令组合在一起的,当 8086发现是一条浮点指令时,就利用 ESC 指令将浮点指令交给 8087 执行

Page 36: 3.7   控制转移类指令

第 3 章第 3 章 等待指令

WAIT ;进入等待状态8086利用 WAIT 指令和测试引脚实现

与 8087 同步运行浮点指令经由 8086 处理发往 8087 ,并与 8086本身的整数指令在同一个指令序列;而 8087 执行浮点指令较慢,所以 8086 必须与 8087保持同步

Page 37: 3.7   控制转移类指令

第 3 章 教学要求( 5 )

1. 掌握基本指令: JMP/ Jcc 、 LOOP 、 CALL/ RET 、 INT n

2. 熟悉特色指令: IRET 、 NOP

3. 了解不常使用的指令: JCXZ/LOOPZ/ LO

OPNZ 、 INTO 、 LOCK / HLT / ESC /WAIT

Page 38: 3.7   控制转移类指令

第 3 章第 3 章 第 3 章 总结

本章详细而完整地介绍了 8086 的16 位指令系统的每条指令

希望大家进行一下整理(总结): 寻址方式 指令支持的操作数形式 指令对标志的影响

通过复习整理,形成指令系统的整体概念,进而掌握常用指令