- 1、本文档共44页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
汇编语言——宏; (3)宏定义仅仅用来告诉汇编程序,将来宏调用时复制的对象是什么,宏定义中的程序段并不是程序的一部分,也就是说,如果程序中定义了一个宏而没有调用它,汇编程序将忽略宏定义。
(4)宏定义可以写在程序的任何地方,但习惯上总是把宏定义写在程序的最前面。
宏定义与编辑器中的文字块的定义有相似之处,也有一些差别。两者都需要以特定的方式说明开始和结束的位置。文字块是文件的一部分,而宏体中的程序段必须经过宏调用才能复制到源程序中正确的???置,没有被调用的宏体在汇编程序翻译时会被忽略。 ; 7.3.2 宏调用
定义后的宏名又称为宏指令。经宏定义后,就可以在源程序中调用宏了。宏调用的方式是在源程序中需要复制宏体的地方写宏的名字。宏名单独占一行,当源程序被汇编时,汇编程序将对宏调用进行宏体复制,并取代宏名,这种复制操作称为宏展开。为了与源程序的其它部分相区别,后面的叙述中,对由宏调用而展开后得到的指令,都在前面标以加号“+”以示区别。 ; 【例7.10】参照汇编程序的处理方法,对下面程序中的宏进行展开。
back = 4CH
dosint EQU 21H
dispch MACRO
MOV AH,2
MOV DL, *
INT 21H
ENDM ;code SEGMENT
ASSUME CS:code
main: dispch
dispch
MOV AH,back
INT dosint
code ENDS
END main;【解】宏展开后的结果是:
+ MOV AH,2
+ MOV DL, *
+ INT 21H
+ MOV AH,2
+ MOV DL, *
+ INT 21H
MOV AH,4CH
INT 21H; 由于宏展开是汇编程序翻译的一个步骤,宏展后的结果并不是源程序,所以展开后不再写出完整的程序格式,只列出有效指令部分。
可以看到,汇编程序对宏调用与已定义的常量及符号的引用的处理是很类似的,定义部分在汇编处理结束后就已完成它的作用。汇编程序翻译后得到的机器代码中没有宏、常量等的定义,只是调用或引用部分被代换成宏体或定义的内容。宏与常量定义及符号定义的差别在于,常量及符号定义都必须在一行写完,对常量和符号的引用只能代换指令中的操作数,或者操作数的一部分,宏调用则可以代换一段程序???不仅如此,宏还允许代换的内容有个别地方不同,这是通过带参数的宏实现的。 ; 7.3.3 带参数的宏
如果宏只能对完全相同的程序段进行复制,那就没有多大的应用价值了,宏的好处主要体现在每次调用而展开的宏体可以不同。这需要在宏定义时以形式参数指明宏体中的哪些部分可以被不同的实际参数代替,每次调用时在宏名字的后面附带实际参数。完整的宏定义格式是:
宏名 MACRO [形式参数表]
宏体
ENDM
形式参数可以出现在宏体中的任何位置,可以在操作数中,可以在指令助记符的位置,甚至还可以是其中的一部分。下面的几个例子用来说明参数的各种不同用法。 ; 【例7.11】普通用法,形式参数出现在操作数的位置。
dch MACRO x
MOV AH,2
MOV DL,x
INT 21H
ENDM
源程序中调用宏dch时,应该在宏名字的后面跟一个实际参数,从例7.11的宏体可以看出,这个实际参数应该是用于屏幕显示的一个ASCII字符。因而,源程序中用下面的写法连续两次调用上述宏,就可以实现回车换行操作。宏展开时,对每一次宏调用,将分别以相应的实际参数代换宏体中的形式参数。
dch 13
dch 10; 【例7.12
文档评论(0)