4.7.1 宏定义、宏调用和宏使用
宏是源程序中一段有独立功能的程序段。它只需要在源程序中定义一次,就可以多次调用它,调用时只需要用一条宏指令语句就可以了。
宏定义是用MACRO和ENDM伪指令来实现的。其格式为:
宏指令名 MACRO 变元表
…
(宏定义体)
…
ENDM
宏指令名(Macro_name)给出该宏定义的名称,调用时就使用宏指令名来调用该宏定义。宏指令名的第一个字符必须是字母,其后可以跟字母、数字或下画线字符。宏定义体就是一组有独立功能的程序段。变元表(dummy p arameter list)给出了宏定义中所用到的形式参数(或称变元),每个变元之间用逗号(,)隔开。宏定义中可以无变元。
经宏定义定义后的宏指令就可以在源程序中调用,这种对宏指令的调用称为宏调用。宏调用格式为:
宏指令名 [变元表]
宏调用中的宏指令名就是宏定义中的宏指令名,这是一一对应的。实元表(actualp arameter list)中的每一项为实元,相互之间用逗号“,”隔开。此时的实元位置与宏定义中的变元位置是一一对应的。当然,宏定义中无变元表,宏指令中也可无实元表。
当源程序被汇编时,汇编程序将对每个宏调用作宏展开。宏展开就是用宏定义体取代源程序中的宏指令,而且用实元取代宏定义中的变元。在取代时,实元和变元是一一对应的,即第一个实元取代第一个变元,第二个取代第二个变元……依次类推,一般来说,实元的个数应该和变元的个数相等,但汇编程序并不要求它们一定要相等。若实元个数大于变元个数,则多余的实元不予考虑;若实元个数小于变元个数,用多余的变元作“空”处理。另外,宏展开并用实元取代变元后,所得到的语句应该是有效的,否则汇编程序将指示出错。下面举例说明宏定义、宏调用和宏展开。
【例4-23】 用宏指令定义两个字操作数相乘,得到的一个16位的第三个操作数作为结果。
宏定义:
MULTIPLY MACRO OPR1,OPR2,RESULT
PUSH DX
PUSH AX
MOV AX,OPR1
IMULOPR2
MOV RESULT,AXPOP AX
POP DX
ENDM
宏调用:
…
MULTIPLY CX,VAR,XY Z[BX]
…
MULTIPLY 240,BX,SAVE
…
宏展开:
…
+PUSH DX
+PUSH AX
+MOV AX,CX
+IMULVAR
+MOV XY Z[BX],AX
+POP AX
+POP DX
…
+PUSH DX
+PUSH AX
+MOV AX,240
+IMULBX
+MOV SAV E,AX
+POP AX
+POP DX
…
汇编程序在所展开的指令前加上“+”号以示区别。从例4-23可以看出,由于宏指令可以带变元,调用时可以用实元取代,这就避免了子程序变量传递带来的麻烦,增加了宏汇编使用的灵活性;而且实元可以是常数、寄存器单元名、存储器单元名以及用各种寻址方式能找到的地址或表达式,实元还可以是指令的操作码(助记符)或操作码的一部分,宏汇编的这一特性是子程序所没有的。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。