第七单,宏

宏是汇编语言的特征之一,在汇编语言的源程序中,若某程序片断需要多次使用,为了避免重复书写,那么可以把它定义成一条宏指令。

一、宏指令的定义和使用

宏指令在使用之前要先定义,宏定义的格式一般如下:

宏指令名 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