您好,欢迎来电子发烧友网! ,新用户?[免费注册]

当前位置:电子发烧友网 > 图书频道 > 电子 > 《计算机组成原理与汇编语言》 > 第3章 指令系统与汇编语言设计

第6节 程序控制指令

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中的值