在汇编语言程序设计过程中,可以将具有一定功能,需多次重复使用,且比较短的程序段定义成一条宏指令。
使用宏指令语句可以减少程序书写错误,缩短源程序长度,使源程序编写像高级语言一样清晰、简洁。特别是使用宏库后,可以提高编程效率。
7.2 宏指令的使用过程
1.宏定义
(1)带参宏定义
宏指令名 MACRO 形参1,形参2,……
宏体
ENDM
(2)无参宏定义
宏指令 MACRO
宏体
ENDM
2.宏调用
格式:
宏指令名 [实参1,实参2,……]
例如:对上面的宏定义的三种调用形式为:
┆
PRINT BUF1
┆
PRINT BUF2
┆
PRINT BUF3
┆
3.宏扩展
例如:上面三次宏调用,其展开的形式为:
┆
+ LEA DX,BUF1
+ MOV AH,9
+ INT 21H
┆
+ LEA DX,BUF2
+ MOV AH,9
+ INT 21H
┆
+ LEA DX,BUF3
+ MOV AH,9
+ INT 21H
┆
7.3 宏操作符
1.文本操作符
【例4.19】在程序中定义大小及初值不同的堆栈段。
可用如下宏定义:
DSTACK MACRO A
STACK SEGMENT STACK
DB A
STACK ENDS
ENDM
【例4.20】表达符操作%示例。
DATA1 MACRO A, B, C, D
DW A, B, C
DB D DUP(0)
ENDM
如果宏调用为:
X=10
Y=20
DATA1 %X+2, 5,%X+Y, %Y-5
DATA1 X+2, 5, X+Y, Y-5
则相应的宏扩展为:
+ DW 12, 5, 30
+ DB 15 DUP(0)
+ DW X+2, 5, X+Y
+ DB Y-5 DUP (0)
7.4 局部符号伪指令LOCAL
【例4.21】局部符号伪指令LOCAL应用。
SUM MACRO X,Y
LOCAL L
MOV CX,X
MOV BX,Y
MOV AX,0
L: ADD AX,BX
INC BX
LOOP L
ENDM
如果两次调用宏指令如下:
┆
SUM 100,1
┆
SUM 50,1
┆
则宏扩展形式为:
┆
MOV CX,100
MOV BX,1
MOV AX,0
??0000: ADD AX,BX
INC BX
LOOP ??0000
┆
MOV CX,50
MOV BX,10
MOV AX,0
??0001: ADD AX,BX
INC BX
LOOP ??0001
┆
7.5 宏库的使用
语句格式:INCLUDE 库文件名
假设已建立一名为MACRO.LIB的宏库,其内容如下:
INPUT MACRO A
LEA DX,A
MOV AH,10 ;10号系统功能调用
INT 21H
ENDM
PRINT MACRO A
LEA DX,A
MOV AH,9 ;9号系统功能调用
INT 21H
ENDM
RETURN MACRO
MOV AH,2
MOV DL,0AH
INT 21H
MOV DL,0DH ;回车换行
INT 21H
ENDM
OUT2 MACRO A
MOV DL,A
MOV AH,2 ;2号系统功能调用
INT 21H
ENDM
STACK0 MACRO A
STACK SEGMENT STACK
DB A
STACK ENDS
ENDM
现要从键盘输入一串字符到系统缓冲区,然后将字符按相反顺序打印,采用调用宏库的办法,其程序如下:
INCLUDE MACRO.LIB
STACK0 〈200 DUP (0) 〉 ;定义堆栈段
DATA SEGMENT
INF01 DB ‘INPUT STRING:$’
INF02 DB ‘OUTPUT STRING:$’
BUFA DB 81
DB ?
DB 80 DUP(0)
BUFB DB 81 DUP(0)
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE
START: MOV AX,DATA
MOV DS,AX
RETURN ;输出回车换行
PRINT INFO1 ;输出字符变量INFO1 代表的字符串
INPUT BUFA ;键盘输入字符中到缓冲区;
LEA SI,BUFA+1
MOV CH,0
MOV CL,[SI]
ADD SI,CX
LEA DI,BUFB
NEXT: MOV AL,[SI]
MOV [DI],AL
DEC SI
INC DI
LOOP NEXT
MOV BYTE PTR [DI],‘$’
RETURN ;输出回车换行
PRINT INF02 ;输出的字符串变量INF02代表
PRINT BUFB ;反向输出输入字符串
MOV AH,4CH
INT 21H
CODE ENDS
END START
7.6 重复汇编
1.给定次数的重复汇编伪指令
语句格式:REPT 表达式
重复块
ENDM
功能:宏汇编程序将重复块连续地汇编表达式给定的次数。
2.不定次数的重复汇编伪指令,有IRP和IRPC两种伪指令。
【例4.22】某一源程序需要多次将AX,BX,CX,DX寄存器的内容压入堆栈,则可定义如下宏指令。
PUSHR MACRO
IRP REG,〈AX,BX,CX,DX〉
PUSH REG
ENDM
ENDM
调用上述宏定义后,将展开成下列语句:
+ PUSH AX
+ PUSH BX
+ PUSH CX
+ PUSH DX
又如:
IR PW,〈1122H,3344H,5566H,7788H〉
DW W
ENDM
汇编程序在汇编时将产生语句:
+ DW 1122H,3344H,5566H,7788H。
(2)IRPC
语句格式:IRPC 形参,字符串
重复块
ENDM
7.7 条件汇编
条件汇编指在汇编期间,宏汇编程序根据条件是否成立决定具体汇编哪一程序段。条件汇编用条件汇编伪指令来定义。如表4.1所示。
语句格式:IF ×× 表达式
条件块1
[ELSE
条件块2]
ENDIF

【例4.25】试用条件汇编编写一宏定义,能完成多种DOS系统功能调用。
源程序如下:
DOSYS MACRO N,BUF
IFE N
EXITM
ENDIF
IFDEF BUF
LEA DX,BUF
MOV AH,N
INT 21H
ELSE
MOV AH,N
INT 21H
ENDIF
ENDM
;…………………………
DATA SEGMENT
MSG DB ‘INPUT STRING:$’
BUF DB 81,0,80 DUP(0)
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE,SS:STACK
BEGIN: MOV AX,DATA
MOV DS,AX
DOSYS 9,MSG
DOSYS 10 ,BUF
DOSYS 4CH
CODE ENDS
END START
则以上三条宏指令展开后的语句为:
┆
+ LEA DX,MSG
+ MOV AH,9
+ INT 21H
+ LEA DX,BUF
+ MOV AH,10
+ INT 21H
+ MOV AH,4CH
+ INT 21H
┆


