8086/8088指令系统详解之(5)程序控制指令

时间:2022-10-31 00:43:00

程序控制指令

能够使程序的执行流程发生改变的指令

1,转移指令

1)无条件转移JMP

有以下几种类型操作:

⑴ 段内直接短转移

格式: JMP SHORT opr

操作: (IP)←(IP) + Data8 //Data8是一个字节的补码数 范围:-128+127

⑵ 段内直接近转移

格式: JMP NEAR PTR opr

操作:(IP)←(IP)+Data16 //Data16是两个字节的补码数 范围:-32768  +32767

⑶ 段内间接转移

格式: JMP WORD PTR opr
操作: (IP)←寄存器或存储器操作数

⑷ 段间直接转移

格式:JMP FAR PTR opr

操作:指令中用立即数的形式指出目标位置的段地址和偏移量

⑸ 段间间接转移

格式: JMP DWORD PTR opr

操作:目标位置的段地址和偏移量保存在存储器中。

说明:
① 在汇编语言中通常使用标号表示要转移到的位置。
② 使用该指令,可以使程序流程改变到任何目标位置。

8086/8088指令系统详解之(5)程序控制指令

2)条件转移JCC

根据判断条件是否成立决定是否转移。按照判断条件的不同分为以下类型:单个标志、无符号数判断、有符号数判断、CX寄存器。

条件转移都是段内直接短转移,即(IP)=(IP)+Data8类型的转移。

指令格式:Jcc short_label
“cc”表示条件

⑴ 判断单个标志
ZF: JZ(JE),JNZ(JNE)
SF: JS,JNS
OF: JO,JNO
PF: JP,JNP
CF: JC,JNC

⑵ 判断无符号数的大小
助记符中的意义: A:大于,B:小于,E:等于
JB(JNAE),JNB(JAE)同JC,JNC,
JBE(JNA),JNBE(JA): 判断CF and ZF

⑶ 判断有符号数的大小
助记符中的意义: G:大于,L:小于,E:等于
JL(JNGE): (SF)  (OF) 且 (ZF)=0
JNL(JGE): (SF)= (OF)
JLE(JNG): (SF)  (OF) 或 (ZF)=1
JNLE(JG): (SF)= (OF) 且 (ZF)=0

使用比较大小的指令时,必须区分是有符号数还是无符号数。

⑷ 判断CX寄存器
JCXZ: CX=0

8086/8088指令系统详解之(5)程序控制指令

2,循环控制指令

循环指令的转移也都是段内直接短转移,即(IP)←(IP)+Data8类型的转移。

LOOP 循环
判断CX是否等于零,不等于零则循环

LOOPZ(LOOPE) 当为零或相等时循环
判断CX是否等于零,不等于零且ZF=1则循环

LOOPNZ(LOOPNE) 当不为零或不相等时循环
判断CX是否等于零,不等于零且ZF=0则循环

说明:
① 循环指令不影响状态标志。
② 如果目标位置的位移量超出Data8所能够表示的范围,则需要用JMP辅助来完成循环。

8086/8088指令系统详解之(5)程序控制指令

3,过程调用与返回指令

如果有一段程序在不同的地方反复出现,则可以将这些程序设计称为过程,相当于子程序,当需要时即可调用。

1)过程调用指令CALL(Call a procedure)

说明:由汇编程序自动匹配为某种寻址方式。

RET 子程序返回指令
用法:RET
段内返回:(IP)←((SP)+1:(SP)),(SP)←(SP)+2
段间返回:(IP)←((SP)+1:(SP)),(SP)←(SP)+2,
(CS)←((SP)+1:(SP)),(SP)←(SP)+2

汇编程序自动匹配为段内或段间的返回

格式:RET Data16
操作:在RET的基础上,把SP再加上一个字数据:
(SP)←(SP)+data16

注意:
一般data16应该是一个偶数,表示堆栈指针向下移动的字节数。这是因为堆栈操作都是字操作。

4,中断指令

将在第七章中进行讨论。