《高级宏汇编语言.ppt》由会员分享,可在线阅读,更多相关《高级宏汇编语言.ppt(19页珍藏版)》请在三一办公上搜索。
1、第七章 高级宏汇编语言,为了象高级语言那样由程序员自定义更复杂的数据类型。80X86提供了宏指令语句,还具有条件汇编的能力。,1.宏指令,在汇编语言源程序中,有些程序段要多次使用,我们引用子程序,但子程序有些缺点,转子和返回在保存和恢复断点寄存器以及参量的传递等开销要增加。若子程序本身较短,需要传递参量较多的情况下,使用宏汇编更方便。一.宏定义和宏调用 1.定义:源程序中一段有独立功能的程序代码。(1)格式:MACRO 形参表 ENDM(2)说明:1)宏在源程序中定义一次,可多次调用。2)宏名称:第一个字母必须是字母,其后跟字母、数字 或下划线字符(=31个字符)3)宏定义体:一组独立功能的程
2、序代码。4)形参(哑参)(虚参):形参间用,分隔。,2.宏调用,(1)格式:实参表(2)说明:1)实参表:实元间用,隔开。实元可以是常数、register、存储单元。2)实元个数一般与哑元的个数相等。实际上,若实元个数哑元个数 多余实元不考虑。若实元个数哑元个数 多余哑元作“空”处理。,3.宏展开宏定义体取代源程序中宏名称。用实元取代哑元。Ex:7.1 用宏指令定义两个字操作数相乘得到一个16位的第三操作数(结果)。,MULTIPLY MACRO OPR1,OPR2,RESULT PUSH DX PUSH AX MOV AX,OPR1 IMUL OPR2 MOV RESULT,AX POP A
3、X POP DX ENDM,宏定义,宏调用,MULTIPLY CX,VAR,XYZ BX,形参,实参,4.宏定义和子程序的区别,子程序:由主程序在执行期间调用,只占自身大小的一个空间。宏定义:宏调用是在汇编期间展开,每调用一次,宏定义体展开一次,因此占有的存储空间与调用次数有关,次数越多,空间愈大。较长的功能段用子程序,较短的且变元较多的功能段用宏定义。,二.宏操作符常用的宏操作符为4个:、%、!,1.连接操作符和文本操作符(1)在定义体中,作为形参的前缀或后缀,展开时,把前后两部分的符号,合并成一个新的符号。EX:J&CONT CONT:NZ JNZ C JC S JS(2)在宏调用时,有的
4、实参中含有空格或逗号,这时用,把一个完整的实参括起来,作为一个单一的实参。Ex:宏定义MULTMACRO OP,RESULT MOV RESULT,AX宏调用MULTM,WORDPTRRES,形参,形参,EX:OP&UL OP:M MUL IM IMUL,宏展开:MOVWORD PTR RES,AX,2.表达式操作符%和字符操作符,(1)%格式:%表达式 功能:取得表达式的值,在展开期间,用这个数取代形参。Ex:P251 7.7(2)!指出!后的字符不作操作符使用,而是以字符本身的意义进行处理。Ex:!%(作为百分号用)三.局部符号伪操作LOCAL宏定义体中,允许使用符号,多次调用宏时,标号会
5、多重定义,处理办法用LOCAL伪操作。1.格式:LOCAL 局部标号名2.说明:LOCAL只能用在定义体中,且是macro伪操作的第一个语句,在macro和local间不允许有注释和分号标志。Ex:P252 7.8,四.宏库(P258),将若干个宏定义组成一个宏库以库文件的形式存放起来。当程序需要使用这些宏定义时,只需用include伪指令说明库文件名,就可以在程序中直接调用库文件中的宏定义,而不需要重复编写这些宏定义。格式:INCLUDE库文件名(扩展名为.LIB)ex:在macro.lib中定义两个宏input macro mov ah,01h int 21h endm disp macr
6、o buf lea dx,buf mov ah,09h int 21h endmex:P259,Ab.asmInclude macro.lib Disp str1InputDisp str2,*其他伪操作,.xall 清单中只列出产生目标代码的宏展开(默认情况).lall宏展开时列出包括注释在内的所有宏展开.sall宏展开时,不列出任何展开的信息;双分号注释,宏展开时,不予展开Ex:P256 7.12,*Purge伪操作用来删除不用的宏定义。用include 语句调用宏库时可以用Purge伪操作删除在调用程序中不用的宏定义。这不会影响宏库中的内容。格式:Purge Ex:purge promp
7、t,ex1:编写一个把1位十六进制数字ASCII码符转换为对应二进制数的宏。,hexbin macro hex_oper,result local nextmov al,hex_oper sub al,30h cmp al,10 jb next sub al,07hnext:and ax,000fhmov result,al endm;hex_oper-十六进制数字的ASCII码,data segmentAhex db Aresult db?data endscode segment assume cs:code,ds:datamain proc farstart:mov ax,data mo
8、v ds,ax hexbin ahex,result mov ah,4ch int 21hmain endpcode ends end start,ex2编制一个对键盘输入的小写母用大写字母显示出来的宏指令。,up_lower macro local next next:mov ah,01h int 21h CMP al,A jb next CMP al,Z ja next add al,20h mov dl,al mov ah,02h int 21h endm,code segment assume cs:code main proc far start:up_lower mov ah,4c
9、h int 21hmain endpcode ends end start,2.重复汇编需要连续地重复完成相同的或几乎相同的一组代码,可用重复汇编。,一.重复伪操作(P262)格式:REPT表达式 ENDM重复执行次数,由表达式的值决定。Ex7.13:x=0 rept 10 x=x+1 db x endmP262.Ex7.147.16,110分配到十个连续的内存单元中,指令体,二.不定重复伪操作(P264),1.IRP(1)格式:IRP形参,参数表 ENDM(2)说明:重复次数由参数表中的参数个数决定,参数表用括起来,参数间用,隔开,每重复一次,依次用参数表中的参数来代替形参一次。Ex7.17
10、:IRP x,DB x ENDM 参数十个,重复十次,也是把110分配到10个连续的内存单元中。Ex7.18,2.IRPC伪操作,(1)格式:IRPC形参,字符串(或字符串)ENDM(2)说明:重复次数由字符串中的字符个数决定,字符中间不能用,分隔。每重复一次,依次用字符串中的字符取代形参一次。Ex7.20:IRPC K,ABCD PUSHK&X ENDMEx7.19,PUSH AXPUSH BXPUSH CXPUSH DX,展开后,3.条件汇编(P265)根据条件判断是否把一段程序包括在汇编语言程序内,这用条件汇编来实现。,一.条件伪操作的一般格式IFXX ELSE ENDIF二.条件伪操作
11、可以在宏定义体内、体外,也允许嵌套任意次。Ex:p266 7.21 宏指令MAX把三个变元中的最大值放在AX中,MAXMACROK,A,B,CLOCALNEXT,OUTMOVAX,AIFK1IFK2CMPC,AXJLENEXTMOVAX,CENDIFNEXT:CMPB,AXJLEOUTMOVAX,BENDIFOUT:ENDM,(1)MAX1,P1KPAK10IFK1不满足条件,外部IF不执行,转至ENDM处。(2)MAX2,P,Q2KPAQBK10IFK1满足条件,执行下面的IFK2,而K20,不满足,内部IF不执行,转至NEXT处。,MAX3,P,Q,R呢?,三.宏定义体允许递归,条件伪操作
12、可结束宏调用。EX7.23 调用COUNT0POWERAX,3XN(1)COUNTCOUNT1COUNT1IFCOUNTN132满足条件POWERAX,3(2)COUNTCOUNT1COUNT2IFCOUNTN231满足条件POWERAX,3(3)COUNTCOUNT1COUNT3IFCOUNTN330 不满足条件,递归结束。,四.条件伪操作可以产生不同的转向指令,Ex7.22 p267当X与BRANCH间的距离128时(8位位移量),产生段内直接转移JMPSHORTX当X与BRANCH间的距离128时(16位位移量),产生段内直接近转移JMPNEARPTRX,Lesson 7.3 7.7 7.9,