首页 理论教育 宏调用和宏使用

宏调用和宏使用

时间:2022-02-28 理论教育 版权反馈
【摘要】:宏指令名给出该宏定义的名称,调用时就使用宏指令名来调用该宏定义。宏定义体就是一组有独立功能的程序段。宏展开就是用宏定义体取代源程序中的宏指令,而且用实元取代宏定义中的变元。另外,宏展开并用实元取代变元后,所得到的语句应该是有效的,否则汇编程序将指示出错。下面举例说明宏定义、宏调用和宏展开。

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可以看出,由于宏指令可以带变元,调用时可以用实元取代,这就避免了子程序变量传递带来的麻烦,增加了宏汇编使用的灵活性;而且实元可以是常数、寄存器单元名、存储器单元名以及用各种寻址方式能找到的地址或表达式,实元还可以是指令的操作码(助记符)或操作码的一部分,宏汇编的这一特性是子程序所没有的。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈