前面介绍的"子程序结构"使我们了解到使用它的一些优越之处:
  提供模块化程序设计的条件,便于程序调试及维护等。编程效率高,可以节省存储空间及程序设计所花的时间。

  但使用子程序也有一些不足:
  增加了一些额外开销,包括转子及返回、保存及恢复寄存器现场以及参数的传送等。

  在某些条件下,如子程序本身较短或者需要传送的参数较多,使用宏汇编就更加方便、有效。

 
7.1.1 宏定义、宏调用和宏展开
  
  源程序中一段有独立功能的程序代码组成宏。它只需定义一次,就可以用一条宏指令多次调用它。
  宏定义用一组伪操作来实现。
  格式:


  宏定义名 MACRO [ 哑元表 ]
         .
         .(宏定义体)
         .
        ENDM


  其中MACRO和ENDM是一对伪操作。这对伪操作之间是宏定义体(包含一组有独立功能的程序代码)。宏定义名给出该宏定义的名称,调用时就使用宏定义名来调用该宏定义。宏定义名的第一个符号必须是字母,其后可以跟字母、数字或下划线字符。其中哑元表给出了宏定义中所用到的形式参数(或称虚参),每个哑元之间用逗号隔开。

  对宏定义的调用称为宏调用,由一条宏指令实现。
  格式:

  
宏定义名    [ 实元表 ]

  实元表中的每一项为实元,相互之间用逗号隔开。

  当源程序被汇编时,汇编程序对每个宏调用作宏展开。
 
  宏展开就是用宏定义体取代源程序中的宏指令,而且用实元取代宏定义中的哑元。

  取代时实元和哑元应该一一对应,即第一个实元取代第一个哑元,第二个实元取代第二个哑元……依次类推。

  一般说来,实元的个数和哑元的个数相等,但汇编程序并不要求它们必须相等。若实元个数大于哑元个数,则多余的实元不予考虑;若实元个数小于哑元个数,则多余的哑元作"空"处理。

  另外需要注意的是,宏展开后,即用实元取代哑元后,所得到的语句应该是有效的,即汇编语法应是正确的,否则汇编程序将会指示出错。

  下面我们用一个例子来说明宏定义、宏调用和宏展开的情况。