汇编学习笔记46

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

posted @ 2011-01-22 09:21  杨海龙  阅读(363)  评论(0编辑  收藏  举报