汇编中的宏指令

2430阅读 0评论2013-10-12 shaohui973
分类:嵌入式

一、宏汇编
    宏定义是用一组伪操作来实现的。其格式是:
    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'
上一篇:linux下的系统调用函数到内核函数的追踪
下一篇:powerpc e500mc学习总结之上电启动(一)