控制转移(Control Jump)类指令用于改变程序的执行顺序。
8086提供了以下控制转移指令:
调用与返回指令、无条件转移指令、条件转移指令、循环控制指令、中断指令。
调用指令和返回指令是为程序的模块化准备的。在主程序种,可以调用指令运行子程序,CALL指令就是为调用而设立的,子程序完成功能之后,最后的指令必须是返回指令RET。
1、段内调用
指令格式:
CALL label ;由过程名label直接给出段内目标地址
CALL reg16 ;由寄存器间接给出目标地址
CALL mem16 ;由存储器给出目标地址
段内调用执行的操作:
2、段间调用
指令格式:
CALL label ;由过程名label直接给出 32 位目标地址(CS 和 IP)
CALL mem32 ;由mem32 给出 32 位存储器给出目标地址
段间调用执行的操作:
3、返回指令RET
RET指令常放在子程序的最后,当子程序实现功能后,由RET实现返回,返回地址由执行CALL调用指令时入栈保存的断点值提供。
指令格式:RET
RET具体操作:
段内返回:(IP)<——栈顶字,(SP)<——(SP)+2
段间返回:(IP)<——栈顶字,(SP)<——(SP)+2;CS<——栈顶字,(SP)<——(SP)+2
RET后还可以跟立即数 n,例如:SP 4;表示(SP)<——(SP)+4,用来释放无用数据占用的空间。
JMP(jump)指令可以实现短、近、远转移,使用方便,包括段内直接转移、段内间接转移、段间直接转移、段间间接转移。
短转移:SHORT
近转移:NEAR PTR
远转移:FAR PTR
1、段内直接转移
指令格式:JMP label ;label为转移目标
执行操作:
短转移,(IP)<——(IP)+8位相对位移量
近程转移,(IP)<——(IP)+16位相对位移量
若label在JMP指令的(-128~127)字节之内,则会自动产生一个短转移(SHORT);否则便会产生一个在(-32768~32767)之间的近程转移(NEAR)。
2、段内间接转移
指令格式:
JMP reg16
JMP mem16
执行操作:(IP)<——(reg16) 或 (mem16)
使用寄存器或存储器寻址方式,给出16位操作数直接取代指令指针寄存器IP的内容,而CS保持不变。所以是近程转移。
3、段间直接转移
指令格式:JMP FAR PTR label
执行操作:(IP)<——label的偏移地址,(CS)<——label的段基址
4、段间间接转移
指令格式:JMP mem32
执行操作:(IP)<——(mem32),(CS)<——(mem32+2)
JMP的段间间接转移使用要谨慎。
条件转移指令根据执行该指令时CPU标志的状态来决定是否发生控制转移。
指令格式:JX Target
X 由1~3个英文字母组成,X代表转移条件,若条件成立,转移到标号 Target 处执行,若条件不成立,则顺序执行。其中 Target 时短目标地址。
条件转移指令均为双字节指令,第一字节为操作码,第二字节为相对目标地址,即转移指令本身的偏移值与目标地址偏移地址之差,范围为(-128~+127),属于短转移。如果转移范围较大,超出了该范围,则可先将程序转移到附近某处,再在该处放置一条无条件转移指令,转到目标地址。
1、单个标志条件转移
(1)ZF标志:判断是否为0
JZ/JE 当ZF=1转移
JNZ/JNE 当ZF=1转移
(2)SF标志:判断正负性
JS 当SF=1转移
JNS 当SF=0转移
(3)OF标志:判断是否溢出
JO 当OF=1转移
JNO 当OF=0转移
(4)PF标志:判断奇偶性
JP/JPE 当PF=1转移
JNP/JPO 当PF=0转移
(5)CF标志:判断是否产生进位
JC 当CF=1转移
JNC 当CF=0转移
2、无符号数比较
JB/JNAE:A =B
JA/JNBE:A >B
JNA/JBE:A <=B
3、带符号数比较指令
JL/JNGE:A=B
JG/JNLE:A >B
JNG/JLE:A<=B
循环控制指令是段内短距离相对转移指令,目的地址在(-128~127)范围之内,指令执行后对标志位无影响。
**循环控制指令可用来控制程序段的循环执行。**他必须以 CX 寄存器作为计数器,控制循环次数。
执行时首先将 CX 内容减一,若 CX 内容不为 0,则转移到目标地址;否则就顺序执行下面指令。
1、短目标标号 LOOP
指令功能:(CX)<——(CX)-1,若 CX ≠ 0,执行(IP)=(IP)+8位位移量,转移到目标地址;若 CX = 0,则退出循环,顺序执行下一条指令。
一条 LOOP 指令相当于以下两条指令:
DEC CX
JNZ DON
2、短目标标号 LOOPE/LOOPZ
指令功能:(CX)<——(CX)-1,若 CX ≠ 0 且 ZF = 1,执行(IP)=(IP)+8位位移量,转移到目标地址;否则当 CX = 0 或 ZF = 0时,退出循环。
CX = 0 不会影响标志位 ZF,ZF状态受前面指令指令结果影响。
3、短目标标号 LOOPNE/LOOPNZ
指令功能:(CX)<——(CX)-1,若 CX ≠ 0 且 ZF = 0,执行(IP)=(IP)+8位位移量,转移到目标地址;否则当 CX = 0 或 ZF = 1时,退出循环。
标志位 ZF 不受 CX-1 影响,ZF状态受前面指令指令结果影响。
中断概念
1、中断指令INT(interrupt)
2、溢出中断指令INTO(interrupt if overflow)
3、中断返回指令IRET(return from interrupt)