程序的执行顺序是由代码段寄存器CS和指令指针IP的内容决定的。一般情况下,每当BIU完成一条取指周期后,就自动改变指令指针IP的内容,使之指向下一条指令,这样就能够按预先编制的程序顺序执行。但有时候当程序执行到某一特定位置时,需要脱离程序的正常执行顺序,而转到指定的指令地址。这种转移是在程序指令的控制下实现的。程序转移指令是通过改变IP和CS的内容,来改变程序的正常执行顺序。程序控制指令也叫做程序计数器控制指令,包括转移指令、子程序调用和子程序返回、中断指令等。
1.转移指令
转移指令分为无条件转移和条件转移指令,这类指令的特点是改变程序的执行顺序(即改变寄存器CS和IP的值),但不改变状态标志位的状态。
(1)无条件转移指令
无条件转移指令是CPU无条件地转移到指令中指明的目的地址处执行,同时它的转移范围不受-128~127B范围的限制,可以进行大范围的转移。无条件转移指令格式及功能见表3-3。
表3-3 无条件转移指令格式及功能
下面介绍与转移地址有关的四种寻址方式。
①段内直接寻址。转向的有效地址EA(偏移地址)是当前IP寄存器的内容与指令中指定的8位或16位位移量之和。所得的转向有效地址用来取代IP寄存器的内容。位移量直接在指令中给出。这种寻址方式适用于条件转移指令和无条件转移指令。
在汇编语言程序中常用如下格式表示:
上述例子中,LAB1、LAB2、LAB3均为转向的标号地址,它们都是在本代码段内定义的标号。JMP LAB1和JMP NEAR PTR LAB2具有相同的作用,它们转移的范围为±32KB地址范围,指令中指定的位移量为16位。JMP SHORT LAB3称为短转移,位移量是8位的,转移的地址范围为-128~127B。
②段内间接寻址。转向的有效地址EA是一个寄存器或一个存储器单元的内容。其中存储单元的内容可以用数据寻址方式中除立即数以外的任何一种寻址方式取得,所得的转向有效地址用来取代IP寄存器的内容。
这种寻址方式只适用于无条件转移指令。
在汇编语言程序中常用如下格式表示:
说明:R指通用寄存器;COUNT为位移量,X和Y可分别取SI、DI、BX、BP四个寄存器中的一个,或X和Y的其中之一取四个寄存器中的一个,另一个取常数,即可构成寄存器间接寻址、变址寻址和基址加变址寻址。
例3-34设DS=1000H,BX=0200H,DI=0300H,AX=1400H,位移量=0010H,(10200H)=1200H,(10210H)=1488H,(10510H)=1689H,则有:
执行JMP AX后,IP=1400H;
执行JMP WORD PTR[BX]后,IP=((DS)*10H+(BX))=(10000H+0200H)=(10200H)=1200H;
执行JMP WORD PTR 0010H[BX]后,IP=(10000H+0200H+0010H)=(10210H)=1488H;
执行JMP WORD PTR OO1OH[BX+DI]后,IP=(10000H+0200H+0300H+0010H)=(10510H)=1689H。
③段间直接寻址。指令中直接提供了转向段地址和偏移地址,只需用指令中指定的偏移地址取代IP寄存器的内容,用指令中指定的段地址取代CS的内容,就完成了从一个源段到另一个目的段的转移操作。例如:
其中NEXTSUB为转向的符号地址,FAR PTR用于定义远过程或远标号,因此,在这种寻址方式中转向的符号地址必须是远过程或远标号。
④段间间接寻址。指令指针IP和代码段CS的内容由存储器中某两个相连的字单元的内容分别取代,实现段间间接转移。即转移目标地址的段地址及偏移地址事先存放在指定的存储单元中,执行该指令时,只要将其取出来替代IP及CS的内容,即可实现转移。
在汇编语言程序中,可用如下格式表示:
说明:COUNT为位移量,X和Y可分别取SI、DI、BX、BP四个寄存器的一个,或X和Y的其中之一取四个寄存器中的一个,另一个取常数,即可构成寄存器间接寻址、变址寻址和基址加变址寻址。
例3-35 设DS=1000H,BX=0200H,DI=0300H,位移量=0010H,(10200H)=1200H,(10202H)=0466H,(10210H)=1488H,(10212H)=0800H,(10510H)=1680H,(10512H)=1234H,则有:
执行JMP DWORD PTR[BX]后,IP=((DS)*10H+(BX))=(10000H+0200H)=(10200H)=1200H,CS=((DS)*10H+(BX)+2)=(10202H)=0466H;
执行JMP DWORD PTR 0010H[BX]后,IP=(10000H+0200H+0010H)=(10210H)=1488H,CS=(10212H)=0800H;
执行JMP DWORD PTR OO1OH[BX+DI]后,IP=(10000H+0200H+0300H+0010H)=(10510H)=1680H,CS=(10512H)=1234H。
(2)条件转移指令
条件转移指令共有18条,分成以下三类:简单条件转移指令,这类指令是根据单个标志的状态决定是否转移的,共有十条;无符号数条件转移指令,共有四条;有符号数条件转移指令,共有四条。
指令格式:[标号]操作符 短标号
功能:如果条件满足,则(IP)+位移量→IP。
在转移指令中,位移量为当前(IP)到转移目的地址处的字节距离。如果当前(IP)到某标号(转移的目的地址)的位移量在-128~127B之间,则该标号称为短标号。当位移量为正时,表示往前转;当位移量为负时,表示往回转。条件转移指令的目的地址均是短标号。
①简单条件转移指令。在8086/8088中,标志CF、ZF、SF、OF、PF的值可分别为1和0,可表示10种状态,因而设置了10条简单条件转移指令,见表3-4。
②无符号数条件转移指令。无符号数条件转移指令往往跟在比较指令之后,根据比较指令执行后的运算结果标志位CF和ZF的状态确定转移方向。这类指令将比较对象作为无符号数。
表3-4 简单条件转移指令
a.JA/JNBE
高于/不低于且不等于转移,两种写法是等价的。JA/JNBE是当CF=0且ZF=0时转移。它用于两个无符号数a、b的比较,若a>b,则条件满足,实现转移。
b.JAE/JNB
高于或等于/不低于转移。JAE/JNB是当CF=0或ZF=l时转移。它用于两个无符号数a、b的比较,若a≥b,则条件满足,实现转移。
c.JB/JNAE
低于/不高于且不等于转移。JB/JNAE是当CF=l且ZF=0时转移。它用于两个无符号数a、b的比较,若a<b,则条件满足,实现转移。
d.JBE/JNA
低于或等于/不高于转移。JBE/JNA是当CF=l或ZF=l时转移。它用于两个无符号数a、b的比较,若a≤b,则条件满足,实现转移。
③有符号数条件转移指令。有符号数条件转移指令将比较对象作为有符号数,往往跟在比较指令之后,根据比较指令执行后的运算结果标志位ZF、SF、OF的状态来确定转移方向。
a.JG/JNLE
大于/不小于且不等于转移,两种写法是等价的。JG/JNLE是当SF=OF且ZF=0时转移。它用于两个有符号数a、b的比较,若a>b,则条件满足,实现转移。
b.JGE/JNL
大于或等于/不小于转移。JGE/JNL是当SF=OF或ZF=l时转移。它用于有符号数a、b的比较,若a≥b,则条件满足,实现转移。(www.xing528.com)
c.JL/JNGE
小于/不大于且不等于转移。JL/JNGE是当SF≠OF且ZF=0时转移。它用于两个有符号数a、b的比较,若a<b,则条件满足,实现转移。
d.JLE/JNG
小于或等于/不大于转移。JLE/JNG是当SF≠OF或ZF=l时转移。它用于两个有符号数a、b的比较,若a≤b,则条件满足,实现转移。
(3)重复控制指令
重复控制指令在循环的首部或尾部确定是否进行循环。重复控制指令在-128~127B范围内转移,对标志位无影响,一般用于串操作和数据块操作。
①循环至CX=0的指令。
指令格式:LOOP标号
功能:使CX减1,且判断CX的值,若CX≠0,则循环至目标操作数;若CX=0,则顺序往下执行。
一条LOOP指令相当于以下两条指令的组合:
②等于零/相等时循环。
指令格式:LOOPZ/LOOPE标号
功能:使CX减1,且判断CX的值,只有在CX≠0且ZF=1的条件下,才循环至目标操作数;否则,顺序往下执行。
③不等于零/不相等时循环。
指令格式:LOOPNZ/LOOPNE标号
功能:使CX减1,且判断CX的值,只有在CX≠0且ZF=0的条件下,才循环至目标操作数;否则,顺序往下执行。
④当CX=0时转移的指令。
指令格式:JCXZ标号
功能:若CX=0,该指令控制转移到目标操作数。
2.子程序调用和返回指令
(1)子程序调用指令
1)段内直接调用指令。
指令格式:CALL过程名
功能:
①(IP)→↓(SP);即将断点(IP)压入栈顶保护。
②目的地址EA→IP;即实现转移。
2)段间直接调用指令。
指令格式:CALL FAR PTR过程名
功能:
①(CS)→↓(SP),目的地址的段首址→CS。
②(IP)→↓(SP),目的地址EA→IP。
3)段内间接调用指令。
指令格式:CALL WORD PTR OPD
功能:
①(IP)→↓(SP)。
②(OPD)→IP。
4)段间间接调用指令。
指令格式:CALL DWORD PTR OPD
功能:
①(CS)→↓(SP),(OPD+2)→CS。
②(IP)→↓(SP),(OPD)→IP。
说明:对于间接调用,OPD可以使用各种寻址方式,转移的目的地址是存放在存储器单元里的。
(2)子程序返回指令
指令格式:RET
功能:段间调用返回,其操作过程如下:
①↑(SP)→IP,(SP)+2→SP;将堆栈栈顶内容弹出送IP,堆栈指针变化。
②↑(SP)→CS,(SP)+2→SP;将堆栈栈顶内容弹出送CS,堆栈指针变化段内调用返回,则只执行①。
说明:该指令一般是作为子程序(或过程)的最后一条指令。
3.中断指令
8086/8088 CPU中有三种中断操作指令:软件中断INT n;溢出中断INTO;中断返回。
这些指令在下面章节中涉及,这里只讲中断返回指令。
指令格式:IRET
功能:除有RET的功能外,还从堆栈中弹出一个字送标志寄存器STATUS。
该指令一般作为中断子程序的最后一条语句。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。