8086CPU指令系统——控制转移类指令

控制转移(Control Jump)类指令用于改变程序的执行顺序。

8086提供了以下控制转移指令:
调用与返回指令、无条件转移指令、条件转移指令、循环控制指令、中断指令。
8086CPU指令系统——控制转移类指令_第1张图片

一、调用与返回指令

调用指令和返回指令是为程序的模块化准备的。在主程序种,可以调用指令运行子程序,CALL指令就是为调用而设立的,子程序完成功能之后,最后的指令必须是返回指令RET。

1、段内调用
指令格式:

CALL label			;由过程名label直接给出段内目标地址
CALL reg16			;由寄存器间接给出目标地址
CALL mem16			;由存储器给出目标地址

段内调用执行的操作:

  1. (SP)<——(SP)-2,当前IP内容压栈
  2. 将调用程序的目标地址的偏移地址送 IP,程序无条件转移到目标地址去执行
  3. 段内调用时,CS值不变

2、段间调用
指令格式:

CALL label			;由过程名label直接给出 32 位目标地址(CS 和 IP)
CALL mem32			;由mem32 给出 32 位存储器给出目标地址

段间调用执行的操作:

  1. (SP)<——(SP)-2,先把当前 CS 内容压栈
  2. (SP)<——(SP)-2,再把当前内容压栈
  3. 将目标地址的偏移地址送IP,段基地址送CS,程序无条件转移到过程名所在的目标地址执行

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标志的状态来决定是否发生控制转移。
8086CPU指令系统——控制转移类指令_第2张图片
指令格式: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)范围之内,指令执行后对标志位无影响。
8086CPU指令系统——控制转移类指令_第3张图片
**循环控制指令可用来控制程序段的循环执行。**他必须以 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. 中断
    CPU在执行一个程序时,对系统发生的某个事件(程序自身或外界的原因)作出的一种反应
  2. 中断分类:内部中断和外部中断
    内部中断也称软中断:单步中断、溢出中断(INTO)、除法出错中断及指令中断等。内部中断是不可屏蔽的中断
    外部中断也称硬中断:一般是指由计算机外设发出的中断请求,如:键盘中断、打印机中断、定时器中断等。又为可屏蔽中断(INTR)和非屏蔽中断(NMI)
  3. 中断操作
    (1)保护现场(入栈):断点(CS和IP)和状态标志(Flag标志寄存器),入栈顺序:标志寄存器>CS>IP。
    (2)执行中断服务子程序。
    (3)返回:恢复现场(出栈),出栈顺序:IP、CS和 Flag标志寄存器。
  4. 中断向量:中断服务子程序的入口地址
    256个中断向量,存在在00000H~003FFH的1024字节的空间。
    1个中断向量占4个字节,低地址的2个字节为偏移地址,高地址的2个字节为段基地址。

1、中断指令INT(interrupt)

2、溢出中断指令INTO(interrupt if overflow)

3、中断返回指令IRET(return from interrupt)

你可能感兴趣的:(微机原理)