第七单,宏
宏是汇编语言的特征之一,在汇编语言的源程序中,若某程序片断需要多次使用,为了避免重复书写,那么可以把它定义成一条宏指令。
一、宏指令的定义和使用
宏指令在使用之前要先定义,宏定义的格式一般如下:
宏指令名 MACRO [形式参数名]
……
ENDM
可选的形式参数表由若干参数组成,各形式参数间使用逗号分隔开。
例如,我们把通过DOS的1号功能调用从键盘读一个字符的程序片断定义成一个宏
GETTCH MACRO
MOV AH, 1
INT 21H
ENDM
在定义宏指令后,就可以使用宏指令来表示相应的程序片断。这称为宏调用。
宏调用的一般格式为:
宏指令名 [实参数表]
在对源程序进行汇编时,汇编程序把源程序中的宏指令替换成对应的宏定义休,这称为宏展开或宏扩展。
二、宏指令的用途
1. 缩短源代码
若在源程序中要多次使用到某个程序片断,那么就可以把此程序片断定义为一条宏指令。此后,在需要这个程序片断之处安排一条对应的宏指令就行了。
由汇编程序在汇编时产生代码,这不仅能有效地缩短代码,而且能够减少编辑汇编语言源程序过程中的错误。
2. 扩充指令集
CPU的指令集是确定的,但是利用宏指令能够在汇编语言中形式上对指令集进行扩充。扩充后的指令集是机器指令集和宏指令集的并集。
这不公能够方便源程序的编写,而且便于阅读和理解源程序。
3. 某些指令的助词符的意义
宏指令名可以与指令助词符或伪操作指令名相同。在这种情况下,宏指令的优先级最高,而同名的指令或伪操作就失效了。
利用宏指令这一特点,可以改变指令助词符的意义。
三、宏指令中参数的使用
宏指令可以不带参数,但往往带参数的宏指令更具灵活性。
1. 指令的参数可以是变量,寄存器和存储单元,也可以是表达式。
例:
MOV CL, 4
SAL AL, CL
如果多次使用
SHIFT MACRO
MOV CL, 4
SAL, AL, CL
ENDM
若每次移位次数不同
SHIFT MACRO X
MOV CL, X
SAL, AL, CL
ENDM
引用3个参数
SHIFT MACRO X, Y, Z
MOV CL, X
S&Z Y, CL
ENDM
调用如下:
SHIFT 4, AL, AL
SHIFT 6, BX, AR
SHIFT 8, SI, HR
2. 宏指令的参数可以是操作码
MANDM MACRO OPR, X, Y
MOV AX, X
OPR AX, Y
MOV X, AX
ENDM
调用宏MANDM及其宏扩展如下:
MANDM MOV, [BX], [SI]
+ MOV AX, [BX]
+ MOV AX, [SI]
+ MOV [BX], AX
MANDM ADD, [BX], ES: [1234H]
+ MOV AX, [BX]
+ ADD AX, ES: [1234H]
+ MOV [BX], AX