宏彙編macro

原帖地址:http://blog.csdn.net/liangwei88624/article/details/6213615

一、宏彙編
    宏定義是用一組僞操作來實現的。其格式是:
    macro_name    MACRO    [dumny_parameter_list]
                   ...     (宏定義體)
                  ENDM
其中MACRO和ENDM是一對僞操作.這對僞操作之間是宏定義體--是一組獨立功能的程序代碼.宏指令名(macro_name)給出該宏定義的名稱,調用時就使用宏指令名來調用該宏定義.其中啞元表(dumny_parameter_list)給出了該宏定義中所用到的形式參數(或稱虛參),每個啞元之間用逗號隔開.
    經宏定義後的宏指令就可以在源程序中調用.這種對宏指令的調用稱爲宏調用,宏調用的格式是:
macro name [actual parameter list]
實元表(actual_parameter_list)中的每一項爲實元,相互之間用逗號隔開.
1.宏定義可以無變元
宏定義:
    SAVEREG    MACRO
               PUSH     AX
               PUSH     BX
               PUSH     CX
               PUSH     DX
               PUSH     SI
               PUSH     DI
               ENDM
宏調用:
               SAVEREG
2.變元可以是操作碼
宏定義:
    FOO    MACRO    P1,P2,P3
           MOV       AX,P1
           P2        P3
           ENDM
宏調用:
           FOO       WORD_VAR,INC,AX
宏展開:
   +       MOV       AX,WORD_VAR
   +       INC      AX
3.變元可以是操作碼的一部分,但在宏定義體中必須用&作爲分隔符.
宏定義:
   LEAP    MACRO     COND,LAB
            J&COND    LAB
            ENDM
宏調用:
            ...
            LEAP      Z,THERE
            ...
            LEAP      NZ,HERE
            ...
宏展開:
            ...
   +        JZ        THERE
            ...
   +        JNZ       HERE
            ...
4.&是一個操作符,它在宏定義體中可以作爲啞元的前綴,展開時可以把&前後個符號合併而形成一個符號,這個符號可以是操作碼,操作數或是一個字符串
宏定義:
    PO    MACRO    P1
          JMP       TA&P1
          ENDM
宏調用:
          FO        WORD_VAR
宏展開:
   +      JMP    TAWORD_VAR
5.實元是ASCII串的情況
宏定義:
   MSGGEN    MACRO    LAB,NUM,XYZ
             LAB&NUM   DB    'HELLO MR.&XYZ'
             ENDM
宏調用:
             MSGGEN     MSG,1,TAYLOR
宏展開:
    +       MSG1    DB     'HELLO MR.TAYLOR'
6.宏指令名可以與指令助記符或僞操作名相同,在這種情況下,宏指令的優先級最高,而同名的指令或僞操作就失效了.僞操作PURGE可以用來在適當的時候取消宏定義,以便恢復指令的原始含義.
宏定義:
    ADD    MACRO    OPR1,OPR2,RESULT
           ...
           ENDM
宏調用:
           ...
           ADD     XX,YY,ZZ
           PURGE  ADD
           ...
在宏調用後,用PURGE僞操作取消定義,以便恢復ADD指令的原始含義,在PURGE ADD後面所用的ADD指令,則服從機器指令的定義.
    PURGE僞操作可同時取消多個宏操作,此時各宏指令之間用逗號隔開.
7.LOCAL僞操作的使用.宏定義體內允許使用標號,如:
宏定義:
    ABSOL    MACRO    OPER
             CMP       OPER,O
             JGE       NEXT
             NEG       OPER
    NEXT:
             ENDM
如果程序中多次調用該宏定義時,展開後會出現標號的多重定義.爲此係統提供了LOCAL僞操作,其格式是
            LOCAL     list of local labels
其中局部標號表內的各標號之間用逗號隔開.彙編程序對LOCAL僞操作的局部標號表中的每一個局部標號建立唯一的符號(用??0000~??FFFF)以代替在展開中存在的每個局部標號.必須注意,LOCAL僞操作只能用在宏定義體內,而且它必須是MACRO僞操作後的第一個語句,在MACRO和LOCAL僞操作之間還不允許有註釋和分號標誌.
    本例中的ABSOL宏定義在考慮有多次調用可能性的情況下,應定義爲:
    ABSOL    MACRO    OPER
             LOCAL    NEXT
             CMP       OPER,0
             JGE       NEXT
             NEG       OPER
    NEXT: 
             ENDM
宏調用:
             ...
           ABSOL       VAR
             ...
           ABSOL        BX
             ...
宏展開:
            ...
    +       CMP     VAR,0
    +       JGE      ??0000
    +       NEG     VAR
    +??0000:
             ...
    +       CMP     BX,0
    +       JGE      ??0001
    +       NEG     BX
    +??0001:
            ...
8.宏定義中允許使用宏調用,其限制條件是:必須先定義後調用
宏定義:
   DIF    MACRO    X,Y
          MOV       AX,X
          SUB       AX,Y
          ENDM
DIFSQR   MACRO    OPR1,OPR2,RESULT
          PUSH     DX
          PUSH     AX
          DIF       OPR1,OPR2
          IMUL     AX
          MOV       RESULT,AX
          POP       AX
          POP       DX
          ENDM
宏調用:
         DIFSQR      VAR1,VAR2,VAR3
9.宏定義體內不僅可以使用宏調用,也可以包含宏定義.
宏定義:
   DEFMAC     MACRO       MACNAM,OPERATOR
              MACNAM      MACRO        X,Y,Z
                         PUSH         AX
                         MOV          AX,X
                         OPERATOR     AX,Y
                         MOV          Z,AX
                         POP          AX
                         ENDM
               ENDM
其中MACNAM是內層的宏定義名,但又是外層宏定義的啞元,所以調用DEFMAC時,就形成一個宏定義.
宏調用:
        DEFMAC    ADDITION,ADD
宏展開:
    +     ADDITION     MACRO     X,Y,Z
                       PUSH      AX
                       MOV       AX,X
                       ADD       AX,Y
                       MOV       Z,AX
                       POP       AX
                       ENDM
形成加法宏定義ADDITION.同樣,宏調用
         DEFMAC        SUBTRACT,SUB
形成減法的宏定義.當然在形成這些宏定義後,就可以使用宏調用
              ADDITION       VAR1,VAR2,VAR3
而展開成:
     +     PUSH      AX
     +     MOV        AX,VAR1
     +     ADD        AX,VAR2
     +     MOV        VAR3,AX
     +     POP        AX
10.這裏再介紹一個宏定義的變元中使用的僞操作%,它的格式是:
       %expression
彙編程序把跟在%之後的表達式的值轉換成當前基數下的數,在展開期間,用這個數來取代啞元.
宏定義:
   MSG    MACRO    COUNT,STRING
          MSG&COUNT DB     STRING
          ENDM
   ERRMSG MACRO   TEXT
          CNTR=CNTR+1
          MSG     % CNTR,TEXT
          ENDM
宏調用:
         ...
        CNTR=0
        ERRMSG   'SYNTAX ERROR'
        ...
        ERRMSG   'INVALID OPERAND'
        ...
宏展開:
         ...
    +   MSG1    DB   'SYNTAX ERROR'
         ...
    +   MSG2    DB   'INVALID OPERAND'

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章