例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' . .