1
本章学习要点
1,掌握宏汇编的基本概念
2,理解宏定义、宏调用、宏展开的特点和
使用过程
3,了解重复汇编的基本概念和使用
4,了解条件汇编的基本概念和使用
第 8章 高级汇编技术
2
? 什么是宏?
宏(或宏指令)是源程序中一段有独立功能
的程序代码,只需定义一次,可以多次调用。
? 为什么使用宏汇编?
在编制汇编语言程序过程中,有些功能程序
段需要多次重复使用,所不同的只是参与操作的
操作数。
为了减少编程的工作量,通常采用两种方法,
①将程序段编写为独立的子程序
② 将 程序段定义成宏
第 8章 高级汇编技术
3
8.1 宏汇编
8.2 重复汇编
返回
第 8章 高级汇编技术
退出
4
8.1 宏汇编
8.1.1 宏定义、宏调用和宏展开
8.1.2 形参和实参
8.1.3 伪指令 PURGE
返 回
8.1.4 伪指令 LOCAL
退 出
5
8.1.1 宏定义、宏调用和宏展开
1.宏定义
用伪指令 MACRO/ENDM实现,其语句格式是,
宏指令名 MACRO [形参 1,形参 2,…,形参 n]
┇ 宏体
ENDM
例如, BCD码和 ASCII码之间的转换, 可 将 AL
中的内容左移或右移定义成宏指令 。
7
8.1.1 宏定义、宏调用和宏展开
假设左移 4位,
SHIFT MACRO
MOV CL,4
SAL AL,CL
ENDM
2.宏调用
宏调用的格式为,
宏指令名 [实参 1,实参 2,…,实参 n]
8
8.1.1 宏定义、宏调用和宏展开
对于上例的宏定义,编程时宏调用语句为

SHIFT

3,宏展开
宏展开将宏指令语句用宏定义中宏体的程序
段目标代码替换。汇编源程序时,宏汇编程序
将对每条宏指令语句进行宏展开,用实参替代
相应的形参,对宏体目标代码作相应改变。
9
8.1.1 宏定义、宏调用和宏展开
例 8.1 将两个用压缩的 BCD码表示的 4位十进制数
相加,结果存入 RESULT单元中 。;对两数相加功能进行宏定义
BCDADD MACRO VARX,VARY,RESULT
MOV AL,VARX
ADD AL,VARY
DAA ;低位相加, 调整
MOV RESULT,AL
MOV AL,VARX+ 1
ADC AL,VARY+ 1
DAA ;高位相加, 调整
MOV RESULT+ 1,AL
10
8.1.1 宏定义、宏调用和宏展开
ENDM
DATA SEGMENT
A1 DB 30H,11H
A2 DB 79H,47H
A3 DB 2 DUP(? )
B1 DB 32H,23H
B2 DB 71H,62H
B3 DB 2 DUP(? )
DATA ENDS
CODE SEGMENT
ASSUME CS,CODE,DS,DATA
START:PUSH DS
MOV AX,0
PUSH AX
11
8.1.1 宏定义、宏调用和宏展开
MOV AX,DATA
MOV DS,AX
BCDADD A1,A2,A3 ;宏调用
BCDADD B1,B2,B3 ;再次宏调用
RET
CODE ENDS
END START
经宏展开后,
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
+ MOV AL,A1
12
8.1.1 宏定义、宏调用和宏展开
+ ADD AL,A2
+ DAA ;低位相加, 调整
+ MOV A3,AL
+ MOV AL,A1+ 1
+ ADC AL,A2+ 1
+ DAA ;高位相加, 调整
+ MOV A3+ 1,AL
+ ;对两数相加功能进行宏定义
+ MOV AL,B1
+ ADD AL,B2
+ DAA ;低位相加, 调整
+ MOV B3,AL
+ MOV AL,B1+ 1
+ ADC AL,B2+ 1
13
8.1.1 宏定义、宏调用和宏展开
+ DAA ;高位相加, 调整
+ MOV B3+ 1,AL
? 宏汇编程序在所展开的指令前标识以 ‘ + ’
号以示区别 。
? 宏定义允许嵌套 。 在宏定义中可以使用宏调
用, 但必须先定义这个宏调用 。
例 8.3 有宏定义如下,
DIFML MACRO OPRAND,OPRAT
OPRAND MACRO X,Y,Z
PUSH AX
MOV AX,X
OPRAT AX,Y
MOV Z,AX
POP AX
14
8.1.1 宏定义、宏调用和宏展开
ENDM
ENDM
对宏定义 DIFML进行宏调用,
DIFML ADDITION,ADD
经宏展开,
+ ADDITION MACRO X,Y,Z
PUSH AX
MOV AX,X
ADD AX,Y
MOV Z,AX
POP AX
ENDM
为实现对 ADDITION的调用,需要连续两条宏调用语句,
DIFML ADDITION,ADD
ADDITION N1,N2,N3
15
8.1.2 形参和实参
? 宏定义中可以不带任何形参,宏调用时不需提
供实参(即使有实参,也会不予处理),宏展
开后宏体中的所有指令不作修改原样插入到宏
调用的宏指令处。如 例 8.4。
? 形参可以是操作码或操作数的一部分,但在宏
定义体中必须使用分隔符 &,即 &是操作符,在
宏定义中可作为形参的前缀,展开时把 &前后
的两个符号连接起来,形成操作码, 操作数或
字符串。 &只能出现在宏定义中。 如 例 8.6。
16
8.1.2 形参和实参
? 在宏定义中,形参可以出现在宏体的任何位置,
可以是操作码或操作数。 如 例 8.3中 OPRAT。
? 伪操作 %不能出现在形参的前面,通常用在宏
调用中,将跟在它后面的表达式的值转换成以
当前基数下的数,在宏展开时,用转换后的值
代替形参。 如 例 8.8。
? 在宏调用中的实参如果自身是带有间隔符(如
逗号、空格),必须使用文本操作符 〈〉 将它
括起来,作为单一的完整的实参。 如 例 8.9。
22
8.1.3 伪指令 PURGE
宏指令名可以和源程序中的其他变量名, 标号, 指
令助记符, 伪操作名相同, 此时宏指令的优先级别最高,
使其他同名的指令或伪操作无效 。 为了使这些指令或伪
指令恢复功能, 服从机器指令的定义, 宏汇编程序提供
了伪操作 PURGE,用来在适当的时候取消宏定义 。
PURGE伪指令的一般格式是,
PURGE 宏定义名 [,… ]
方括号表示 PURGE可以取消多个宏定义, 宏名之间用逗
号隔开 。 如 宏定义,
SUB MACRO VARX,VARY,RESULT

ENDM
宏调用,SUB X,Y,Z
PURGE SUB
“PURGE SUB”语句后的 SUB恢复减法功能 。
23
8.1.4 伪指令 LOCAL
宏定义体内可以使用标号 。 对于使用了标号的
宏定义, 若多次调用, 势必产生标号的多重定义,
汇编时出错 。 解决这一问题可使用伪指令 LOCAL,
其一般格式为,
LOCAL 局部标号 1,局部标号 2,…
宏汇编程序将为标号分别生成格式为,??
XXXX”的唯一的符号以代替各局部标号 。 XXXX代
表四位十六进制数 0000~ FFFF。 这样, 在汇编源程
序中, 避免了多次宏调用时生成的标号重复 。
?注意,LOCAL伪操作只能用在宏定义体内, 而且必
须是 MACRO伪操作后的第一个语句, 在 MACRO与
LOCAL不能出现注释和分号标志 。
24
8.1.4 伪指令 LOCAL
例 8.10 定义取绝对值的宏指令如下,
ABS MACRO OPS
LOCAL PLUS
CMP OPS,0
JGE PLUS
NEG OPS
PLUS,MOV AX,OPS
ENDM
宏调用,
ABS CX
MOV BX,AX
ABS DX
25
8.1.4 伪指令 LOCAL
宏展开后的指令为,
+ CMP CX,0
+ JGE?? 0000
+ NEG CX
+?? 0000,MOV AX,CX
MOV BX,AX
+ CMP DX,0
+ JGE?? 0001
+ NEG DX
+?? 0001,MOV AX,DX
26
8.2 重复汇编
8.2.1 定重复伪指令 REPT
8.2.2 不定重复伪指令 IRP
8.2.3 不定重复字符伪指令 IRPC
退 出 返 回
27
8.2.1 定重复伪指令 REPT
其一般格式为,
REPT 表达式
┇ ( 重复块 )
ENDM
其中,REPT和 ENDM必须成对出现,两者间的重
复块是要重复汇编的部分。表达式的值用来表示重
复块的重复汇编次数。定重复伪操作不一定要用在
宏定义体内。
28
8.2.1 定重复伪指令 REPT
例 8.11 有下列语句,
NUM=0
REPT 10
NUM=NUM+ 1
DB NUM
ENDM
汇编后,将数据 1,2,3,…, 10分配给十个连续
的字节单元,
+ DB 1
+ DB 2
+ DB 3

+ DB 10
29
8.2.2 不定重复伪指令 IRP
其一般格式为,
IRP 形参,〈 参数 1,参数 2,…〉
┇ (重复块)
ENDM
此伪指令重复执行重复块中所包含的语句,重
复的次数由参数表中的参数个数决定。重复汇编时,
依次用参数表中的参数取代形参,直到表中的参数
用完为止。参数表中的参数必须用两个三角号括起
来,参数可以是常数、符号、字符串等,各参数间
用逗号隔开。
30
8.2.2 不定重复伪指令 IRP
例 8.13 多次将 AX,BX,CX,DX寄存器内容压栈,
宏定义如下,
PUSHR MACRO
IRP REG,〈 AX,BX,CX,DX〉
PUSH REG
ENDM
ENDM
汇编后,
+ PUSH AX
+ PUSH BX
+ PUSH CX
+ PUSH DX
31
8.2.3 不定重复字符伪指令 IRPC
其语句格式为,
IRPC 形参, 字符串 ( 或 〈 字符串 〉 )
┇ ( 重复块 )
ENDM
此伪指令重复执行重复块中的语句, 重复汇编
的次数等于字符串中字符的个数 。 每次重复执行时,
依次用字符串中的一个字符取代形参, 直到字符串
结束 。 可见 IRPC伪指令与 IRP伪指令类似, 只是
IRPC用字符串 ( 其三角括号可以有也可以无 ) 代替
了 IRP伪指令中的参数表 。
32
8.2.3 不定重复字符伪指令 IRPC
例 8.15 如例 8.13可用 IRPC实现,
PUSHR MACRO
IRPC REG,ABCD
PUSH REG&X
ENDM
ENDM
同样, 汇编后也可得到,
+ PUSH AX
+ PUSH BX
+ PUSH CX
+ PUSH DX
33
本 章 小 结
本章主要介绍了高级汇编技术中的宏汇
编 。 在编写源程序的过程中, 使用宏汇编和
使用子程序一样, 都能减少程序员的工作量,
因而也能减少程序出错的可能性 。 本章阐述
了两者间的区别 。 对于宏指令, 应该掌握宏
定义和宏调用, 明确宏展开的形式, 理解参
数的传递, 并能正确地使用参数 。 另外, 还
应掌握一些常见的伪指令和常用的宏操作符
及其正确使用 。 掌握并能够应用相应的重复
汇编伪指令 。
34
Thank you very much !
本章到此结束,
谢谢您的光临!