使用宏指令的三个步骤:宏的定义、调用和展开。宏定义即将一段程序代码定义为宏指令。经过定义后的宏指令可以被插入到程序需要的地方,用法和其他汇编语言指令相同,这个过程就是宏调用。而在程序被汇编的时候,在宏调用的位置用宏定义的指令代码代替宏指令,最终生成处理器能够执行的代码的过程就是宏的展开。
1.宏定义
宏指令的定义是由汇编伪指令MACRO和ENDM来实现的,宏指令的定义格式为:
这里,macro_name即宏指令名,是为该宏定义所起的名称,相当于宏指令的“操作符”,宏指令名应当以字母开头。在MACRO伪操作符后面紧跟着宏定义的形式参数(又称哑元),形参可有可无,当有超过一个形参时,各形参之间以半角逗号隔开。在MACRO伪操作和ENDM伪操作之间是宏定义体,即一段具有独立功能的指令序列,宏定义伪操作将这段指令序列定义为给定的宏指令名macro_name。例如:
这个宏定义以一条REP MOVSB指令为核心实现了将长度为LEN的字符串从SRC复制到DST的功能,其中LEN、SRC和DST为形式参数,在调用宏的时候需要使用实际参数进行替代。
2.宏调用
对于定义好的宏指令,在程序中可以直接通过引用宏指令的方式来调用它,称为宏调用。宏在被调用前必须先被定义。宏调用的格式为:
macro_name[实参1,实参2,…]
这里,macro_name为被定义的宏指令名,根据宏指令定义时定义的形式参数的个数的不同,在宏指令名的后面带对应的实际参数(又称实元)。如果在定义时没有定义形式参数,则宏指令的调用也不能带实际参数。实际参数和形式参数之间通过位置一一对应,多个实参之间也使用半角逗号分隔。
例如,下面代码就是使用上面定义的MOVSTR宏指令实现将一个64个字符的字符串从STR复制到BUFFER的功能。(www.xing528.com)
MOVSTR 64,STR,BUFFER
3.宏展开
当汇编程序扫描到源程序中的宏定义时,汇编程序把宏定义的相关信息填入到宏定义表中,这些信息将在扫描到宏调用时被用于宏的展开。宏的展开实际上就是一个替代的过程,用宏定义体替代该宏指令,并用实参按位置对应关系一一替代形参。例如上面对MOVSTR的宏调用将被展开为:
LDS SI,STR
LES DI,BUFFER
MOV CX,64
CLD
REP MOVSB
在一般情况下,实参和形参的个数相等,这时实参将按照位置对应关系一一替代形参。当实参的个数少于形参时,多余的形参将被“空”替代;当实参的个数多于形参,多余的实参将被忽略。需要注意的是,宏的展开只是简单的字符串替代,并不检查语法的正确性。语法的正确性检查则由汇编程序在宏展开后进行。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。