例7.5 宏定义:

    
FO    MACRO   P1
         JMP    TA&P1   ;TA与哑元P1形成无条件跳转指令中的标号
         ENDM
    宏调用:
        FO     WORD_VAR
    宏展开:
      1  JMP    TAWORD_VAR ;TA与实元WORD_VAR形成标号TAWORD_VAR
    在这里,如果宏定义写为
    FO     MACRO P1
         JMP    TAP1
         ENDM

  则在展开时,汇编程序把TAP1看作是一个独立的标号,并不把TAP1中的P1作为哑元看待,这样就不能得到预期的结果。


 例7.6 宏定义:

   
MSGGEN   MACRO   LAB,NUM,XYZ
          LAB&NUM  DB 'HELLO MR.&XYZ'  ;用&依次形成字符串数据定义的变量名及字符串中的一部分
         ENDM              
   宏调用:
   MSGGEN    MSG,1,TAYLOR
   宏展开:
     1    MSG1    DB 'HELLO MR.TAYLOR'  ;变量名为MSG1,字符串中的一部分是'MR.TAYLOR'
                         

  
这里再介绍一下宏定义的变元中使用 % 操作符的情况,它的格式是:
           
% expression

 例7.7 宏定义:

   
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'
        .
        . 
    宏展开:
        .
        .       
     2    MSG1     DB 'SYNTAX ERROR'
        .
        .
     2    MSG2     DB 'INVALID OPERAND'
        .
        .
  
其中,2表示它是第二层展开的结果(一般在LST清单中,使用隐含的.XALL伪操作,即不产生代码的语句在清单中并不列出。为了能看到宏展开后所有的语句,可以在源程序中增加.LALL语句,此时就能看到所有的语句了)。

  实际上,本例的展开可分为如下两层:
        
.
        .
       CNTR = 0
     1  CNTR = CNTR + 1         ;CNTR值为1
     1  MSG % CNTR, 'SYNTAX ERROR'   ;实参1取代虚参COUNT
     2  MSG1 DB 'SYNTAX ERROR'
        .
        .
     1  CNTR = CNTR + 1         ;CNTR值为2
     1  MSG % CNTR, 'INVALID OPERAND' ;实参2取代虚参COUNT
     2  MSG2 DB 'INVALID OPERAND'
        .
        .