经典汇编语言教程:9.1.4 宏的嵌套定义

9.1.4 宏的嵌套定义

宏的嵌套定义有二种方式:宏定义体内引用其它的宏和宏定义体内定义其它的宏。

1、宏定义体内引用其它的宏

在宏的定义体中又引用了其它已定义好的宏,这种宏定义方式在实际的编程过程时常会用到。如果被引用的宏还没定义的话,汇编程序将会显示出错信息。

例如:
ABSMACRO  OPRD1, OPRD2
MOPM SUB, OPRD1, OPRD2 ;引用前面已定义的宏MOPM
ENDM

在定义宏ABS时,引用了前面已定义好的宏MOPM。

2、宏定义体内定义其它的宏

宏的定义体内又定义了其它宏,只有在先引用了外层的宏定义,才能引用内层的宏,这是因为,当外层宏展开后,内层宏的定义才变得有效。

这种定义方式虽然有其好的一面,但它使宏的定义更加隐蔽,削弱了程序的可读性,降低了程序的可维护性,因此,这种宏定义方式在实际的编程中很少使用。

例9.4 假设有三个内存字变量Oprd1,Oprd2和Oprd3,编写宏定义实现下面功能(其中:OP是除加、减之外的二元操作):

Oprd1 ← Oprd2 OP Oprd3

解:
方法1:用宏嵌套定义的方式来实现
OPMMMACRONAME, OP
NAMEMACROOPRD1, OPRD2, OPRD3
PUSHAX
MOVAX, OPRD2
OPAX, OPRD3
MOVOPRD1, AX
POPAX
ENDM
ENDM

这时,如果要完成下列操作(其中:w1,w2和w3是内存字变量):

w1 ← w2 + w3    w1 ← w2 OR w3

那么,可按下列宏引用的方式来完成所需要的功能:

OPMM MADDM, ADD 1 MADDM MACRO OPN1, OPN2, OPN3
1 PUSH AX
1 MOV AX, OPN2
1 ADD AX, OPN3
1 MOV OPN1, AX
1 POP AX
1 ENDM
;宏引用语句(1):在宏扩展后将得到一个新的宏定义MADDM——把后二个内存字变量之和赋给第一个内存字变量:
OPMM  MORM, OR 1 MORM MACRO OPN1, OPN2, OPN3
1 PUSH AX
1 MOV AX, OPN2
1 OR AX, OPN3
1 MOV OPN1, AX
1 POP AX
1 ENDM
;宏引用语句(2):在宏扩展后将得到另一个新的宏定义MORM——把后二个内存字变量之“逻辑或”赋给第一个内存字变量:
MADDM  w1, w2, w3 1 PUSH  AX
1 MOV AX, W2
1 OR AX, W3
1 MOV W1, AX
1 POP AX
1 ENDM
;有了宏引用语句(1)和(2)所得到的宏定义,当前宏引用语句和下一条才有效,并在宏扩展时能得到相应的程序片段。
MORM   w1, w2, w3 1 PUSH  AX
1 MOV AX, W2
1 OR AX, W3
1 MOV W1, AX
1 POP AX
1 ENDM

方法2:把所要运算的指令操作符作为参数进行传递

OPMMMACROOP, OPRD1, OPRD2, OPRD3
PUSHAX
MOVAX, OPRD2
OPAX, OPRD3
MOVOPRD1, AX
POPAX
ENDM

有了上述定义之后,可按下列宏引用的方式来完成上面的“加”和“逻辑或”的功能,单击它们可显示宏扩展时所得到的程序片段:

OPMM  ADD, w1, w2, w3 1 PUSH AX
1 MOV AX, w2
1 ADD AX, w3
1 MOV w1, AX
1 POP AX
OPMM  OR, w1, w2, w3 1 PUSH AX
1 MOV AX, w2
1 OR AX, w3
1 MOV w1, AX
1 POP AX

从上面二种方法的比较来看,方法2显然要简单、直观些,程序的可读性和可维护性也要高一些。所以,通常情况下,宏定义的嵌套方式在实际编程过程中是很少使用的。

上页:上一课 下页:下一课

经典汇编语言教程·相关目录

第1章 汇编语言的由来,数据类型第2章 CPU资源和存储器
第3章 操作数的寻址方式第4章 标识符和表达式
第5章 微机CPU的指令系统第6章 程序的基本结构
第7章 子程序和库第8章 输入输出和中断
第9章 宏第10章 应用程序设计
第11章 数值运算协处理器第12章 汇编语言和C语言
汇编语言重要附录Windows API函数大全
版权所有 © 中山市飞娥软件工作室 证书:粤ICP备09170368号