您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 第7章 高级宏汇编语言
第七章高级宏汇编语言为了象高级语言那样由程序员自定义更复杂的数据类型。80X86提供了宏指令语句,还具有条件汇编的能力。§1.宏指令在汇编语言源程序中,有些程序段要多次使用,我们引用子程序,但子程序有些缺点,转子和返回在保存和恢复断点寄存器以及参量的传递等开销要增加。若子程序本身较短,需要传递参量较多的情况下,使用宏汇编更方便。一.宏定义和宏调用1.定义:源程序中一段有独立功能的程序代码。(1)格式:宏名称MACRO[形参表]宏体ENDM(2)说明:1)宏在源程序中定义一次,可多次调用。2)宏名称:第一个字母必须是字母,其后跟字母、数字或下划线字符(=31个字符)3)宏定义体:一组独立功能的程序代码。4)形参(哑参)(虚参):形参间用,分隔。2.宏调用(1)格式:宏名称[实参表](2)说明:1)实参表:实元间用,隔开。实元可以是常数、register、存储单元。2)实元个数一般与哑元的个数相等。实际上,若实元个数哑元个数多余实元不考虑。若实元个数哑元个数多余哑元作“空”处理。3.宏展开宏定义体取代源程序中宏名称。用实元取代哑元。Ex:7.1用宏指令定义两个字操作数相乘得到一个16位的第三操作数(结果)。MULTIPLYMACROOPR1,OPR2,RESULTPUSHDXPUSHAXMOVAX,OPR1IMULOPR2MOVRESULT,AXPOPAXPOPDXENDM宏定义宏调用MULTIPLYCX,VAR,XYZ[BX]形参实参4.宏定义和子程序的区别子程序:由主程序在执行期间调用,只占自身大小的一个空间。宏定义:宏调用是在汇编期间展开,每调用一次,宏定义体展开一次,因此占有的存储空间与调用次数有关,次数越多,空间愈大。较长的功能段用子程序,较短的且变元较多的功能段用宏定义。二.宏操作符常用的宏操作符为4个:&、<>、%、!1.连接操作符&和文本操作符<>(1)&在定义体中,作为形参的前缀或后缀,展开时,把&前后两部分的符号,合并成一个新的符号。EX:J&CONTCONT:NZJNZCJCSJS(2)<>在宏调用时,有的实参中含有空格或逗号,这时用<>,把一个完整的实参括起来,作为一个单一的实参。Ex:宏定义MULTMACROOP,RESULT…MOVRESULT,AX宏调用MULTM,<WORDPTRRES>形参形参EX:OP&ULOP:MMULIMIMUL宏展开:MOVWORDPTRRES,AX2.表达式操作符%和字符操作符(1)%格式:%<表达式>功能:取得表达式的值,在展开期间,用这个数取代形参。Ex:P2517.7(2)!指出!后的字符不作操作符使用,而是以字符本身的意义进行处理。Ex:!%(作为百分号用)三.局部符号伪操作LOCAL宏定义体中,允许使用符号,多次调用宏时,标号会多重定义,处理办法用LOCAL伪操作。1.格式:LOCAL局部标号名2.说明:LOCAL只能用在定义体中,且是macro伪操作的第一个语句,在macro和local间不允许有注释和分号标志。Ex:P2527.8四.宏库(P258)将若干个宏定义组成一个宏库以库文件的形式存放起来。当程序需要使用这些宏定义时,只需用include伪指令说明库文件名,就可以在程序中直接调用库文件中的宏定义,而不需要重复编写这些宏定义。格式:INCLUDE库文件名(扩展名为.LIB)ex:在macro.lib中定义两个宏inputmacromovah,01hint21hendmdispmacrobufleadx,bufmovah,09hint21hendmex:P259Ab.asm…Includemacro.lib…Dispstr1…InputDispstr2*其他伪操作.xall清单中只列出产生目标代码的宏展开(默认情况).lall宏展开时列出包括注释在内的所有宏展开.sall宏展开时,不列出任何展开的信息;;双分号注释,宏展开时,不予展开Ex:P2567.12*Purge伪操作用来删除不用的宏定义。用include语句调用宏库时可以用Purge伪操作删除在调用程序中不用的宏定义。这不会影响宏库中的内容。格式:Purge宏名Ex:purgepromptex1:编写一个把1位十六进制数字ASCII码符转换为对应二进制数的宏。hexbinmacrohex_oper,resultlocalnextmoval,[hex_oper]subal,30hcmpal,10jbnextsubal,07hnext:andax,000fhmovresult,alendm;hex_oper---十六进制数字的ASCII码datasegmentAhexdb‘A’resultdb?dataendscodesegmentassumecs:code,ds:datamainprocfarstart:movax,datamovds,axhexbinahex,resultmovah,4chint21hmainendpcodeendsendstartex2.编制一个对键盘输入的小写母用大写字母显示出来的宏指令。up_lowermacrolocalnextnext:movah,01hint21hCMPal,’A’jbnextCMPal,’Z’janextaddal,20hmovdl,almovah,02hint21hendmcodesegmentassumecs:codemainprocfarstart:up_lowermovah,4chint21hmainendpcodeendsendstart§2.重复汇编需要连续地重复完成相同的或几乎相同的一组代码,可用重复汇编。一.重复伪操作(P262)格式:REPT<表达式>…ENDM重复执行次数,由表达式的值决定。Ex7.13:x=0rept10x=x+1dbxendmP262.Ex7.14~7.161~10分配到十个连续的内存单元中指令体二.不定重复伪操作(P264)1.IRP(1)格式:IRP形参,<参数表>…ENDM(2)说明:重复次数由参数表中的参数个数决定,参数表用<>括起来,参数间用,隔开,每重复一次,依次用参数表中的参数来代替形参一次。Ex7.17:IRPx,1,2,3,4,5,6,7,8,9,10DBxENDM参数十个,重复十次,也是把1~10分配到10个连续的内存单元中。Ex7.182.IRPC伪操作(1)格式:IRPC形参,字符串(或<字符串>)…ENDM(2)说明:重复次数由字符串中的字符个数决定,字符中间不能用,分隔。每重复一次,依次用字符串中的字符取代形参一次。Ex7.20:IRPCK,ABCDPUSHK&XENDMEx7.19PUSHAXPUSHBXPUSHCXPUSHDX展开后§3.条件汇编(P265)根据条件判断是否把一段程序包括在汇编语言程序内,这用条件汇编来实现。一.条件伪操作的一般格式IFXX…[ELSE]…ENDIF二.条件伪操作可以在宏定义体内、体外,也允许嵌套任意次。Ex:p2667.21宏指令MAX把三个变元中的最大值放在AX中MAXMACROK,A,B,CLOCALNEXT,OUTMOVAX,AIFK-1IFK-2CMPC,AXJLENEXTMOVAX,CENDIFNEXT:CMPB,AXJLEOUTMOVAX,BENDIFOUT:ENDM(1)MAX1,P1KPAK-1=0IFK-1不满足条件,外部IF不执行,转至ENDM处。(2)MAX2,P,Q2KPAQBK-1=0IFK-1满足条件,执行下面的IFK-2,而K-2=0,不满足,内部IF不执行,转至NEXT处。MAX3,P,Q,R呢?三.宏定义体允许递归,条件伪操作可结束宏调用。EX7.23调用COUNT=0POWERAX,3XN(1)COUNT=COUNT+1COUNT=1IFCOUNT-N=1-3=-2满足条件POWERAX,3(2)COUNT=COUNT+1COUNT=2IFCOUNT-N=2-3=-1满足条件POWERAX,3(3)COUNT=COUNT+1COUNT=3IFCOUNT-N=3-3=0不满足条件,递归结束。四.条件伪操作可以产生不同的转向指令Ex7.22p267当X与BRANCH间的距离<128时(8位位移量),产生段内直接转移JMPSHORTX当X与BRANCH间的距离>128时(16位位移量),产生段内直接近转移JMPNEARPTRXLesson7.37.77.9
本文标题:第7章 高级宏汇编语言
链接地址:https://www.777doc.com/doc-3383929 .html