高级汇编语言技术(书).ppt_第1页
高级汇编语言技术(书).ppt_第2页
高级汇编语言技术(书).ppt_第3页
高级汇编语言技术(书).ppt_第4页
高级汇编语言技术(书).ppt_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第七章高级汇编语言技术,第一节宏汇编第二节重复汇编第三节条件汇编,第一节宏汇编,子程序优点:子程序:节省存储空间及设计程序所花的时间,提供模块化程序设计的条件,便于程序的调试和修改。1、宏定义和宏调用.宏是原程序中一段有独立功能的程序代码。它只需要在原程序中定义一次,就可以多次调用它,调用时只需要用一个宏指令语句就可以了,宏定义是用一组伪操作来实现的,其格式是:宏指令名称MACRO(,,.)ENDM其中MACRO和ENDM是一对伪操作,宏指令名:给出该宏定义的名称,调用时就使用宏指令名来调用该宏定义,名的第一个符号必须是字母,其后可以跟字母,数字或下划线字符。,(1)带参宏定义宏指令名MACRO形参1,形参2,宏体ENDM(2)无参宏定义宏指令MACRO宏体ENDM,宏定义体:是一组有独立功能的程序代码。参数:宏中的形参(虚参),每个哑元之间用“,”隔开,经宏定义后的宏指令就可以在原程序中调用,这种对宏指令的调用称为宏调用;格式:宏指令名(,,.)参数:实在参数,实元表,每一项用“,”隔开。当源程序被汇编时,汇编程序将对每个宏调用做宏展开,宏展开就是用宏定义取代源程序中的宏指令名,而且用实元取代宏定义中的哑元;,在取代时,实元和哑元是一一对应的,第一个实元取代第一个哑元;实元的个数应该和哑元的个数相等;若实元个数大于哑元个数,则多余的实元不予考虑;若实元个数小于哑元个数,则多余哑元作“空”处理。,例1:用宏指令定义两个字操作数相乘,得到一个16位的第三个操作数,作为结果。宏定义:multmacroopr1,opr2,resultpushdx;cxvarxyzbxpushax;240bxsavemovax,opr1imulopr2movresult,axpopaxpopdxendm,宏调用:multcx,var,xyzbxmult240,bx,save宏展开:1pushdx1pushax1movax,cx1imulvar1movxyzbx,ax1popax1popdx,Multmacroopr1,opr2,resultpushdxpushaxmovax,opr1imulopr2movresult,axpopaxpopdxendm,mult240,bx,save1pushdx1pushax1movax,2401imulbx1movsave,ax1popax1popdx,Multmacroopr1,opr2,resultpushdxpushaxmovax,opr1imulopr2movresult,axpopaxpopdxendm,汇编程序在所展开的指令前加上“1”号以示区别。从上面的例子可以看出:由于宏指令可以带哑元,调用时可以用实元取代,这就避免了子程序因变量传送带来的麻烦,使宏汇编的使用增加了灵活性。实元:常数、寄存器、存储单元名以及用寻址方式能找到地址或表达式等。还可为指令的操作码或操作码的一部分。,“子”工作方式与“宏”不同:子程序是在程序执行期间由主程序调用的,它只占有它自身大小的一个空间;宏调用则是在汇编期间展开的,每调用一次就把宏定义体展开一次,因而它占有的存储空间与调用次数有关,调用次数越多则占有的存储空间就越大。所以宏汇编可以免去执行时间上的额外开销,但如果宏调用次数较多的话,则其空间上的开销也是应该考虑的因素。一般的说,由于宏汇编可能占用较大的空间,所以代码较长的功能段往往使用子程序而不用宏汇编;但那些较短的且变元较多的功能段则使用宏汇编就更加合理。,2、宏指令举例.(1)宏定义可无变元例2、saveregmacropushaxpushbxpushcxpushdxpushsipushdiendm宏调用:savereg宏展开则将定义体的内容全部列出。,(2)变元可以是操作码例3、f00macrop1,p2,p3movax,p1p2p3endm宏调用:foowordvar,inc,ax宏展开:1movax,wordvar1incax,(3)变元可以是操作码的一部分,但在宏定义体中必须用&作分隔符。&是一个操作符,它把&前后两个符号合并而形成一个符号,这个符号可以是操作码、操作数或是一个字符串。例4、宏定义:leapmacrocond,labj&condlabendm宏调用:leapz,there宏展开:1jztherre宏调用:leapnz,here宏展开:1jnzhere,例5、宏定义:fomacrop1jmpta&p1endm宏调用:fowordvar宏展开:1jmptawordvar,(4)变元是ASCII串的情况.例6:宏定义:msggenmacrolab,num,xyzlab&numdbhellomr.&xyzendm宏调用:msggenmsg,1,taylor宏展开:1msg1dbhellomr.taylor,(5)宏指令名可以与指令助记符或伪操作名相同,在这种情况下,宏指令的优先级最高,而同名的指令或伪操作失效。伪操作PURGE可以用来在适当的时候取消宏定义,以便恢复指令的原始含义。例7、宏定义:ADDMACROOPR1,OPR2,RESULTENDM宏调用:addxx,yy,zz.purgeadd在宏调用后,用PURGE伪操作取消宏定义,以便恢复ADD指令的原始含义,在PURGEADD后面所用的ADD指令,则服从机器指令的定义。PURGE伪操作可同时取消多个宏定义,宏指令名词以“,”分隔。,(6)LOCAL伪操作的使用.在程序中多次调用该宏定义时,展开后会出现标号的多重定义,为此,系统提供了LOCAL伪操作,格式:LOCAL局部标号表(listoflocallabels)其中局部标号表内的各标号之间用“,”隔开。汇编程序对LOCAL伪操作的局部标号表中为每一个局部标号建立唯一的符号(用?0000?fff)以代替在展开中存在的每个局部标号。注意:LOCAL只能用在宏定义体内,而且是MACRO后第一个语句且在MACRO和LOACL间不允许有注释,分号。例8、宏定义:absdmacrooperlocalnextcmpoper,0jgenextnegopernext:endm,宏调用:absdvarabsdbx宏展开:1cmpvar,01jge?00001negvar1?0000:1cmpbx,01jge?00011negbx1?0001:,宏定义:absdmacrooperlocalnextcmpoper,0jgenextnegopernext:endm,(7)宏定义允许嵌套,但必须先定义后调用。宏定义:difmacrox,y宏调用:difsqrvar1,var2,var3movax,x宏展开:1pushdxsubax,y1pushaxendm1difvar1,var2difsqrmacroopr1,opr2,result2movax,var1pushdx2subax,var2pushax1imulaxdifopr1,opr21movvar3,aximulaxmovresult,ax1popaxpopax1popdxpopdx在LIST清单中可看到宏展开结果endm,(8)宏定义体内可以包含宏定义.宏定义:defmacmacromacnam,operatormacnammacrox,y,zpushaxmovax,xoperatorax,ymovz,axpopaxendm宏调用:defmacaddition,add宏展开:1additionmacrox,y,zpushaxmovax,xaddax,ymovz,axpopaxendm形成加法宏定义。其中MACNAM是内层宏定义名,但又是外层宏定义的哑元,所以当调用DEFMAC时,就形成一个宏定义。,(9)宏定义中的变元可以使用伪操作%,格式:%expression.汇编程序把跟在%之后的表达式的值转换成当前基数下的数,在展开期间,用这个数来取代哑元。宏定义:msgmacrocount,stringmsg&countdbstringendm,宏调用:cntr=0text.msgmacrocount,stringerrmsgsyntaxerrorerrmsginvalidoperand宏展开:1msg1dbsyntaxerror1msg2dbinvalidoperandontr=111=2在lst清单中,不产生代码的语句不列出。为了能看到宏展开后所有的语句,可在源程序中增加LALL语句。展开第一层:第二层:cntr=0cntr=01cntr=cntr+11cntr=cntr+11msg%cntr,syntaxerror1msg1db,syntaxerror,1cntr=cntr+11cntr=cntr+11msg%cntr,mvalidoperand1msg2db,mvalidoperand伪操作:;语句双分号前面用双分号的注释,在宏展开时将不予展开;sall(xall)汇编清单中将不列出任何展开后的信息,(lst中)例、将某字符串在屏幕上显示出来。宏:init2macrocsname,dsname,ssnameassumecs:csname,ds:dsname,ss:ssname,es:esnamepushdssubax,axpushaxmovax,dsnamemovds,axmoves,axendm,宏:promptmacromessagemovah,9leadx,messageint21hendm程序:stacksegmentparastackstackdw32dup(?)stackendsdatasegmentparadatamessage1dbcustomername?,13,10,$message2dbcustomeraddress?,13,10,$dataends汇编清单中,宏展开列出的情况xall清单中只列出产生目标码的宏展开lall列出包括注释在内sall不列出任何展开信息,csegsegmentparacodebeginprocfarsallinit2cseg,data,stackpromptmessage1lallpromptmessage2retbeginendpcsegendsendbeginlst代码段csegsegmentparacodebeginprocfarsallinit2cseg,data,stackpromptmessage1,lallPromptmessage21movah,91Leadx,message21int21hRetBeginendpcsegendsEndbegin,第二节重复汇编,连续重复完成相同的或几乎完全相同的一组代码,可用重复汇编。1、重复伪操作.格式:reptexpression重复块endm其中表达式的值用来确定重复块的重复次数。例1、在数据区中定义字节类型的1、2、3、10。X=0汇编后:1db1Rept101db2X=x111db3Dbx1Endm1db10,返回本章,例2、把字符AZ的ASCII码填入数组TABLECHAR=a汇编后TABLELABELBYTE1DB61HREPT261DB62HDBCHARCHAR=CHAR+11DBTAHENDM例3、用宏定义及重复伪操作把TAB,TAB+1,TAB+2,.,TAB+16的内容存入堆栈。宏定义:pushtabmavrokpushtab+kendm宏展开:1pushtab+01pushtab+111pushtab+16,宏调用:I=0REPT17PUSHTAB%II=I+1ENDM例4、要求建立一个100字的数组,其中每个字的内容是下一个字的地址,而最后一个字的内容是第一个字的地址。ARRAYLABELWORD汇编后:REPT991DW$+2重复DW$+21DW$+2ENDMDWARRAY1DW$+2DWARRAY2、不重复伪操作。(1)IRP伪操作IRPDUMMY,重复块ENDM,汇编程序把重复块的代码重复几次,每次重复把重复块的哑元用自变量表中的一项来取代,下一次取代下一项,重复次数由自变量表中的自变量个数来确定。自变量表必须用尖括号括起,它可以是常数、符号、字符串等,IRP、IRPC、REPT,不一定用在宏定义中。例5、IRPX,DBXENDM汇编后得:1DB11DB21DB10例6、IRPREG,PUSHREGENDM,汇编后得:1PUSHAX1PUSHBX1PUSHCX1PUSHDX(2)IRPC伪操作格式为:IRPCX,01234567DBX+1ENDM汇编后得:1DB11DB21DB8例8、IRPCK,ABCDPUSHK&XENDM,汇编后得:1PUSHAX1PUSHBX1PUSHCX1PUSHDX,汇编程序能根据条件把一段源程序包括在汇编语言程序内或者把它排除在外,这里就用到条件伪操作。条件伪操作的一般格式是:IFXXARGUMENT自变量满足条件“满足此块”ELSE不变给定条件时汇编此块。ENDIFXX表示条件如下:,第三节条件汇编,返回本章,IFexpression汇编程序求出表达式的值,如此值不为0则满足条件;IFEexpression如求出表达式的值为0则满足条件;IFDEFsymbol如符号已在程序中定义,或者已用EXTRN伪操作说明该符号是在外部定义的,则满足条件;IFNDEFsymbol如符号未定义或未通过EXTRN说明为外部符号,则满足条件;IFNB如自变量不为空,则满足条件。IFB如自变量为空,则满足条件。IFIDN,如字符串与相同,满足条件IFDIF,如字符串与不相同,满足条件条件伪操作可以用在宏定义体内,也可以用在宏定义体外,也润许嵌套任意次。例1、宏指令MAX把三个变元中的最大值放在AX中,而且使变元数不同时产生不同的程序段。,宏定义:调用:MAX1,PMAXMACROK,A,B,CMAX2,P,QLOCALNEXT,OUTMAX3,P,Q,RMOVAX,A宏展开:IFK-1MAX1,PIFK-21MAXAX,PCMPC,AX1?0002:outJLENEXTMAX2,P,QMOVAX,C1MOVAX,PENDIF1?0002:CMPQ,AXNEXT:CMPB,AXnextJLE?0003JLEOUTMOVAX,QMOVAX,B1?0003:outENDIFMAX3,P,Q,ROUT:ENDM1MOVAX,P1CMPR,AX,1JLE?0004:next1movAX,R1?0004:nextcmpQ,AX1MOVAX,Q1?0005:out例2、宏指令GOTOL,X,REL,Y(其中REL=Z,NZ,L,NL)可以

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论