当前位置:文档之家› 汇编语言宏指令

汇编语言宏指令


ENDM 宏调用:
… ADD X , Y , Z
;使用宏ADD
PURGE ADD …
;使用指令ADD
当然,最后能不能达成所愿,还要具体看编译器是怎么来支持 的!
6. 宏定义的嵌套 宏定义的嵌套有两种情况:宏定义体中含宏调用;宏定义体中 含宏定义。 (1)宏定义体中宏调用 宏汇编语言允许在宏定义体中使用宏调用,但限制条件是:必 须先定义后调用。 例如: DIF MACRO X , Y ; X – Y 送 AX
??0001: …
(2) 清除宏定义的为指令PURGE
格式: PURGE 宏名表
例如:

AAA MACRO

ENDM


;宏AAA可以有效使用的区间

PURGE AAA


;宏AAA不可有效地使用

例:利用宏指令修改某些助记符意义
宏定义:
ADD MACRO OP1 , OP2 , RESULT

例如,把通过DOS的1功能调用从键盘读入一个字符的程序片 段定义为一个宏:
GETCH MACRO
MOV AH , 1 INT 21H ;从键盘键入一个字符时,该字符存入AL
ENDM
在定义宏指令后,就可以通过宏指令来表示对应的程序片段, 这成为宏调用。其格式为:
宏指令名 [实参表]
在对源程序汇编时,汇编程序把程序中的宏指令替换成对应的 宏定义体,这称为宏展开或宏扩展。如:
(2)表达式运算符 % 在宏调用时,使用该运算符把其后表达式的结果作为宏参替换,
而非表达式自身。 宏MSGGEN的定义方式如上例。 则调用 MSGGEN MSG , %(2 + 3) , ‘TOM’ 展开为:
MSG5 DB ‘HELLO MR.TOM’ , 0DH , 0AH , 24H
5. 与宏有关的伪指令 (1)局部标号说明伪指令 LOCAL 格式:LOCAL 标号表 标号表由标号构成,标号间用逗号分隔。 汇编程序在每次展开时,总把由LOCAL伪指令说明的标号用 唯一的符号(??0000至??FFFF)代替,从而避免标号重 定义错误。 例如:定义一个取绝对值的宏
SAL AL , CL 如上述代码要多次使用,就可以定义为: SHIFT MACRO
MOV CL , 4 SAL AL , CL ENDM
但是,如果每次的移位次数不同了,则可定义为: SHIFT MACRO X ;X为参数
MOV CL , X SAL AL , CL ENDM 这是,调用方式可为: SHIFT 4 ;移4位 SHIFT 6 ;移6位,显然,有参数时使用起来更灵活。 2. 宏指令的参数可以是操作码 例如:有下面的宏定义:
(2)宏定义体中定义宏指令
宏定义体中还允许包含宏定义,但是只有在调用了外围的宏后, 才能调用内层的宏。
MOV AX , X
SUB AX , Y
ENDM
DIFSQR MACRO OPR1 , OPR2 , RESULT; ( X – Y)2 送 AX
PUSH DX
PUSH AX
|
POP AX
DIF OPR1 , OPR2 ;注意堆栈 |
POP DX
IMUL AX
|
ENDM
MOV RESULT , AX
ABSOL MACRO OPER LOCAL NEXT CMP OPER , 0 JGE NEXT NEG OPER
NEXT: ENDM
宏调用 ABSOL VAR ABSOL BX
时,宏展开: … ;主程序中的代码段 … CMP VAR , 0 JGE ??0000 NEG VAR
??0000: CMP BX , 0 JGE ??0001 NEG BX
4. 两个特殊的宏运算符 (1)强迫替换运算符 & 在宏定义中,若参数在其它字符的紧前或紧后,或者参数出现 在带引号的字符串中时,就必须使用该运算符,以区分参数。 例:在下面宏指令JUMP中,参数CON作为操作码一部分。 JUMP MACRO CON , LAB
J&CON LAB ENDM 则调用时,JUMP NZ HEAR -> JNZ HEAR JUMP Z , THERE -> JZ THERE
例:在下面宏指令MSGGEN中,两个参数合并成一个标号, 一个参数用在字符串中。 MSGGEN MACRO LAB , NUM , XYZ
LAB&NUM DB ‘HELLO MR.&XYZ’ , 0DH , 0AH , 24H MSGGEN 则调用 MSGGEN MSG , 1 , TAYLOR 展开为:MSG1 DB ‘HELLO MR.TAYLOR’ , 0DH , 0AH , 24H
……
….
GETCH
对应为 --->
MOV AH , 1
……
INT 21H

尽管都实现了调用,但是宏调用和子程序的调用是有差别的:
宏调用更多地是表示一种替换!
(二)宏指令的用途 1. 缩短源代码 2. 扩充指令集 3. 更改某些指令助记符的意义 (宏指令的优先级高于指令和伪指令)
(三)宏指令中参数的使用 宏指令可以不带参数,但往往带有参数的宏指令更具灵活性。 1. 指令的参数可以是常数、寄存器和存储单元,还可以是表达 式。 例: MOV CL , 4
“SHIFT 6 , BX , AR” 或 “SHIFT 8 , SI , HR ”等等。
3. 宏调用参数个数可以与定义时不一致 正常情况下,宏调用时使用的实参个数应该与宏定义时的形参 个数一致,但汇编程序并不要求他们它们必须相等。 若实参个数多于形参个数,那么多余的实参被忽略; 若实参个数少于形参的个数,那么多余的形参用“空”代替。
参数还可以是操作码的一部分:
SHIFT MACRO X , Y , Z
MOV CL , X
S&Z Y , CL
;&起符连接作用
ENDM
调用:SHIFT 4 , AL , AL 展开为:
MOV CL , 4 ;4为参数X
SAL AL , CL ;第1个“AL”为参数Z,第2个“AL”为参数Y
该宏的调用方式还可以是:
MANDM MACRO OPR , X , Y MOV AX , X OPR AX , Y MOV X , AX
ENDM 该宏定义的意思是?????
改宏被调用和展开的时候,意义就明确了。如: MANDM MOV , [BX] , [SI] MANDM ADD , [BX] , ES:[1234H]
相关主题