6.1.3宏定义中参数使用 宏定义和宏调用中参数及参数间的代换应注意以下若干规定: (1)宏定义中可以不带任何形式参数,在宏调用时,将用 宏中整个宏体的全部指令嵌入到宏调用处的宏指令位置。 (2)宏定义中可以使用连接运算符“&”,以实现字符串的 连接。“&”运算符只能出现在宏定义中,见下例 8 888 11
6.1.3 宏定义中参数使用 宏定义和宏调用中参数及参数间的代换应注意以下若干规定: (1)宏定义中可以不带任何形式参数 宏定义中可以不带任何形式参数,在宏调用时,将用 宏中整个宏体的全部指令嵌入到宏调用处的宏指令位置。 (2)宏定义中可以使用连接运算符“&”,以实现字符串的 连接。“&”运算符只能出现在宏定义中 运算符只能出现在宏定义中,见下例 11
例题6.2某宏定义如下: ADL MACRO P1,P2 JMP TA&P1 “&”出现在指令的操作数中 MOV TB&P1,P2 ;同上 ENDM 当有宏调用时: ADL [BX+SI],AX 则有宏展开: JMP TA [BX+SI] ;宏展开时&不存在 +MOV TB[BX+SI],AX 8o8 o8 888 12
例题6.2 某宏定义如下: ADL MACRO P1 MACRO P1,P2 JMP TA&P1 ;“& ”出现在指令的操作数中 MOV TB&P1, P2 MOV TB&P1, P2 ;同上 ENDM 当有宏调用时: ADL [BX+SI],AX 则有宏展开: + JMP TA[BX+SI] ;宏展开时&不存在 + MOV TB[BX+SI] + MOV TB[BX+SI],AX 12
(3)在宏定义中,形式参数可以出现在宏体中 任何位置,因此也可以出现在操作码位置,参 见下例。 例题6.3某宏定义如下: NEWINST MACRO P1 P1 AX ENDM 当有宏调用时: NEWINST INC 则有宏展开为: INC AX 888 13
(3)在宏定义中,形式参数可以出现在宏体中 任何位置,因此也可以出现在操作码位置,参 见下例。 例题6.3 某宏定义如下: NEWINST MACRO P1 P1 AX ENDM 当有宏调用时: NEWINST INC 则有宏展开为: + INC AX 13
(4)当形参出现在宏体的字符串中时,参数依然可。 以代替,参见下例。 例题6.4 某宏定义如下: MSTRING MACRO LAB,NUM,XYZ LAB&NUM DB“HELL0MY.&XYZ ENDM 当有宏调用时有 MSTRING MSG,1,TXT 则有宏展开为: MSG1 DB “HELL0MY.TXT .888 14
(4)当形参出现在宏体的字符串中时,参数依然可 以代替,参见下例。 例题6.4 某宏定义如下: MSTRING MACRO LAB,NUM,XYZ LAB&NUM DB “HELLO MY.&XYZ ” ENDM 当有宏调用时有 MSTRING MSG,1,TXT 则有宏展开为: + MSG1 DB MSG1 DB “HELLO MY.TXT ” 14
(5)在宏调用中,有时实参是带间隔符(如空格、逗号等) 的字符串,这样的实参必须用尖括号括起来,以避免混淆, 参见下例。 例题6.5在程序设计中,经常定义堆栈段,而且定义 的语句基本相同,仅是堆栈段的大小和初值有所差别。为 此,可先定义一个如下宏: MSTACK MACRO XYZ STACK SEGMENT STACK DB XYZ STACK ENDS ENDM 当有宏调用时:MSTACK <200DUP(0)> 则有宏展开为: STACK SEGMENT STACK DB 2 200 DUP (0) STACK ENDS 15
(5)在宏调用中,有时实参是带间隔符(如空格、逗号等) 的字符串,这样的实参必须用尖括号括起来 这样的实参必须用尖括号括起来,以避免混淆, 参见下例。 例题6.5 在程序设计中,经常定义堆栈段 经常定义堆栈段,而且定义 的语句基本相同,仅是堆栈段的大小和初值有所差别。为 此,可先定义一个如下宏: MSTACK MACRO XYZ STACK SEGMENT STACK DB XYZ STACK ENDS ENDM 当有宏调用时:MSTACK <200 DUP(0)> 则有宏展开为: + STACK SEGMENT STACK + DB 200 DUP (0) + STACK ENDS 15