(6)数字参数 在某些情况下,需要以实参符号的值而不是符号本身来替 ● 换形参,这种参数的替换称为数字参数的替换。特殊宏操 作符%用来将其后的表达式(通常是符号常数)转换成它所 代表的数值,并将此数值的ASCII码字符嵌入到宏展开中。 例题6.6 某宏定义如下: DATA1 MACRO A,B,C,D DW A,B,C DB D DUP (0) ENDM 16
(6)数字参数 在某些情况下,需要以实参符号的值而不是符号本身来替 换形参,这种参数的替换称为数字参数的替换。特殊宏操 作符%用来将其后的表达式(通常是符号常数)转换成它所 代表的数值,并将此数值的ASCII码字符嵌入到宏展开中 码字符嵌入到宏展开中。 例题6.6 某宏定义如下: DATA1 MACRO A,B,C,D DW A,B,C DB D DUP(0) ENDM 16
当有宏调用时: X=10 Y=20 DATA1 %X+2,5,%X+Y,%Y-5 DATA1 X+2,5,X+Y,Y-5 则有宏展开为: + DW12,5,30 + DB 15DUP(0) + DW X+2,5,X+Y DB Y-5 DUP(0) 比较这两个宏调用语句的展开结果,就可以明显看出数字参数与一般实 参的区别。 注意:%后的符号一定是直接用QU或等号“=”赋值的符号常量,或者汇。 编时能计算出值的表达式,而不能是变量名和寄存器名。 888 17
当有宏调用时: X = 10 = 10 Y = 20 DATAl %X+2,5,%X+Y,%Y-5 DATA1 X+2,5,X+Y,Y-5 则有宏展开为: + DW 12 + DW 12,5,30 + DB 15 DUP(0) + DW X+2,5,X+Y + DB Y-5 DUP(0) 比较这两个宏调用语句的展开结果,就可以明显看出数字参数与一般实 参的区别。 注意:%后的符号一定是直接用EQU或等号“=”赋值的符号常量,或者汇 编时能计算出值的表达式,而不能是变量名和寄存器名。 17
6.1.4宏定义中标号和变量处理 宏定义中允许使用标号和变量,但是由于一条宏指令每展 ●d 开一次,将插入一组相同的指令或伪指令,多次宏调用经 宏展开后就会出现相同标号或变量的多重定义,汇编时就 会出错。解决此问题的方法是采用伪指令LOCAL将宏定义 中出现的各个标号或变量作为形参,并安排在该伪指令的 形参表中,其中各个标号或变量用逗号分隔。汇编程序遇 到LOCAL伪指令时,将以实 参?0000、?0001、.、?FFFF替代形参表中的各个标号 或变量,从而避免标号或变量的重名。 其格式为: LOCAL<形式参数表> 说明:如使用LOCAL伪指令,则该伪指令必须是宏定义中的第一条 指令。 ●● ●8 18
6.1.4 宏定义中标号和变量处理 宏定义中标号和变量处理 宏定义中允许使用标号和变量,但是由于一条宏指令每展 开一次,将插入一组相同的指令或伪指令,多次宏调用经 宏展开后就会出现相同标号或变量的多重定义,汇编时就 会出错。解决此问题的方法是采用伪指令LOCAL将宏定义 中出现的各个标号或变量作为形参,并安排在该伪指令的 形参表中,其中各个标号或变量用逗号分隔。汇编程序遇 到LOCAL伪指令时,将以实 参??0000、??0001、…、??FFFF替代形参表中的各个标号 或变量,从而避免标号或变量的重名。 其格式为: LOCAL <形式参数表> 说明:如使用LOCAL伪指令,则该伪指令必须是宏定义中的第一条 指令。 18
例题6.7定义取绝对值的宏指令。 ABS MACRO OPS LOCAL NEXT ;定义NEXT为形参 CMP 0PS,0 JGE NEXT NEG OPS NeXT: MOV AX, OPS ;若无LOCAL说明,宏展开后将出现标号重名 ENDM 当有宏调用: ABS CX MOV BX,AX ABS DX 经宏展开后的指令为: + CMP CX,0 + JGE ??0000 + NEG CX +?0000:M0VAX,CX MOV BX,AX + CMP DX,0 + JGE ??0001 + NEG DX +??0001:M0VAX,DX 19
例题6.7 定义取绝对值的宏指令。 ABS MACRO OPS ABS MACRO OPS LOCAL NEXT ;定义NEXT为形参 CMP OPS,0 JGE NEXT NEXT NEG OPS NEXT: MOV AX,OPS ;若无LOCAL说明,宏展开后将出现标号重名 ENDM 当有宏调用: ABS CX MOV BX,AX ABS DX DX 经宏展开后的指令为: + CMP CX,O + JGE JGE ??0000 + NEG CX +??0000:MOV AX,CX MOV BX BX,AX + CMP DX,O + JGE ??0001 + NEG DX + NEG DX +??0001: MOV AX,DX 19
6.1.5取消宏定义伪指令PURGE 宏名可以与指令名或伪指令名相同,且宏名的优先级别高,。 此时与其同名的指令和伪指令将失去作用。为了恢复指令 助记符和伪指令助记符的功能,就必须将宏取消,可用 PURGE伪指令实现此功能。其格式为: PURGE<宏名>[,<宏名>.] 作用:取消已经定义的宏,选用任选项时可同时取消多个宏。 例题6.8取消例6.4和例6.7定义的宏指令 PURGE MSTRING,ABS 20
6.1.5 取消宏定义伪指令PURGE 宏名可以与指令名或伪指令名相同,且宏名的优先级别高, 此时与其同名的指令和伪指令将失去作用 。为了恢复指令 助记符和伪指令助记符的功能,就必须将宏取消,可用 PURGE伪指令实现此功能 。其格式为: PURGE <宏名> [, <宏名> … ] 作用:取消已经定义的宏,选用任选项时可同时取消多个宏。 例题6.8 取消例6.4和例6.7定义的宏指令 PURGE MSTRING,ABS 20