3.6.1 程序控制指令
1. 无条件转移、调用和返回指令 (1)无条件转移指令JMP 该指令分直接转移和间接转移两种。直接转移又可分短程(SHORT)、近程(NEAR)和远程(FAR)3种形式。当程序执行到JMP指令时,就无条件地转移到所指示的目的地址。 该指令的一般格式为 JMP OPRD ;OPRD是转移的目的地址 直接转移的3种形式为: ·短程转移JM PSHORTNEXT 在短程转移中目的地址与JMP指令所处地址的距离应在-128~127范围之内。 ·近程转移JMP NEARPTRLOOP1 或JMP LOOP1 ;NEAR可省略 近程转移的目的地址与JMP指令应处于同一地址段范围之内。近程转移的NEAR往往予以省略。 ·远程转移JMP FAR PTR LOOP2 远程转移是段间的转移,目的地址与JMP指令所在地址不在同一段内。执行该指令时要修改CS和IP的内容。 间接转移指令的目的地址可以由存贮器或寄存器给出。 ·段内间接转移JMP CX JMP WORDPTR ·段间间接转移JMPDWORDPTR 该指令指定的双字指针的第一个字单元内容送入IP,第二个字单元内容送入CS,所定义的单元必定是双字单元。 (2)调用和返回指令 CALL指令用来调用一个过程或子程序。当调用的过程或子程序结束后,可使用返回指令RET,使程序从调用的过程或子程序返回。 由于过程或子程序有段间(即远程FAR)和段内调用(即近程NEAR)之分。所以CALL也有FAR和NEAR之分。这由被调用过程的定义所决定。因此RET也分段间和段内返回两种。 调用指令一般格式为 CALL NEARPTROPRD;段内调用 CALL FARPTROPRD;段间调用 下面我们举两个使用近程调用指令和远程调用指令的实例。 主程序(近程调用) … CALL NEAR PTR PROAD … ;过程PROAD定义 PROAD PROC NEAR PUSH AX PUSH CX PUSH SI LEA SI,ARY MOV CX,COUNT XOR AX,AX NEXT:ADD AX,[SI] ADD SI,2 LOOP NEXT MOV SUM,AX POP SI POP CX POP AX RET PROAD ENDP;主程序(远程调用) … CALL FARPTR PROADD… ; 过程PROADD定义(远程调用过程) PROADD PROC FAR PUSH AX PUSH CX PUSH SI PUSH DI MOV SI,[BX]MOV DI,[BX+2] MOV CX, MOV DI,[BX+4] XOR AX,AX NEXT1:ADD AX,[SI] ADD SI,2 LOOP NEXT1 MOV [DI],AX POP DI POP SI POP CX POP AX RET PROADD ENDP2. 条件转移指令 8088有18条不同的条件转移指令。它们根据标志寄存器中各标志位的状态,决定程序是否进行转移。条件转移指令的目的地址必须在现行的代码段(CS)内, 并且以当前指针寄存器IP内容为基准,其位移必须在+127~-128的范围之内。因此条件转移指令的范围是有限的,不像JMP指令那样可以转移到内存的任何一个位置上。 转移指令格式比较简单,如表3.1所示。
3. 循环控制指令
这类指令用于控制程序的循环,其控制转向的目的地址是在以当前IP内容为中心的-128~+127的范围内。这类指令用CX作计数器,每执行一次指令,CX内容减1,直到减
为0,循环才结束。
该类指令的一般格式为
LOOP OPRD ;CX≠0循环
LOOPNE OPRD ;CX≠0且ZF=0循环
LOOPE OPRD ;CX≠0且ZF=1循环
在LOOPE和LOOPNE两条指令中,只要两个条件中任一个不满足,循环就结束。
例:
SUB DI,BX
INC DI
MOV CX,DI
DEC BX
NEXT:INCBX
CMP BYTEPTR,0
LOOPE NEXT…
4. 软中断指令及中断返回指令
在8088的微机系统中,当程序执行到中断指令INT时,便中断当前程序的执行,转向由256个中断向量所提供的中断入口地址之一去执行。
软中断指令的一般格式为:
INT OPRD ;OPRD可以取00H~FFH中的值