资源描述:
《高级汇编语言技术(书)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第七章高级汇编语言技术第一节宏汇编第二节重复汇编第三节条件汇编第一节宏汇编子程序优点:子程序:节省存储空间及设计程序所花的时间,提供模块化程序设计的条件,便于程序的调试和修改。1、宏定义和宏调用.宏是原程序中一段有独立功能的程序代码。它只需要在原程序中定义一次,,就可以多次调用它,调用时只需要用一个宏指令语句就可以了,宏定义是用一组伪操作来实现的,其格式是:宏指令名称MACRO(<参数1>,<参数2>,………..)<宏定义体>ENDM其中MACRO和ENDM是一对伪操作,宏指令名:给出该宏定义的名称,调用时就使用宏指令
2、名来调用该宏定义,名的第一个符号必须是字母,其后可以跟字母,数字或下划线字符。(1)带参宏定义宏指令名MACRO形参1,形参2,……宏体ENDM(2)无参宏定义宏指令MACRO宏体ENDM宏定义体:是一组有独立功能的程序代码。参数:⑴宏中的形参(虚参),每个哑元之间用“,”隔开,经宏定义后的宏指令就可以在原程序中调用,这种对宏指令的调用称为宏调用;格式:宏指令名(<参数1>,<参数2>,………..)⑵参数:实在参数,实元表,每一项用“,”隔开。当源程序被汇编时,汇编程序将对每个宏调用做宏展开,宏展开就是用宏定义取代源程
3、序中的宏指令名,而且用实元取代宏定义中的哑元;⑶在取代时,实元和哑元是一一对应的,第一个实元取代第一个哑元;⑷实元的个数应该和哑元的个数相等;若实元个数大于哑元个数,则多余的实元不予考虑;若实元个数小于哑元个数,则多余哑元作“空”处理。例1:用宏指令定义两个字操作数相乘,得到一个16位的第三个操作数,作为结果。宏定义:multmacroopr1,opr2,resultpushdx;cxvarxyz[bx]pushax;240bxsavemovax,opr1imulopr2movresult,axpopaxpopdxen
4、dm宏调用:multcx,var,xyz[bx]mult240,bx,save宏展开:1pushdx1pushax1movax,cx1imulvar1movxyz[bx],ax1popax1popdxMultmacroopr1,opr2,resultpushdxpushaxmovax,opr1imulopr2movresult,axpopaxpopdxendmmult240,bx,save1pushdx1pushax1movax,2401imulbx1movsave,ax1popax1popdxMultmacroopr
5、1,opr2,resultpushdxpushaxmovax,opr1imulopr2movresult,axpopaxpopdxendm汇编程序在所展开的指令前加上“1”号以示区别。从上面的例子可以看出:由于宏指令可以带哑元,调用时可以用实元取代,这就避免了子程序因变量传送带来的麻烦,使宏汇编的使用增加了灵活性。实元:常数、寄存器、存储单元名以及用寻址方式能找到地址或表达式等。还可为指令的操作码或操作码的一部分。“子”工作方式与“宏”不同:⑴子程序是在程序执行期间由主程序调用的,它只占有它自身大小的一个空间;⑵宏调用
6、则是在汇编期间展开的,每调用一次就把宏定义体展开一次,因而它占有的存储空间与调用次数有关,调用次数越多则占有的存储空间就越大。所以宏汇编可以免去执行时间上的额外开销,但如果宏调用次数较多的话,则其空间上的开销也是应该考虑的因素。一般的说,由于宏汇编可能占用较大的空间,所以代码较长的功能段往往使用子程序而不用宏汇编;但那些较短的且变元较多的功能段则使用宏汇编就更加合理。2、宏指令举例.(1)宏定义可无变元例2、saveregmacropushaxpushbxpushcxpushdxpushsipushdiendm宏调用:
7、savereg宏展开则将定义体的内容全部列出。(2)变元可以是操作码例3、f00macrop1,p2,p3movax,p1p2p3endm宏调用:foowordvar,inc,ax宏展开:1movax,wordvar1incax(3)变元可以是操作码的一部分,但在宏定义体中必须用&作分隔符。&是一个操作符,它把&前后两个符号合并而形成一个符号,这个符号可以是操作码、操作数或是一个字符串。例4、宏定义:leapmacrocond,labj&condlabendm宏调用:leapz,there宏展开:1jztherre宏调
8、用:leapnz,here宏展开:1jnzhere例5、宏定义:fomacrop1jmpta&p1endm宏调用:fowordvar宏展开:1jmptawordvar(4)变元是ASCII串的情况.例6:宏定义:msggenmacrolab,num,xyzlab&numdb’hellomr.&xyz’endm宏调用:msggenm