资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,汇编语言程序设计,Assembly Language Programming,第七章 高级汇编语言技术,2,教学重点:,在掌握基本的汇编语言程序设计方法之后进一步学习,如何提高编程效率,的各种实用方法:,宏汇编,重复汇编,条件汇编,统称,宏结构,宏(,Macro,),是汇编语言的一个特点,它是与子程序类似又独具特色的另一种,简化源程序的方法。,3,宏,具有宏名的一段汇编语句序列,宏定义,时书写,宏指令,这段汇编语句序列的缩写,宏调用,时书写,宏展开,宏指令处用宏体代替的过程,宏汇编,时实现,7.1,宏汇编,宏的使用有三个步骤,:,宏定义、宏调用、宏展开。,4,macro_name,MACRO,哑元表,(宏定义体),ENDM,宏定义,哑元,相当于,C,语言函数定义中形参,,宏的参数,功能强大,颇具特色;,宏定义体,可以是任何合法的汇编语句,既可以是,硬指令序列,,又可以是,伪指令序列,,,也可以使用,已经定义过的宏指令,或者嵌套进行,宏定义,;,配合宏,还有,宏操作符,和,与宏有关的伪指令,。,7.1.1,宏的使用过程,5,宏定义,mainbegin,MACRO,;,定义名为,mainbegin,的宏,无参数,mov,ax,data,;,宏定义体,mov,ds,ax,ENDM,;,宏定义结束,mainend,MACRO,retnum,;,带有哑元,retnum,mov,al,retnum,;,宏定义中使用参数,mov,ah,4ch,int,21h,ENDM,宏注释符,7.1.1,宏的使用过程,6,macro_name,实元表,宏调用,start:,mainbegin,;,宏调用,建立,DS,内容,dispmsg,string,;,宏调用,显示字符串,mainend,0,;,宏调用,返回,DOS,end start,宏调用的实质,在汇编过程中进行宏展开;,实元,相当于,C,语言函数调用中的实参;,对宏指令的调用必须,先定义后调用,。,7.1.1,宏的使用过程,7,在汇编时,用宏定义体的代码序列,替代宏指令,的过程,宏展开,宏展开的具体过程,当汇编程序扫描源程序遇到,已有定义的宏调用,时,即用相应的宏定义体取代源程序的宏指令,同时用,位置匹配的实参对形参进行取代;,若实元数,哑元数,则,多余的实元,无效,;,若实元数,哑元数,则,多余的哑元,作,“,空,NULL,”,处理。,7.1.1,宏的使用过程,8,宏展开,举例,start:,mainbegin,;,宏指令,1,mov,ax,data,;,宏展开,1,mov,ds,ax,mainend,0,;,宏指令,1,mov,al,0,;,宏展开,1,mov,ah,4ch,1,int,21,7.1.1,宏的使用过程,9,宏的参数使用非常灵活,宏的参数,宏定义,时,,可以,无参数,,例如:,mainbegin,可以带有,一个参数,,例如:,mainend,也可以具有,多个参数,例如:例,7.1,实际参数可以是,常数、变量、存储单元、指令,(操作码)或它们的一部分,也可以是,表达式。,7.1.2,宏的参数,10,multiply,MACRO,opr1,opr2,result,push,dx,push ax,mov,ax,opr1,imul,opr2,mov,result,ax,pop ax,pop,dx,ENDM,宏展开:,1 push,dx,1 push ax,1,mov,ax,cx,1,imul,var,1,mov,xyzbx,ax,1 pop ax,1 pop,dx,例,7.1,两个字相乘,(,多个变元,),multiply,cx,var,xyzbx,7.1.2,宏的参数,宏定义,:,宏调用,:,11,savereg,MACRO,push ax,push,bx,push,cx,push,dx,push,si,push,di,ENDM,宏调用,:,savereg,宏展开,:,1,push ax,1,push,bx,1,push,cx,1,push,dx,1,push,si,1,push,di,例,7.2,保存寄存器(,无参数,),7.1.2,宏的参数,宏定义:,12,宏定义:,shrot,MACRO,op,od,num,push,cx,mov,cl,num,op,od,cl,pop,cx,ENDM,宏展开:,1,push,cx,1,mov,cl,7,1,shl,ax,cl,1,pop,cx,1,push,cx,1,mov,cl,6,1,ror,ax,cl,1,pop,cx,例,7.3,统一循环移位和移位指令,(,变元是操作码,),宏调用:,shrot,shl,ax,7,shrot,ror,x,6,7.1.2,宏的参数,13,宏定义:,shift,MACRO,op,od,num,push,cx,mov,cl,num,s&op,od,cl,pop,cx,ENDM,例,7.4,统一移位指令,(,变元是操作码的一部分,),宏调用,:,shift al,ax,4,shift hr ax,4,宏展开,:,1,push,cx,1,mov,cl,4,1,s,al,ax,cl,1,pop,cx,1,push,cx,1,mov,cl,4,1,s,hr,ax,cl,1,pop,cx,替换操作符,7.1.2,宏的参数,14,与宏有关的伪操作,局部标号伪,操作,LOCAL,标号列表,宏定义体采用了标号,应使用,LOCAL,加以说明,它必须是宏定义,MACRO,语句之后的,第一条语句,,宏展开时,,LOCAL,定义的标号也由,?0000?FFFF,替代,宏定义删除伪,操作,PURGE,宏名表,不需要某个宏定义时,可以把它删除,宏定义退出伪,操作,EXITM,伪指令,EXITM,表示结束当前宏调用的展开,7.1.3,与宏有关的伪操作,15,宏定义,:,absol,MACRO,oper,LOCAL,next,cmp,oper,0,jge,next,neg,oper,next,:,ENDM,宏调用,:,absol,var,absol,bx,宏展开,:,1,cmp,var,0,1,jge,?0000,1,neg,var,?0000:,1,cmp,bx,0,1,jge,?0001,1,neg,bx,1?0001:,例,7.5,求绝对值,(,使用,LOCAL,伪操作,),7.1.3,与宏有关的伪操作,16,宏定义:,add,MACRO,opr1,opr2,result,ENDM,宏调用:,add,xx,yy,zz,purge,add,;,取消宏定义,宏指令名与指令助记符或伪操作名相同,宏指令的优先级最高。,7.1.3,与宏有关的伪操作,17,;,宏注释符,,,用于表示在宏定义中的注释,。采用这个符号的注释,在宏展开时不出现。,&,替换操作符,,,用于将参数与其他字符分开,。如果参数紧接在其他字符之前或之后,或者参数出现在带引号的字符串中,就必须使用该伪操作符。,%,表达式操作符,用在宏调用中,表示将后跟的一个表达式的值作为实参,而不是将表达式本身作为参数。,宏操作符,7.1.4,宏操作符,18,字符串传递操作符,用于括起字符串,。在宏调用中,如果传递的字符串实参数含有逗号、空格等间隔符号,则必须用这对操作符,以保证字符串的完整。,!,转义操作符,用于指示其后的一个字符作为一般字符,不含特殊意义。,宏操作符,7.1.4,宏操作符,19,例,7.6,(,使用,;,注释,),;,注释,宏展开时,,;,后面的注释不予展开。,Q,MACRO,m,;display a message,每次展开保留此注释,;,m is a string,每次展开不保留此注释,ENDM,7.1.4,宏操作符,20,leap,macro,cond,lab,j,&,cond,lab,endm,宏定义:,宏调用:,leap,z,there,leap,nz,here,宏展开:,1,j,z,there,1,j,nz,here,例,7.7(,变元是操作码的一部分,),&,宏展开时,合并,前后两个符号形成一个符号,7.1.4,宏操作符,21,msggen,macro,lab,num,xyz,lab,&num,db Hello MR.&XYZ,endm,宏定义:,宏调用:,Msggen msg,1,Wang,宏展开:,例,7.8(,变元是,ASCII,串,),msg,1,db Hello MR.Wang,7.1.4,宏操作符,22,宏定义,DATA1,MACRO,A,,,B,DW A,,,B,ENDM,宏调用,X=10,Y=20,DATA1,%X,,,%Y,DATA2,X,,,Y,例,7.9,(,使用,%,),宏展开,1 DW 10,,,20,1 DW X,,,Y,%,表达式,汇编程序将,%,后面的表达式转换为数字,并在展开期间用这个数取代哑元。,7.1.4,宏操作符,23,dstring,macro string,db,&,string,&,0dh,0ah,$,endm,宏定义:,宏调用:,dstring,dstring,0,!,Number,!,宏展开:,1 db,This is a example.,0dh,0ah,$,1 db,0 Number 10,0dh,0ah,$,例,7.10 (,使用,和,!,),传递操作符,!,转义操作符,7.1.4,宏操作符,24,7.1.5,在宏定义内使用宏,宏定义体中可以使用宏,有两种情形:,宏定义中可以,使用宏调用,,前提是必须先定义后调用,宏体中,包含宏定义,25,例,7.11,在宏定义内使用宏调用,宏定义:,dif,MACRO x,y,mov,ax,x,sub,ax,y,ENDM,difsqr,MACRO x,y,z,push,dx,push ax,dif,x,y,imul,ax,mov,z,ax,pop ax,pop,dx,ENDM,宏调用,:,difsqr,v1,v2,v3,宏展开,:,1,push,dx,1,push ax,2,mov,ax,v1,2,sub ax,v2,1,imul,ax,1,mov,z,ax,1,pop ax,1 pop,dx,26,例,7.12,在宏定义内使用宏调用,宏定义:,dfmac,MACRO,mnam,op,mnam,MACRO,x,y,z,push ax,mov,ax,x,op,ax,y,mov,z,ax,pop ax,ENDM,ENDM,宏调用:,dfmac,addition,add,dfmac,logor,or,则形成两条宏指令:,addition,logor,宏调用宏展开:,addtion,x,y,z,1 pushax,1,mov,ax,x,1 add,ax,y,1,mov,z,ax,1 popax,logor,x,y,z,1 pushax,1,mov,ax,x,1 or,ax,y,1,mov,z,ax,1 popax,27,源程序,(ASM,文件,),经汇编程序汇编,主要输出是,OBJ,文件,和,LST,文件,(,列表文件,),。,LST,文件同时列出源程序和机器语言程序清单,并给出符号表。,.,LALL,在,LST,清单中列出宏展开后的,全部语句,.SALL,在,LST,清单中,不列出任何宏展开后的语句,.XALL,只列出产生,目标代码的语句,Page256257,例,7.12,列表伪操作,7.1.6,列表伪操作,28,1.,缩短源代码,2.,扩充指令集,3.,改变某些助记符的意义,汇编语言程序指令,指令,伪指令,(,伪操作,),宏指令,宏指令的用途,7.1,宏汇编,29,子程序:在程序执行期间被调用,只占用自身大小的一段空间,主程序,call,sub1,call,sub1,call,sub1,子程序,sub1,ret,宏调用与子程序调用的区别,7.1,宏汇编,30,宏定义,宏调用,宏展开,Q macro,x,y,endm,Q,a,b,Q,c,d,Q,e,f,宏调用:在
展开阅读全文