宏结构程序设计宏汇编重复汇编条件汇编
—— 统称宏结构宏( Macro)是汇编语言的一个特点,它是与子程序类似又独具特色的另一种简化源程序的方法第一章 基础知识第七章 高级汇编语言技术宏 —— 具有宏名的一段汇编语句序列
—— 宏定义 时书写宏指令 —— 这段汇编语句序列的缩写
—— 宏调用 时书写宏展开 —— 宏指令处用这段宏代替的过程
—— 宏汇编 时实现宏的参数 功能强大,颇具特色配合宏,还有 宏操作符 和有关伪指令宏汇编第一章 基础知识第七章 高级汇编语言技术其中哑元表给出了宏定义中所用到的形式参数
(或称虚参 ),每个哑元之间用逗号隔开第一章 基础知识第七章 高级汇编语言技术第一章 基础知识第七章 高级汇编语言技术第一章 基础知识第七章 高级汇编语言技术第一章 基础知识第七章 高级汇编语言技术第一章 基础知识第七章 高级汇编语言技术变元是操作码的一部分,必须用‘ &’符号作为分隔符第一章 基础知识第七章 高级汇编语言技术
&是一个操作符,它在宏定义体中可以作为哑元的前缀,展开时可以把 &前后两个符号合并而形成一个符号,这个符号可以是操作码、操作数或是一个字符串。下面两个例子进一步具体说明这个问题。
第一章 基础知识第七章 高级汇编语言技术第一章 基础知识第七章 高级汇编语言技术第一章 基础知识第七章 高级汇编语言技术注意,如果程序中多次调用该宏定义时,展开后台出现标号的多重定义,
这是不能允许的。汇编程序对 LOCAL伪操作的局部标号表中的每一个局部标号建立唯一的符号 (用?? 0000一??
FFFF)以代替在展开中存在的每个局部标号。必需注意,LOCAL伪操作只能用在宏定义体内,而且必须是 MACRO伪操作后的第一语句,在 MACRO和 LOCAL之间不允许有注释和分号标志。
第一章 基础知识第七章 高级汇编语言技术第一章 基础知识第七章 高级汇编语言技术第一章 基础知识第七章 高级汇编语言技术第一章 基础知识第七章 高级汇编语言技术汇编程序把跟在%之后的表达式的值转换成当前基数下的数,
在展开期间,用这个数来取代哑元。
宏操作符总结;;—— 宏注释符,用于表示在宏定义中的注释。采用这个符号的注释,
在宏展开时不出现
&—— 替换操作符,用于将参数与其他字符分开。如果参数紧接在其他字符之前或之后,或者参数出现在带引号的字符串中,就必须使用该伪操作符;宏定义
dstring macro string
db ’&string&’,0dh,0ah,’$’
endm;宏调用
dstring < This is a example,>
dstring < 0 !< Number !< 10 >;宏展开
1 db ’This is a example.’,0dh,0ah,’$’
1 db ’0 < Number < 10’,0dh,0ah,’$’
转义注释符传递注释符与宏有关 的伪指令
局部标号伪指令
LOCAL 标号列表宏定义体采用了标号,应使用 LOCAL加以说明它必须是宏定义 MACRO语句之后的第一条语句
宏定义删除伪指令
PURGE 宏名表不需要某个宏定义时,可以把它删除
宏定义退出伪指令
EXITM
伪指令 EXITM表示结束当前宏调用的展开第一章 基础知识第七章 高级汇编语言技术第一章 基础知识第七章 高级汇编语言技术第一章 基础知识第七章 高级汇编语言技术第一章 基础知识第七章 高级汇编语言技术例 要求建立一个 100D字的数组,其中每个字的内容是下一个字的地址,而最后一个字的内容是第一个字的地址 。
ARRAY LABEL WORD
REPT 99
DW $+2
ENDM
DW ARRAY
第一章 基础知识第七章 高级汇编语言技术重复次数由自变量表中的自变量个数来确定。自变量表必须用尖括号括起,
它可以是常数、符号、字符串等第一章 基础知识第七章 高级汇编语言技术第一章 基础知识第七章 高级汇编语言技术第一章 基础知识第七章 高级汇编语言技术第一章 基础知识第七章 高级汇编语言技术第一章 基础知识第七章 高级汇编语言技术例 宏指令 GOTO L,X,REL,Y(其中 REL可以是 Z,NZ,L,NL等 )可以根据不同情况产生无条件转移指令或比较和条件转移指令 。
宏定义,
第一章 基础知识第七章 高级汇编语言技术例 宏定义可允许递归调用,此时条件伪操作可用来结束宏递归 。
宏指令 POWER可以用来实现 X和 2N相乘 。 这只需对 X左移 N次即可实现,
可以设 COUNT为递归次数的计数值,当该数与 N相等时就可结束遇归调用 。
宏定义:
宏结构的作用宏汇编、重复汇编和条件汇编为源程序的编写提供了很多方便,
灵活运用它们可以编写出非常良好的源程序来汇编系统中有些以圆点起始的伪指令(如,startup,.exit等)
实际上是一种宏结构
dstring MACRO string ;;定义字符串
db '&string&',0dh,0ah,'$'
ENDM
mainbegin MACRO dsseg ;;设置数据段地址
mov ax,dsseg
mov ds,ax
ENDM
dispmsg MACRO message
mov dx,offset message
mov ah,09h
int 21h
ENDM
例题
mainend MACRO retnum ;;返回 DOS,可不带参数
ifb <retnum>
mov ah,4ch ;;没有参数
else
mov ax,4c00h+(retnum AND 0ffh);; 有参数
endif
int 21h
ENDM
例题
.model small
.stack 256
.data
msg1 equ this byte
dstring <Hello,Everybody !!>
msg2 equ this byte
dstring <You see,I made it.>
.code
start,mainbegin @data ;建立 DS内容
dispmsg msg1 ;显示 msg1字符串
dispmsg msg2 ;显示 msg2字符串
mainend ;返回 DOS
end start
例题