6. 与宏有关的伪指令
(1) 局部变量说明伪指令 LOCAL
伪指令LOCAL的一般格式如下:
LOCAL 标号表
标号表由标号构成,标号间用逗号分隔开
汇编程序在每次展开宏时,总把由LOCAL伪指令说明的标号用唯一的符号(??0000~??0001)代替,从而避免标号重复定义错误
HTOASM MACRO
LOCAL ISDECM
AND AL, 0FH
CMP AL, 9
JBE ISDECM
ADD AL, 7
ISDECM : ADD AL, 30H
ENDM
如果在程序中有以下宏调用
…
HTOASM
…
HTOASM
得到汇展开
+ ADN AL, 0FH
+ CMP AL, 9
+ JBE ??0000
+ AND AL, 7
+ ??0000 : ADD AL, 30H
…
+ AND AL, 0FH
+ CMP AL, 9
+ JBE ??0001
+ AND AL, 7
+ ??0001: ADD AL, 30H
…
例: 如果一个数是负数,求出对应正数
ABSOL MACRO OPER
LOCAL NEXT
CMP OPER 0
JGE NEXT
NEG OPER
NEXT: ENDM
宏调用与展开:
ABSOL VAR
+ CMP VAR, 0
+ JGE ??0000
+ NEG VAR
+ ??0000 :
…
ABSOL BX
+ CMP BX, 0
+ JGE ??0001
+ NEG BX
+ ??0001:
…
(2) 清除宏定义的伪指令 PURGE
伪指令PURGE的作用是告诉汇编程序取消某些宏指令。其格式为
PURGE 宏名表
(3) 中止宏扩展的伪指令 EXITM
伪指令EXITM通知汇编程序结束当前宏调用的扩展,一般格式为EXITM
当遇到伪指令EXITM时,汇编程序立即退出宏, 在宏中剩下的语句不被扩展。如果在一些嵌套宏中遇到EXITM, 则退出到外部宏
伪指令EXITM通常与条件伪指令一起使用,以便在规定的条件下跳过宏的最后语句
7. 宏定义的嵌套
宏定义的嵌套有两种情况,一种是宏定义体中含宏调用, 一种是宏定义体中含宏定义
(1) 宏定义体中含宏调用
宏汇编语言允许在宏定义体中使用宏调用。限制条件是必须先定义后调用。
例:
WHTOASC MACRO
MOV AH, AL
SHR AL, 1
SHR AL, 1
SHR AL, 1
SHR AL, 1
HTOASC
XCHG AH, AL
HTOASC
ENDM
HTOASC MACRO
AND AL, 0FH
ADD AL, 90H
DAA
ADC AL, 40H
DAA
ENDM
如果在程序中调用上述宏, 可以得到宏扩展
+ MOV AH, AL
+ SHR AL, 1
+ SHR AL, 1
+ SHR AL, 1
+ SHR AL, 1
++ AND AL, 0FH
++ ADD AL, 90H
++ DAA
++ ADC AL, 40H
++ DAA
+ XCHG AH, AL
++ AND AL, 0FH
++ ADD AL, 90H
++ DAA
++ ADC AL, 40H
++ DAA
(2) 宏定义体中含有宏定义
宏定义体中可以含有宏定义。但只有在调用了外层的宏后,才能调用内层的宏
例:
DEFMAC MACRO MACNAME, OPER
MACNAME MACRO X, Y, Z
PUSH AX
MOV AX, X
OPER AX, Y
MOV Z, AX
POP AX
ENDM
ENDM
宏调用:
DEFMAC ADDITION, ADD
+ ADDICTION MACRO X, Y, Z
+ PUSH AX
+ MOV AX, X
+ ADD AX, Y
+ MOV Z, AX
+ POP AX
在调用DEFMAC后,可以调用宏ADDITION