




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
7.3宏程序中使用宏分为定义和调用两个部分。宏定义用来说明哪些指令或伪指令是将在程序中重复出现的程序段;宏调用是用来告诉汇编程序,在翻译前先把宏定义中的程序段复制一遍。可见,宏定义和宏调用都是告诉汇编程序如何处理,属于伪操作。7.3.1宏定义【格式】宏名MACRO宏体ENDM【说明】(1)“宏名”是一个标识符,一个程序中可以定义多个宏,对每一个宏必须以不同的标识符命名,且宏名不能与变量、标号、段名等标识符同名。(2)汇编语言规定,宏定义的起始标记MACRO前面必须写宏的名字,而结束标记ENDM的前面却不允许写任何内容,写在起止标记之间的部分称为宏体,宏体部分通常是一段程序中需要重复使用的指令序列。(3)宏定义仅仅用来告诉汇编程序,将来宏调用时复制的对象是什么,宏定义中的程序段并不是程序的一部分,也就是说,如果程序中定义了一个宏而没有调用它,汇编程序将忽略宏定义。(4)宏定义可以写在程序的任何地方,但习惯上总是把宏定义写在程序的最前面。宏定义与编辑器中的文字块的定义有相似之处,也有一些差别。两者都需要以特定的方式说明开始和结束的位置。文字块是文件的一部分,而宏体中的程序段必须经过宏调用才能复制到源程序中正确的位置,没有被调用的宏体在汇编程序翻译时会被忽略。【例7.10】参照汇编程序的处理方法,对下面程序中的宏进行展开。back=4CHdosintEQU21HdispchMACROMOVAH,2MOVDL,'*'INT21HENDMcodeSEGMENTASSUMECS:codemain:dispchdispchMOV AH,backINT dosintcodeENDSEND main【解】宏展开后的结果是:+MOV AH,2+MOV DL,'*'+INT 21H+MOV AH,2+MOV DL,'*'+INT 21HMOV AH,4CHINT 21H由于宏展开是汇编程序翻译的一个步骤,宏展后的结果并不是源程序,所以展开后不再写出完整的程序格式,只列出有效指令部分。可以看到,汇编程序对宏调用与已定义的常量及符号的引用的处理是很类似的,定义部分在汇编处理结束后就已完成它的作用。汇编程序翻译后得到的机器代码中没有宏、常量等的定义,只是调用或引用部分被代换成宏体或定义的内容。宏与常量定义及符号定义的差别在于,常量及符号定义都必须在一行写完,对常量和符号的引用只能代换指令中的操作数,或者操作数的一部分,宏调用则可以代换一段程序。不仅如此,宏还允许代换的内容有个别地方不同,这是通过带参数的宏实现的。【例7.11】普通用法,形式参数出现在操作数的位置。dchMACROxMOVAH,2MOVDL,xINT 21HENDM源程序中调用宏dch时,应该在宏名字的后面跟一个实际参数,从例7.11的宏体可以看出,这个实际参数应该是用于屏幕显示的一个ASCII字符。因而,源程序中用下面的写法连续两次调用上述宏,就可以实现回车换行操作。宏展开时,对每一次宏调用,将分别以相应的实际参数代换宏体中的形式参数。dch13dch10【例7.13】宏的形式参数可以作为一个标识符的一部分。这时,必须用符号“&”把形式参数与标识符的其余部分分开。例7.12中的宏定义还可以写成下面的形式:cc1MACROcmd,labCMPAX,BXJ&cmdlabENDM【例7.14】形式参数还可以出现在变量定义伪操作的初值表中,甚至是以字符串形式出现的初值。msgMACROnum,pnamevar&numDB'HELLO,&pname'ENDM汇编语言规定,字符串中的形参必须用分隔符“&”从其它部分分离出来。对于下面两个宏调用, msg1,John msg2,Henrry宏展开的结果是: +var1DB'HELLO,John' +var2DB'HELLO,Henrry'
*7.3.4宏操作中形参与实参的对应关系由于宏是伪操作,形参与实参的对应方法是由汇编程序决定的,与高级语言中形参与实参的对应方式有很大的不同。汇编语言规定:(1)形参表中的多个参数项之间必须用逗号分隔,但实参表的各个参数项可以用逗号也可以用空格分隔。(2)如果形参的数目与实参的数目相等,则按照形参表与实参表中各参数项的次序一一对应。(3)如果形参数目少于实参数目,多余的实参被忽略,汇编程序不做任何提示。(4)如果形参数目多于实参数目,不足的实参作空串处理,汇编程序也不做提示。(5)如果实参中包含逗号、空格等分隔符作有效符号,必须用尖括号“<>”括起来,避免混淆。【例7.15】设有宏定义如下:dataMACROp,qv&pDBqENDM以及下面的宏调用:x=1data%x,%xx=x+1data%x,%x其宏展开结果是:+v1DB1+v2DB2符号“%”的作用体现在宏展开中是用常量标识符x的值(第1次宏调用时是1,第2次宏调用时是2),而不是符号x本身,去替换宏展开时的形参。需要注意的是,宏操作与源程序的其它部分一样,都要经过汇编程序的处理。汇编程序在处理带有宏调用的程序时,是先进行宏展开,再进行语法检查及翻译。宏体在定义时,由于可以带有一些形式参数,在没有进行代换之前很可能是不符合语法规则的,但宏调用并展开后是否符合语法规则,需要由汇编程序来判定。如果展开后的指令或伪指令有错,汇编程序只能指出宏调用有错,并指出宏调用所在行的号码,却无法指出究竟是展开后的哪一行不符合语法。addMACROx,yENDMADDAX,BXPURGEaddADDAX,BX这样的源程序中,前一个ADD被当作宏调用处理(汇编语言是不分大小写的),进行宏展开;后一个ADD由于已用PURGE伪指令取消了作为宏的add宏调用,使得该标识符恢复原功能,因此是ADD指令。
7.3.5宏体中的标号宏体中出现标号分为两种情况:一是在带有跳转功能的指令中,标号作为跳转的目的地,也就是对标号的引用;另一种是宏体中某条指令的前面出现标号,即标号定义。如果宏体中引用标号,由于汇编语言允许从程序的不同地方用跳转指令跳转到同一位置,所以即使源程序中对这样的宏多次调用,展开后的结果并不违反语法规则。但是需要注意,如果标号的引用出现在条件跳转指令中,由于条件跳转的距离是有限制的,所以源程序中在不同位置调用这样的宏,那些离标号定义处较近的可以不超过范围因而没有语法错误,但那些离标号定义处远的就不保证了。【例7.16】设有如下宏定义:sumMACROa,bLOCALnextMOVCX,aLEABX,bXORAX,AXnext:ADDAX,[BX]ADDBX,2LOOPnextENDM并已知buf1和buf2是已定义的两个变量,展开下面的宏调用:sum5,buf1sum7,buf2【解】宏展开结果是:+MOVCX,5+LEABX,buf1+XORAX,AX+??0000:ADDAX,[BX]+ADDBX,2+LOOP??0000+MOVCX,7+LEABX,buf2+XORAX,AX+??0001:ADDAX,[BX]+ADDBX,2+LOOP??0001*7.3.6宏的嵌套类似于在子程序中可以调用另一个子程序,在一个宏体中也允许再调用另一个已定义的宏。对这种宏中套宏的宏调用,汇编程序将逐次展开,直到展开后的结果不再含有宏调用为止。【例7.17】设某程序中已定义了3个字型变量v1、v2、v3,下面是源程序中的一段,试展开最后一行的宏调用。mm1 MACROx MOVAX,x MULAX ENDMmm2MACROa,b,cmm1aMOVBX,AXmm1bADDAX,BXMOVc,AXENDM
mm2v1,v2,v3【解】展开mm2后得到:+mm1v1+MOVBX,AX+mm1v2+ADDAX,BX+MOVv3,AX其中还含有宏调用,再把两个mm1展开后可得到如下结果: +MOVAX,v1 +MULAX +MOVBX,AX +MOVAX,v2 +MULAX +ADDAX,BX +MOVv3,AX(3)目标代码的长度不同。由于每一次宏调用都要进行宏展开,把宏体中的内容复制一遍,因而用宏编写的程序在目标代码中会重复出现相同或相似的程序段,占用内存空间大;而子程序是由CALL指令调用,无论调用多少次,子程序的目标代码只在最终的执行程序中出现一次,目标代码相对较短。(4)执行速度不同。子程序调用时会比宏展开后的代码多执行CALL指令和RET指令,以及需要附加的指令进行参数传递,因而执行速度稍慢。(5)参数处理不同。宏调用是以实参代替形参,参数的形式不受制,可以是指令助记符、寄存器名、标号等;而子程序的参数传递必须有确切的存放地。编写程序的过程中,对于程序中的重复部分,究竟是采用宏还是子程序,程序员可以权衡内存空间、执行速度、参数传递方法等各方面的因素后取舍。在大多数情况下,宏比子程序有更大的灵活性,且执行速度快,在重复部分较短时经常采用;而一个已经验证过的子程序,可以做成目标代码存放在子程序库中,在另一个程序中应用时可不经过汇编程序的翻译,直接与需要使用它的程序连接在一起,从而避免宏展开后可能出现的语法及逻辑错误。*7.4重复汇编
7.4.1有规律变化的重复在变量定义中经常会出现把某个变量的初值设定为一串连续变化的整数,比如:DB1,2,3,4,5,6,7,8,9,10对这种有规律变化的情况,往往用重复汇编与“=”定义的常量配合处理。重复汇编的基本格式是:【格式】REPTnENDM【说明】把一组源代码重复n次。格式中的REPT和ENDM是汇编语言保留字,是重复汇编的起止标志。REPT后面的n必须是一个常量或常量标识符,表示重复次数,省略号部分是被重复的源程序代码。【例7.18】前面提到的把1到10的整数作为字节型变量的初值,可以用下面的方式编写:x=1REPT10DBxx=x+1ENDM汇编后产生的结果如下:+DB1+DB2
+DB9+DB10
7.4.2无规律变化的重复如果在一组连续的指令中,是用同一条指令或伪指令处理不同的操作数,而操作数本身没有内在规律时,可以用无规律重复汇编简化编程。这种重复汇编的用法是:
【格式】IRP形参,<实参表>ENDM【功能】IRP和ENDM是重复汇编的起止标志,省略号表示被重复的一组指令或伪指令,形式参数是这一组指令中可变化的部分。如果实参表中有n个参数项,汇编程序将把这一组指令或伪指令重复n次,每一次用实参表中的一个参数项代替形参。【例7.19】把除SP以外的各通用寄存器入栈需要7条PUSH指令,如果用重复汇编可以写成:IRPregs,<AX,BX,CX,DX,SI,DI,BP>PUSHregsENDM汇编后展开的结果是:+PUSHAX+PUSHBX+PUSHCX+PUSHDX+PUSHSI+PUSHDI+PUSHBP本
章
要
点与前面的章节相比,本章说明的是汇编语言提供的更复杂的数据处理方法和更简洁的编程形式。移位操作主要用于对二进制位串的处理,可以加速乘以或除以2n的计算;串操作指令主要针对类似于高级语言中的数组的操作,带有前缀的串指令不仅可以简化程序的编制,而且可以缩短程序执行的时间。宏和重复汇编都是汇编语言提供的伪操作。把源程序中不同位置上重复出现的相同或相似的一组指令定义成宏,然后在源程序中以宏名字进行宏调用,可以使重复出现的程序段只编写一次,不仅减少了出错的可能性,而且便于程序的修改;对于连续重复出现的一组指令或伪指令,还可以用重复汇编简化编程。习
题
七7.1已知(DX,AX)中存放了一个无符号双字,编写程序段,利用移位指令把这个双字乘以7,不计溢出。7.2编写一个子程序,以AX为入口参数,把AX中的各个二进制位颠倒次序后还放回AX中。比如,入口参数AX=11001B,则处理后AX应为11101B。[提示:用一条非循环移位指令与一条带CF的循环移位指令配合,选取的两条指令在移位方向上必须相反]7.3编写子程序,入口参数是一个字型数据,统计该字的16个二进制位中含有多少个1和多少个0。7.4编写完整程序,调用第6章的read子程序,从键盘读入一个带符号整数,以二进制输出其补码。[提示:read子程序得到的结果本就是补码,只需要用二进制依次输出它的16个二进制位即可]7.5不允许使用串指令,分别编写程序段,实现DF为0时以下各串操作指令的功能。(1)REPMOVSB(2)REPSTOSW(3)REPZCMPSB(4)REPNZSCASW7.6已知var是一个字型数组变量,存放了n个带符号整数,编写程序段,把这n个整数按正负分类,分别存入两个字型变量varp和varn中,并跳过原数组中的0。要求尽可能地利用串操作指令。7.7利用串指令编写一个口令检验程序,从键盘读入一个符号串,与源程序中预先定义的一个符号串(口令)相比较,如果不同,允许再次输入,最多输入3次,3次输入都不对则程序结束。输出口令检验的结果,显示是否输入了正确的口令,以及是第几次输对的。如果忽略字母的大小写又该如何处理呢?7.8给定宏定义如下:difMACROx,yMOVAX,xSUBAX,yENDMdifaMACROa,b,cLOCALcontPUSHAX
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 IEC 61010-1:2001 FR-D Safety requirements for electrical equipment for measurement,control,and laboratory use - Part 1: General requirements
- 滑雪比赛美术课件
- 酒店厨师小知识培训课件
- 2025年财务年度工作方案
- 扬州突发公共事件应急平台体系介绍
- (学校)山东省普通中小学标准化建设录入课件
- 车间主任日常管理
- 2025年四川省广元市旺苍县重点达标名校初三毕业年级第二模拟考试化学试题含解析
- 湖南都市职业学院《赛事转播》2023-2024学年第二学期期末试卷
- 四川省邻水市实验中学2025年高三下-期中化学试题含解析
- 2025年全民国家安全教育日知识竞赛考试题库500题(含答案)
- 跨境电商网站的设计挑战试题及答案
- 2024中国山东省集中供热行业发展趋势预测及投资战略咨询报告
- 肯德基店面试试题及答案
- 2023国家卫健委中国结直肠癌诊疗规范
- 深信服下一代防火墙技术白皮书20231120
- 广州市白云区2025年招考社区居委会专职人员高频重点模拟试卷提升(共500题附带答案详解)
- 2025年辽宁省大连市高考语文一模试卷
- 统编版语文七年级下第18课《井冈翠竹》公开课一等奖创新教学设计
- 七年级数学新北师大版(2024)下册第一章《整式的乘除》单元检测习题(含简单答案)
- 《冠心病》课件(完整版)
评论
0/150
提交评论