控制转移类指令可以改变CS和IP寄存器的值,即改变程序的走向。这类指令如下。
·子程序调用与返回指令:CALL、RET、RET n。
·无条件转移与条件转移指令:JMP、JCC(CC为条件)。
·循环控制指令:LOOP、LOOPE(LOOPZ)、LOONE(LOOPNZ)、JCXZ。
·中断控制指令:INT n、INTO、IRET。
下面分别进行介绍。
1.子程序调用与返回指令
CALL指令用来调用子程序,调用地址可以是段内直接地址、段内间接地址、段间直接地址、段间间接地址4种之一。CALL指令的功能是先将断点地址(即当前程序的IP值或IP与CS的值)压入堆栈,然后将子程序的首地址装入IP或IP与CS中,从而将程序转移到子程序的入口,接着执行子程序。子程序的最后一条指令一定是RET指令。当执行RET指令时,CPU会从堆栈中自动弹出断点地址装入IP或者IP与CS中,从而达到返回调用程序的目的。段间返回要用RETF。
RET n表示带偏移量的返回指令,n为8位或16位无符号数。RET n除完成相应的RET功能外,还使SP的值加上n的值,以使堆栈中的无用参数或者数据去掉。该指令常用于主程序调用子程序时向子程序提供一些参数或其他信息的情况下,而这些参数或信息在执行完子程序之后已没有用处,因而把它们从堆栈中去掉。
2.转移指令(www.daowen.com)
转移指令分为无条件转移指令(JMP)和条件转移指令(JCC)两类。
JMP指令后的转移地址与上述调用地址一样,也有4种,可以无条件地实现段内转移和段间转移。
JCC比JMP多了一个条件判断的功能,CC是条件,它是根据5个状态标志位SF、ZF、PF、CF、OF来判断的,5个标志位有10种状态,所以CC可以是S/NS、Z/NZ、P/NP、C/NC、O/NO,单字母表示该标志位为1转移,双字母表示该标志位为0转移。例如,JS disp表示SF=1则转移;JNS disp表示SF=0则转移。此外还可以将几个标志位的逻辑组合作为转移的条件,根据CF和ZF的组合可以判断无符号数的大小,其指令为JA、JNA或JNBE、JBE两种;根据OF、SF和ZF的组合可以判断符号数的大小,其指令为JG、JGE、JL、JLE 4种。条件转移的范围只能在-128~+127之间,这一点与JMP完全不同。若程序中要求条件转移的范围超出上述范围,则只能用一条JMP指令作为中转。
3.循环控制指令
循环控制指令用来控制程序的循环次数,它根据给定的条件是否满足来决定程序的走向,它针对CX的内容进行测试,分为两种情况:或者将CX是否为0作为转移条件(例如LOOP、JCXZ),或者将CX是否为0与ZF标志位的状态相结合作为转移条件(LOOPZ、LOOPNZ)。循环控制的目标地址必须在控制指令的-128~+127字节范围内。
4.中断控制指令
INT n为软中断指令,n为中断向量号,可以提供0~255(或者00H~FFH)共256个向量号。该指令可以用于系统中断调用,也可以用该指令检查外部硬件中断的已写好的中断服务程序。该指令执行时先把标志寄存器和断点地址压入堆栈,然后根据中断向量号查找中断向量表,取出中断服务程序的入口地址,实现程序的转移。中断向量表的内存绝对地址为000H~3FFH,共1 KB单元。每个向量号对应一个4字节的地址,所以1 KB的向量表中可对应256个不同的中断向量。在n×4和n×4+2两个字(4字节)地址中分别存放着中断服务程序入口地址的偏移量(将要送至IP)和入口地址的段地址(将要送至CS)。
INTO为中断返回指令,用以退出中断过程,返回到中断时的断点处。各种中断服务程序的最后一条指令肯定是IRET。该指令把原来保存在堆栈中的FR、IP及CS弹出,以恢复现场与断点。由于标志位要恢复中断前的状态,因此,该指令对所有标志位都有影响。
控制转移类指令除中断返回指令IRET外,其他指令对标志位均无影响。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。