AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > 汇编语言

高级汇编语言技术

51自学网 http://www.51zixue.net

二、重复汇编
   
有时汇编语言程序需要连续地重复完全相同的或者几乎完全相同的一组代码,这时可使用重复汇编。
1.重复伪操作
其格式为:
    REPT    expression
      ...   (重复块)
    ENDM
其中表达式的值用来确定重复块的重复次数,表达式中如包含外部或未定义的项则汇编指示出错.
   
重复伪操作并不一定要在宏定义体内,例如:
X=0
       REPT   10
X=X+1
       DB    X
       ENDM
则汇编后产生
  +   DB    1
  +   DB    2
  +   DB    3
     ...
  +   DB    10
把字符A到Z的ASCII码填入数组TABLE
CHAR='A'
TABLE  LABEL  BYTE
       REPT   26
       DB     CHAR
  CHAR=CHAR+1
       ENDM
用宏定义及重复伪操作把TAB,TAB+1,TAB+2,...,TAB+16的内容存入堆栈.
宏定义:
   PUSH_TAB    MACRO  K
               PUSH    TAB+K
               ENDM
宏调用:
    I=0
             REPT    17
             PUSH_TAB  % I
    I=I+1
             ENDM
要求建立一个100D字的数组,其中每个字的内容是下一个字的地址,而最后一个字的内容是第一个字的地址.
ARRAY     LABEL   WORD
           REPT    99
           DW       $+2
           ENDM
           DW       ARRAY
  2.不定重复伪操作
   
(1)IRP伪操作
格式是:
     IRP   dummy,<argument list>
        ...  (重复块)
     ENDM
汇编程序把重复块的代码重复几次,每次重复把重复块中的哑元用自变量表中的一项来取代,下一次取代下一项,重复次数由自变量表中的自变量个数来确定.自变量表必须用尖括号括起,它可以是常数,符号,字符串等.
例1:
    IRP    X,<1,2,3,4,5,6,7,8,9,10>
    DB    X
    ENDM
汇编后得:
  +     DB    1
  +     DB    2
       ...
  +     DB    10
例2:
     IRP    REG,<AX,BX,CX,DX>
     PUSH   REG
     ENDM
汇编后得:
    +    PUSH    AX
    +    PUSH    BX
    +    PUSH    CX
    +    PUSH    DX

    (2)IRPC伪操作
格式是:
    IRPC     dummy,string(或<string>)
     ...      (重复块)
    ENDM
IRPC和IRP类似,但自变量表必须是字符串.重复次数由字符串中的字符个数确定,每次重复用字符串中的下一个字符取代重复块中的哑元.例:
例1:
     IRPC      X,0 1 2 3 4 5 6 7
     DB        X+1
     ENDM
汇编后得:
   +  DB    1
   +  DB    2
     ...
   +  DB    8
例2:
     IRPC      K,A B C D
     PUSH      K&X
汇编后展开形成:
  +    PUSH   AX
  +    PUSH   BX
  +    PUSH   CX
  +    PUSH   DX

三、条件汇编
   汇编程序能根据条件把一段源程序包括在汇编语言程序内或者把它排除在外,这里就用到条件伪操作.条件伪操作的一般格式是:
    IFXX       argument
     ...      }自变量满足给定条件汇编此块
    [ELSE]
     ...      }自变量不满足给定条件汇编此块
    ENDIF
自变量必须在汇编程序第一启遍扫视后就成为确定的数值.条件伪操作中的XX表示条件如下:
  IF expression              汇编程序求出表达式的值,如此值不为0则满足条件.
  IFE expression             如求出表达式的值为0则满足条件.
  IFDEF symbol               如符号已在程序中定义,或者已用EXTRN伪操作说明该符号是在外部定义的,则
                            满足条件.
  IFNDEF symbol              如符号未定义或未通过EXTRN说明为外部符号则满足条件.
  IFB <argument>             如自变量为空则满足条件
  IFNB<argument>             如自变量不为空则满足条件
  IFIDN <argu-1>,<argu-2>   如果字符串<arg-1>和字符串<arg-2>相同,则满足条件.
  IFDIF <argu-1>,<argu-2>   如果字符串<arg-1>和字符串<arg-2>不相同,则满足条件.
条件伪操作可以用在宏定义体内,也可以用在宏定义体外,也允许嵌套任意次.
例1:宏指令MAX把三个变元中的最大值放在AX中,而且使变元数不同时产生不同的程序段.
宏定义:

   MAX   MACRO   K,A,B,C
         LOCAL   NEXT,OUT
         MOV     AX,A
         IF      K-1
         IF      K-2
         CMP     C,AX
         JLE     NEXT
         MOV     AX,C
         ENDIF
  NEXT:  CMP     B,AX
         JLE     OUT
         MOV     AX,B
         ENDIF
  OUT:
         ENDM
宏调用:
         MAX     1,P
         MAX     2,P,Q
         MAX     3,P,Q,R
宏展开:     
         MAX     1,P
   +     MOV     AX,P
   +??0001:
         MAX     2,P,Q
   +     MOV     AX,P
   +??0002:CMP   Q,AX
   +     JLE     ??0003
   +     MOV     AX,Q
   +??0003:
         MAX     3,P,Q,R
   +     MOV     AX,P
   +     CMP     R,AX
   +     JLE     ??0004
   +     MOV     AX,R
   +??0004:CMP   Q,AX
   +     JLE     ??0005
   +     MOV     AX,Q
   +??0005:
例2.宏指令GOTO   L,X,REL,Y(其中REL可以是Z,NZ,L,NL等)可以根据不同情况产生无条件转移指令或比较和条件转移指令.
宏定义:
    GOTO         MACRO      L,X,REL,Y
                 JFB        <REL>
                 JMP        L
                 ELSE
                 MOV        AX,X
                 CMP        AX,Y
                 J&REL      L
                 ENDIF
                 ENDM
宏调用:
                ...
   GOTO         LOOP,SUM,NZ,15
                ...
   GOTO         EXIT
                ...
宏展开:
                ...
  +     MOV     AX,SUM
  +     CMP     AX,15
  +     JNZ     LOOP
                ...
  +     JMP     EXIT
例3.宏定义可允许递归调用,此时条件伪操作可用来结束宏递归
    宏指令POWER可以用来实现X和2N相乘.这只需对X左移N次可实现,可以设COUNT为递归次数的计数值,当该数与N相等时即可结束递归调用.

宏定义:
   POWER       MACRO        X,N
               SAL          X,1
   COUTN=COUT+1
               IF           COUNT-N
               POWER        X,N
               ENDIF
               ENDM
宏调用:
   COUTN=0
              POWER       AX,3
宏展开:
    +        SAL    AX,1
    +        SAL    AX,1
    +        SAL    AX,1
例4.宏指令BRANCH产生一条转向X的转移指令.当它相对于X的距离小于128字节时产生JMP   SHORT X;否则产生JMP  NEAR  PTR  X(X必须位于该转移指令之后,即低地址区).
宏定义:
   BRANCH    MACRO    X
             IF     ($-X) LT 128
                   JMP      SHORT X
             ELSE
                   JMP      NEAR PTR X
             ENDIF
             ENDM
宏调用:
            BRANCH   X
宏展开:
    如X与BRANCH指令间的距离小于128时产生
  +   JMP   SHORT X
否则产生:
  +   JMP NEAR PTR X

 
 

上一篇:控制转移(2)  下一篇:伪操作