《汇编语言程序设计》2020/6/3第7章高级汇编语言技术18086/8088和ARM核汇编语言程序设计第7章高级汇编语言技术《汇编语言程序设计》2020/6/3第7章高级汇编语言技术2课前思考•1.宏汇编技术与子程序技术相比有哪些优、缺点?它们的工作方式有何差别?2.虚参与实参是否应一一对应?3.哑元表中的变元可以取何种值?4.&操作符及%操作符如何应用?5.宏定义体内的程序段有标号怎么办?6.宏定义允许嵌套、递归调用吗?7*.IRP与IRPC之间的区别?8.条件汇编中有哪几种条件?9*.高级语言结构中有哪几种形式?《汇编语言程序设计》2020/6/3第7章高级汇编语言技术3•教学目的:了解并掌握宏汇编、重复汇编及不定重复汇编、条件汇编和高级语言结构编程技术。•教学重点:子程序的调用和返回。保护与恢复寄存器。子程序的参数传送。伪操作STRUC的定义及应用。嵌套与递归子程序。DOS系统功能调用。•教学重点:宏调用的优点、宏调用和子程序调用工作方式的差别、虚参与实元、哑元表中的变元取值的多样性、&操作符、%操作符、LOCAL伪操作解决宏定义体中的符号问题、宏定义的嵌套、递归、重复汇编、不定重复汇编、条件汇编中的多种条件。•教学难点:宏调用的优点、宏调用和子程序调用工作方式的差别、虚参与实元、哑元表中的变元取值的多样性、&操作符、%操作符、LOCAL伪操作解决宏定义体中的符号问题、宏定义的嵌套、递归、重复汇编、不定重复汇编、条件汇编中的多种条件。•教学方法及手段:课堂讲授、小结讲评。•课外作业:⑹P1771,5•学时分配:4•教学内容:宏汇编、重复汇编、条件汇编•自学内容:高级语言结构《汇编语言程序设计》2020/6/3第7章高级汇编语言技术47.1宏汇编7.3条件汇编7.2重复汇编第7章高级汇编语言技术7.4库的使用《汇编语言程序设计》2020/6/3第7章高级汇编语言技术5什么是宏?宏(或宏指令)是源程序中一段有独立功能的程序代码,只需定义一次,可以多次调用。为什么使用宏汇编?在编制汇编语言程序过程中,有些功能程序段需要多次重复使用,所不同的只是参与操作的操作数。使用宏指令语句可以减少程序书写错误,缩短源程序长度,使源程序编写像高级语言一样清晰、简洁。特别是使用宏库后,可以提高编程效率。为了减少编程的工作量,通常采用两种方法:①将程序段编写为独立的子程序②将程序段定义成宏7.1宏汇编由此引出宏定义、调用、参数传递、嵌套等问题《汇编语言程序设计》2020/6/3第7章高级汇编语言技术6宏定义的格式由伪指令MACRO与ENDM实现。形式如下:宏指令名MACRO[形式参数表]...;宏体ENDM7.1.1宏定义7.1宏汇编说明:(1)宏指令名由编程序者自定,但必须符合标号的命名规则。(2)MACRO和ENDM是一对伪指令,分别表示宏定义的开始和结束。(3)宏体必须是指令、伪指令及宏指令构成的程序段。(4)形参表可根据需要作取舍。当需要设置多个形参时,各形参之间要用逗号分隔。《汇编语言程序设计》2020/6/3第7章高级汇编语言技术7宏定义的功能将宏体定义为一条宏指令,以便在其后的程序中通过对宏指令的调用来使用对应的宏体。7.1宏汇编7.1.1宏定义《汇编语言程序设计》2020/6/3第7章高级汇编语言技术8例7.1(教材例11.1)以下宏定义所定义的宏指令AX10可以实现寄存器AX内容乘以10的功能。(见hong.asm)AX10MACRO;宏名AX10PUSHDXSALAX,1MOVDX,AXSALAX,1SALAX,1ADDAX,DXPOPDXENDM7.1宏汇编7.1.1宏定义注意和段定义及过程定义的区别《汇编语言程序设计》2020/6/3第7章高级汇编语言技术97.1宏汇编7.1.2宏调用和宏扩展宏调用的格式宏调用的格式为:宏指令名[实参表]说明:⑴宏指令名所指定的宏指令的定义必须放在该宏调用之前。(2)实参表通常与宏定义中形参表相对应。当需要使用多个实参时,各实参之间要用逗号分隔。《汇编语言程序设计》2020/6/3第7章高级汇编语言技术10宏扩展宏汇编程序在汇编源程序时自动用宏指令的内容代替宏指令,叫宏扩展。7.1宏汇编7.1.2宏调用和宏扩展当宏汇编程序在汇编时扫描到宏指令语句时,就把宏定义中宏体的程序段目标代码插入在宏指令语句的位置上,如果是带参数的宏指令语句,同时把相应实参一一替代宏体中对应形参的位置,对原有宏体目标代码作相应修改。这样,在程序的目标代码中,每个宏指令语句位置上都包含有相应宏体的目标代码,因此宏指令的使用不会减少程序的目标代码长度。注意:它与子程序的差别。宏在翻译阶段起作用,子程序在执行阶段起作用。《汇编语言程序设计》2020/6/3第7章高级汇编语言技术11两个字操作数相乘(见hong.asm)宏定义:MULTIPLYMACROOPR1,OPR2,RESULTPUSHDXPUSHAXMOVAX,OPR1IMULOPR2MOVRESULT,AXPOPAXPOPDXENDM宏调用:…MULTIPLYCX,VAR,XYZ[BX]…MULTIPLY240,BX,SAVE7.1宏汇编7.1.2宏调用和宏扩展注意现场保护及其后的恢复《汇编语言程序设计》2020/6/3第7章高级汇编语言技术12宏展开:…1PUSHDX1PUSHAX1MOVAX,CX1IMULVAR1MOVXYZ[BX],AX1POPAX1POPDX…1PUSHDX1PUSHAX1MOVAX,2401IMULBX1MOVSAVE,AX1POPAX1POPDX…7.1宏汇编7.1.2宏调用和宏扩展MULTIPLYCX,VAR,XYZ[BX]…MULTIPLY240,BX,SAVE宏调用:《汇编语言程序设计》2020/6/3第7章高级汇编语言技术13《汇编语言程序设计》2020/6/3第7章高级汇编语言技术147.1宏汇编7.1.3宏定义和宏调用中参数的使用实参和形参是一一对应的,若实参的个数多于形参,则忽略多余的实参;若实元的个数少于哑参,则多余的形参为空。形参可以作为宏体中指令的助记符、操作数及标号,宏调用用实参取代形参时必须保证所产生的指令是有效。《汇编语言程序设计》2020/6/3第7章高级汇编语言技术15变元可以是操作码。(见hong.asm)宏定义:FOOMACROP1,P2,P3MOVAX,P1P2P3ENDM宏调用:FOOWORD_VAR,INC,AX宏展开:1MOVAX,WORD_VAR1INCAX7.1宏汇编7.1.3宏定义和宏调用中参数的使用《汇编语言程序设计》2020/6/3第7章高级汇编语言技术16宏运算符&、<、>、%及!的使用(1)形参可以作为宏体中指令助记符、操作数或标号的某一部分,在宏体中必须使用“&”。(2)当某一个实参中含有空格、逗号等分隔符时,必须用“<>”将其括起,以免被视作多个实参。(3)在宏调用时,若要求将实参所代表的数值(而不是实参本身)替代形参,则必须在实参前使用“%”。7.1宏汇编7.1.3宏定义和宏调用中参数的使用《汇编语言程序设计》2020/6/3第7章高级汇编语言技术17变元可以是操作码的一部分。(见hong.asm)CONCALLMACROCON,SUBNLOCALGOONJN&CONGOONCALLSUBNGOON:NOPENDM该宏定义所定义的宏指令CONCALL可以实现子程序的条件调用。设有宏调用CONCALLB,SUBl则其宏扩展为:+JNB??0000+CALLSUB1+??0000:NOP7.1宏汇编7.1.3宏定义和宏调用中参数的使用变元是操作码的一部分注意local的使用《汇编语言程序设计》2020/6/3第7章高级汇编语言技术187.1宏汇编7.1.3宏定义和宏调用中参数的使用〈〉的使用(见hong1.asm)STKMACROXSSEGSEGMENTSTACKDBXSSEGENDSENDM若某个源程序需要定义200个字节,初值为0的堆栈段,则可以使用宏调用:STK<200DUP(0)>其宏扩展为:+SSEGSEGMENTSTACK+DB200DUP(0)+SSEGENDS《汇编语言程序设计》2020/6/3第7章高级汇编语言技术197.1宏汇编7.1.3宏定义和宏调用中参数的使用%的使用DISPMACROXDB'ANSWER:','&X','$'ENDM则用符号“%”的宏调用:DISP%(2*11-8)产生的宏扩展为:+DB‘ANSWER:’,‘14’,‘$’不使用符号“%”的宏调用:DISP2*11-8产生的宏扩展却是:+DB‘ANSWER:’,‘2*11-8’,‘$’《汇编语言程序设计》2020/6/3第7章高级汇编语言技术20注意:在实参中使用“&”、“”、“”、“%”等符号,但不作宏运算符时,就必须在其前使用“!”。(见hong1.asm)如:DISPMACROXDB'ANSWER:','&X','$'ENDM则用符号“!%”的宏调用:DISP!%(2*11-8)产生的宏扩展为:+DB‘ANSWER:’,‘%(2*11-8)’,‘$’7.1宏汇编7.1.3宏定义和宏调用中参数的使用《汇编语言程序设计》2020/6/3第7章高级汇编语言技术21《汇编语言程序设计》2020/6/3第7章高级汇编语言技术22宏指令一经定义便可在源程序中调用,若宏体中使用了标号或变量,在多次宏调用时就会出现多个相同标号或出现变量的重复定义,使用LOCAL伪指令可以解决这一问题。LOCAL伪指令的使用方法及功能如下:(1)LOCAL伪指令的一般格式:LOCAL标号及变量表各标号、变量之间均用逗号分隔。(2)在宏定义中,LOCAL伪指令必须紧接MACRO伪指令之后。(3)在处理各个宏调用时,汇编程序将自动以??0000,??0001,……??FFFF替代LOCAL从伪指令列出的各个标号或变量,从而避免多次宏调用时出现多个相同标号或出现变量重复定义的问题。(见hong.asm)7.1.3宏定义和宏调用中参数的使用7.1宏汇编《汇编语言程序设计》2020/6/3第7章高级汇编语言技术237.1宏汇编7.1.4宏嵌套宏嵌套与子程序一样包括两种情况:其一,宏定义的宏体中包括宏调用,即在宏体中调用宏指令。在这种情况下要注意,其中调用的宏指令必须先行定义;其二,宏体中包括宏定义。注意:与所有的编程语言一样,不能在源程序中直接调用内层定义的宏指令。换言之,在源程序中只有通过外层宏指令的调用才能调用内层宏指令,不能跨层调用。《汇编语言程序设计》2020/6/3第7章高级汇编语言技术24例:在宏定义中使用宏调用(见hong.asm)SHRFMARCOXMOVCL,XSARAL,CLENDMSHRFQTMACROY,Z,RESULTPUSHAXPUSHCXMOVAL,ZSHRFYANDAL,ZMOVRESULT,ALPOPCXPOPAXENDM宏定义宏展开宏调用SHRFQT2,10,AH1PUSHAX1PUSHCX1MOVAL,102MOVCL,22SARAL,CL1ANDAL,101MOVAH,AL1POPCX1POPAX《汇编语言程序设计》2020/6/3第7章高级汇编语言技术25例:在宏定义中也可以定义宏定义SHEATMARCOINMOVE,OPTRINMOVMACROX,Y,RESULTPUSHAXPUSHCXMOVCL,XMOVAL,YS&OPTRAL,CLMOVRESULT,ALPOPCXPOPAXENDMENDM宏定义生成宏定义SHRF宏调用SHEATSHRF,ARSHRFMACROX,Y,RESULTPUSHAXPUSHCXMOVCL,XMOVAL,YSARAL,CLMOVRESULT,ALPOPCXPOPAXENDM《汇编语言程序设计》2020/6/3第7章高级汇编语言技术26例:在宏定义中也可以定义宏定义宏展开1PUSHAX1PUSHCX1MOVCL,21MOVAL,401SARAL,CL1MOVDL,AL1POPCX1POPAX宏调用SHRF2,40,DL《汇编语言程