9.3.与宏有关的伪指令

在宏定义时,为了满足某种特殊需要,汇编语言还提供了几个伪指令。

9.3.1 局部标号伪指令LOCAL

在宏定义体中,如果存在标号,则该标号要用伪指令LOCAL说明为局部标号,否则,当在源程序中,有多于一次引用该宏时,汇编程序在进行宏扩展后将会给出:标号重复定义的错误。

伪指令LOCAL的一般格式如下:

LOCAL 标号1, 标号2, ……

伪指令LOCAL必须是伪指令MACRO后的第一条语句,并且在MACRO和LOCAL之间也不允许有注释和分号标志。

汇编程序在每次进行宏扩展时,总是把由LOCAL说明的标号用一个唯一的符号(从??0000到??FFFF)来代替,从而避免标号重定义的错误。

例9.7 编写求一个求绝对值的宏。

解:

方法1:

ABS MACRO word1

CMP word1, 0

JGE next

NEG word1

next:

ENDM

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

假设对宏ABS有以下两次引用,点击它们将会显示汇编程序对它们进行宏扩展后所得到程序片段:

ABS  BX

ABS  AL

在上述程序片段中,显然标号next定义了二次,所以,汇编程序将显示“标号重复定义”的错误信息。为了避免这种情况的发生,我们需要用下面的方法来定义该宏。

方法2:

ABS MACRO word1

LOCAL next

CMP word1, 0

JGE next

NEG word1

next:

ENDM

假设对宏ABS有以下两次引用,点击它们将会显示汇编程序对它们进行宏扩展时所得到程序片段:

ABS  BX 

ABS  AL

在上述程序片段中,宏体内部的局部标号next分别用符号??0000和??0001来对应它的二次引用。因此,汇编程序不会再显示“标号重复定义”的错误信息。

伪指令LOCAL在子程序中也可起作用(参见7.5.10节),但它的作用与宏定义的作用是不同的,有关该伪指令在子程序的宏定义中功能的主要差异如表9.1所列。

表9.1 伪指令LOCAL在子程序和宏中的比较

在子程序中 在宏定义中

语句的位置 在所有指令之前 在所有指令之前

伪指令的作用 说明局部变量 说明局部标号

伪指令的格式 可用一条伪指令来说明多个局部变量,也可连续用多条伪指令来说明 可用一条伪指令来说明多个局部标号,也可连续用多条伪指令来说明

调用或引用 子程序的不同调用,其局部变量名保存不变 在每次宏引用的扩展时,将会自动产生出一个唯一的局部标号

9.3.2 取消宏定义伪指令

伪指令PURGE的一般格式如下:

PURGE 宏名1, 宏名2, ……

该伪指令通知汇编程序取消“宏名1, 宏名2, ……”宏名表中的宏定义。在此语句后,如果还有这些宏的引用语句,则汇编程序不会把它们当作宏引用来进行扩展,并且还将显示出错信息。

伪指令PURGE的使用频率较低。

9.3.3 中止宏扩展伪指令

伪指令EXITM的一般格式如下:

EXITM

该伪指令书写在宏定义体中,用来告诉汇编程序:如果遇到该伪指令,那么,立即中止对该伪指令之下语句的扩展。如果在嵌套的内层宏中遇到了该伪指令,则退出到宏嵌套的外层。

在一般情况下,伪指令EXITM与条件伪指令一起使用,以便在不同的条件下挑选出不同的语句。

伪指令EXITM的使用频率也很低。

 

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
flybbbby的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容