宏汇编程序(MASM)是具有宏加工功能的
汇编程序。可以用它定义含参数的程序段,在使用的位置上调用它们,汇编时将进行
宏(指令)展开,把
宏定义所预先定义的指令
目标代码插在该位置上。
汇编与汇编程序
用
汇编语言编写的源程序也需要翻译成目标程序才能被机器执行。这个翻译过程称为汇编,完成汇编任务的程序称为汇编程序,见图1。
汇编程序是最早也是最成熟的一种系统软件。它除了能够将汇编语言
源程序翻译成
机器语言程序这一主要功能外,还能够根据用户的要求自动分配存储区域 (包括程序区、数据区、暂存区等 );自动地把各种进位制数转换成二进制数,把字符转换成 ASCII 码,计算表达式的值等;自动对源程序进行检查,给出错误信息 (如非法格式,未定义的助记符、标号,漏掉操作数等 )等。具有这些功能的汇编程序又称为基本汇编 (或小汇编 ASM) 。
宏汇编程序
在基本汇编的基础上,进一步允许在源程序中把一个指令序列定义为一条宏指令的汇编程序,就叫做宏汇编 (MASM)程序 。它包含全部 ASM 功能,还增加了宏指令、结构、记录等高级汇编语言功能。
宏汇编程序的主要特点是在汇编程序中增加宏加工功能。它允许用户方便地定义和使用宏指令,适用于程序中多处出现、具有一定格式、可以通过少数参数调节改变的程序段落的场合。采用这种方法不仅减少程序的长度,增加可读性,而且程序段落的格式需要改变时,只须改动定义处,而不必改动每一使用处。
宏汇编程序不仅包含一般汇编程序的功能,而且用了高级程序使用的数据结构,是一种接近高级程序的汇编程序。例如它提供了记录、结构和字符串操作;具有宏处理、条件汇编及磁盘操作系统DOS功能调用等多种功能;程序的开发以及调试手段也比较完善。
使用宏汇编的原因
在编制汇编语言程序过程中,有些功能段需要多次重复使用,所不同的只是参与操操作数。为了减少编程的工作量,通常采用两种方法:
(1)将程序段编写为独立的子程序;
(2)将程序段定义成宏。
宏(指令)的用途
(1)缩短源代码;
(2)扩充指令集;
(3)更改某些指令助记符的意义(宏指令的优先级高于指令和伪指令)。
宏
宏是计算机软件系统中一个广泛存在的概念。从办公软件OFFICE到程序开发语言C等等,可以把某项要操作的某一个过程定义为宏。具体到在汇编语言中,宏也是汇编的主要特点之一,它是与子程序类似但又独具特色的另外一种简化源程序的方法。
编程语言中,宏是源程序中一段有独立功能的程序代码,宏也可以称为宏指令、宏操作。宏的使用需要经过三个步骤:宏定义、宏调用和宏展开。首先进行宏定义;然后进行宏调用;最后,汇编时由 MASM 进行宏扩展。
宏定义
宏定义语句MACRO和子程序定义语句PROC一样都是伪指令。宏定义需要一对 伪指令MACRO和ENDM完成。宏定义的格式如下:
宏名字 MACRO [哑元1,哑元2,…]
...
语句串
...
ENDM
说明:宏定义并不产生目标代码,只是用来说明“宏名字”与一段源代码之间的联系。其中哑元1,哑元2,…是虚拟参数或形式参数,用逗号分隔。虚参或形参可不设置。
例如:定义键盘输入宏指令INPUT:
INPUT MACRO
MOV AH,01H
INT 21 H
ENDM
需注意的是,起名时,不要和汇编语言的指令名、保留字相同。
宏调用
在程序中使用宏时,只要写出宏名字[实参]即可。宏调用的格式为:宏指令名 [实参1,实参2,…,实参n]。
例如,从键盘输入一个字符,判断是否为“一“号,不是则继续输入,是结束。(利用前面定义的宏)。
MODEL SMALL
STACK 100H
CODE
START:
INPUT
CMP AL,‘-‘
JNE START
RETSYS
END START
宏展开
宏展开将宏指令语句用宏定义中宏体的程序段目标代码替换。汇编源程序时,宏汇编程序将对每条宏指令语句进行宏展开,用实参替代相应的形参,对宏体目标代码作相应改变。图2为一个宏展开的例子。
常用指令
宏定义伪指令 (MACRO/ENDM)
格式:
宏指令名 MACRO
(宏定义体 )
ENDM
MACRO 是宏定义符, 它将一个宏指令名定义为宏定义体中包含的程序段。 ENDM 表示宏定义结束,前面不需要有宏指令名。进行一次宏定义,以后就可以多次用宏指令名进行宏调用。但是必须先定义,后调用。宏定义允许嵌套,即宏定义体中可以包含另一个宏定义,而且宏定义体中也可以有宏调用,但是也必须先定义,后调用。
声明宏体内局部标号的伪指令
LOCAL 的作用是声明宏体中的局部标号,以免在宏扩展时,同一个标号在源程序中多次出现,从而产生标号多重定义的错误。 LOCAL 伪指令必须位于宏体内其他所有语句 (包括注释 )之前,其格式为:
LOCAL 局部标号 [ ,…]
例如,下面的宏指令完成将寄存器中的一位十六进制数转换为相应的 ASCII 码,由于宏体中出现局部标号,因此必须使用 LOCAL 伪指令对宏体中的局部标号进行声明。
HEXTOASC MACRO REG
LOCAL NUM
CMP REG, 0AH
JC NUM
ADD REG, 07H
NUM : ADD REG , 30H
ENDM
清除宏定义的为指令(PURGE)
宏指令名可以和源程序中的其他变量名、标号、指令助记符、伪操作名相同,此时宏指令的优先级别最高,使其他同名的指令或伪操作无效。为了使这些指令或伪指令恢复功能,服从机器指令的定义,宏汇编程序提供了伪操作PURGE,用来在适当的时候取消宏定义。
PURGE伪指令的一般格式是:
PURGE 宏定义名[,...]
方括号表示PURGE可以取消多个宏定义,宏名之间用逗号隔开。如宏定义:
SUB MACRO VARX,VARY,RESULT
...
ENDM
宏调用:SUB X,Y,Z
PURGE SUB
“PURGE SUB”语句后的SUB恢复减法功能。