第9章 宏

宏是程序设计的另一个基本概念,它是把一段程序代码用一个特定标识符(即:宏名)来表示。这样,在编写源程序时,程序员就可以直接使用该标识符来代替一段代码的编写,从而减少了重复代码的编写工作,也为减少错误,提高程序的可维护性提供了帮助。宏在高级语言(如:C/C++等)也有广泛的使用。

9.1 宏的定义和引用

通常情况下,宏是用来代表一个具有特定功能的程序段,它只需在源程序中定义一次,但可在源程序中引用多次。只要在编写程序时需要,就可以直接使用它。

9.1.1 宏的定义

在使用宏之前必须先定义宏,定义宏一般格式如下:

宏名 MACRO [形参1, 形参2, ……]
;宏的定义体
ENDM

在书写宏定义时,必须遵照下列规定:

MACROENDM是二个必须成对出现的关键字,它们分别表示宏定义的开始和结束;

MACROENDM之间的部分是宏的定义体,它是由指令、伪指令或引用其它宏所组成的程序片段,是宏所包含的具体内容;

、“宏名”是由程序员指定的一个合法的标识符,它代表该宏;
、宏名可以与指令助忆符、伪指令名相同。在这种情况下,宏指令优先,而同名的指令或伪指令都失效;
、在ENDM的前面不要再写一次宏名,这与段或子程序定义的结束方式有所不同;
、在宏定义的首部可以列举若干个形式参数,每个参数之间要用逗号分隔。

根据上述规定,我们提倡宏名尽可能不要与指令助忆符、伪指令相名,以免引起不必要的误会。

例9.1 定义一个把16位数据寄存器压栈的宏。

PUSHR MACRO
PUSH AX
PUSH BX
PUSH CX
PUSH DX
ENDM

例9.2 定义二个字存储变量相加的宏。

MADDM MACRO OPRD1, OPRD2
MOV AX, OPRD2
ADD OPRD1, AX
ENDM

上述宏定义虽然能满足题目的要求,但由于在定义体中改变了寄存器AX的值,这就使宏的引用产生了一定的副作用。为了使寄存器AX的使用变得透明,可把该宏定义改成如下形式:

MADDM MACRO OPRD1, OPRD2
PUSH AX
MOV AX, OPRD2
ADD OPRD1, AX
POP AX
ENDM

通过在宏定义的开始和结尾分别增加对所用寄存器的保护和恢复指令,就使得:对该宏的任意引用都不会产生任何副作用。