宏定义与宏指令的使用示例

2008-10-22     作者:        编辑:齐瑞瑞   点击进入论坛

  题目要求:利用宏定义,将VAR1字单元的内容传送到VAR2字单元。

  程序清单:

  DATA SEGMENT ;这是数据段

  VAR1 DW 0BDH

  VAR2 DW ?

  DATA ENDS ;数据段到此结束

  CODE SEGMENT ;这是代码段

  ASSUME CS:CODE,DS:DATA

  START:MOV AX,DATA

  MOV DS,AX

  HZL VAR1,VAR2 ;宏调用,两个实元

  MOV AH,4CH

  INT 21H

  HZL MACRO OPR1,OPR2,OPR3 ;宏定义,三个变元

  PUSH AX

  PUSH BX

  MOV AX,OPR1

  LEA BX,OPR2

  MOV OPR3[BX],AX

  POP BX

  POP AX

  ENDM ;宏定义结束

  CODE ENDS ;代码段到此结束

  END START

  程序说明:

  这里,利用伪指令 MACRO-ENDM 定义了一个名为 HZL 的宏,它需要3个形参:OPR1,OPR2和OPR3。在该程序中,出现宏指令“HZL VAR1,VAR2”,它是对 HZL 宏的调用。经汇编后,展开和替换的结果如下(其余的指令没变,所以没有列出):

  + PUSH AX

  + PUSH BX

  + MOV AX,VAR1

  + LEA BX,VAR2

  + MOV [BX],AX

  + POP BX

  + POP AX

  指令前冠以加号“+”(也可能是别的符号)只是表明区别,没有其他含义。要注意的是,本例的宏定义有三个变元,但是宏调用中只给出两个实元。汇编程序进行展开时,用VAR1替换OPR1,VAR2替换OPR2,把第三个参数OPR3当作“空”处理。由于参数之间是一一对应做替换,所以在设计宏定义时,要特别留意作为“空”处理后,所得到的语句是否有效,否则汇编程序会指示出错。

  在宏的应用中,实元可以是常数、寄存器、存储器单元名以及用各种寻址方式能找到的地址或表达式,也可以是指令的操作码(助记符)或操作码的一部分。如果在宏定义体中使用了标号,那么标号也属于变元之列,同样需要用实元去替换。否则如果源程序中出现两次以上的调用时,会出现相同的标号名,汇编程序就会认为出错。因为在同一个源程序中,标号名是惟一的。

  从上面的例中可以看出,汇编程序对宏指令的处理是将宏定义体的程序段一条不少地插入到宏指令调用处,替换掉原来的宏指令。它并没有简化目标程序,也就是说没有节省内存。所以,宏应用只是简化了源程序的书写,代替了一般编辑程序的复制、粘贴和替换的功能。另外,从例中还可以看出,宏定义和宏调用在源程序中出现的先后位置是没有关系的,汇编程序会自动加以识别。

寻找产品:
姓       名: 电   话:
公       司: E-mail:
描       述: