计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术18086/8088和ARM核汇编语言程序设计第11章高级汇编语言技术计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术211.1宏汇编11.3条件汇编11.2重复汇编第11章高级汇编语言技术11.4库的使用计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术3什么是宏?宏(或宏指令)是源程序中一段有独立功能的程序代码,只需定义一次,可以多次调用。为什么使用宏汇编?在编制汇编语言程序过程中,有些功能程序段需要多次重复使用,所不同的只是参与操作的操作数。使用宏指令语句可以减少程序书写错误,缩短源程序长度,使源程序编写像高级语言一样清晰、简洁。特别是使用宏库后,可以提高编程效率。为了减少编程的工作量,通常采用两种方法:①将程序段编写为独立的子程序②将程序段定义成宏11.1宏汇编由此引出宏定义、调用、参数传递、嵌套等问题计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术4宏定义的格式由伪指令MACRO与ENDM实现。形式如下:宏指令名MACRO[形式参数表]...;宏体ENDM11.1.1宏定义11.1宏汇编说明:(1)宏指令名由编程序者自定,但必须符合标号的命名规则。(2)MACRO和ENDM是一对伪指令,分别表示宏定义的开始和结束。(3)宏体必须是指令、伪指令及宏指令构成的程序段。(4)形参表可根据需要作取舍。当需要设置多个形参时,各形参之间要用逗号分隔。计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术5宏定义的功能将宏体定义为一条宏指令,以便在其后的程序中通过对宏指令的调用(宏调用)来使用对应的宏体。11.1宏汇编11.1.1宏定义注意:宏应该先定义,再调用.计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术6例11.1以下宏定义所定义的宏指令AX10可以实现寄存器AX内容乘以10的功能。AX10MACRO;宏名AX10PUSHDXSALAX,1MOVDX,AXSALAX,1SALAX,1ADDAX,DXPOPDXENDM11.1宏汇编11.1.1宏定义计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术711.1宏汇编11.1.2宏调用和宏扩展宏调用的格式宏调用的格式为:宏指令名[实参表]说明:宏指令名所指定的宏指令的定义必须放在该宏调用之前。实参表通常与宏定义中形参表相对应。当需要使用多个实参时,各实参之间要用逗号分隔。实参可以是常数、寄存器、存储单元、地址表达式、指令的操作码或者是操作码的一部分。计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术8宏扩展在汇编源程序时自动用宏指令的内容(宏体)代替宏指令,叫宏扩展。11.1宏汇编11.1.2宏调用和宏扩展宏展开的具体过程是:当汇编程序扫描源程序遇到已有定义的宏调用(宏指令)时,即用相应的宏定义体取代源程序的宏指令,同时用位置匹配的实参对形参进行取代这样,在程序的目标代码中,每个宏指令语句位置上都包含有相应宏体的目标代码,因此宏指令的使用不会减少程序的目标代码长度。注意:它与子程序的差别。前者在翻译阶段,后者在执行阶段起作用。计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术911.1宏汇编11.1.2宏调用和宏扩展CallQCallQCallQQ:RET子程序QQA,BQC,DQE,FQMACROX,YENDM主程序主程序主程序展开子程序调用和宏调用的工作方式计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术10两个字操作数相乘宏定义:MULTIPLYMACROOPR1,OPR2,RESULTPUSHDXPUSHAXMOVAX,OPR1IMULOPR2MOVRESULT,AXMOVRESULT+2,DXPOPAXPOPDXENDM宏调用:…MULTIPLYCX,VAR,XYZ[BX]…MULTIPLY240,BX,SAVE11.1宏汇编11.1.2宏调用和宏扩展计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术11宏展开:…1PUSHDX1PUSHAX1MOVAX,CX1IMULVAR1MOVXYZ[BX],AX1MOVXYZ[BX]+2,DX1POPAX1POPDX…1PUSHDX1PUSHAX1MOVAX,2401IMULBX1MOVSAVE,AX1MOVSAVE,DX1POPAX1POPDX…11.1宏汇编11.1.2宏调用和宏扩展计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术1211.1宏汇编11.1.3宏定义和宏调用中参数的使用实参和形参是一一对应的,若实参的个数多于形参,则忽略多余的实参;若实参的个数少于形参,则多余的形参为空。形参可以作为宏体中指令的助记符、操作数及标号,宏调用用实参取代形参时必须保证所产生的指令是有效。计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术13宏运算符&、<、>、%及!的使用(1)形参可以作为宏体中指令助记符、操作数或标号的某一部分,在宏体中必须使用“&”。(2)当某一个实参中含有空格、逗号等分隔符时,必须用“<>”将其括起,以免被视作多个实参。(3)在宏调用时,若要求将实参所代表的数值(而不是实参本身)替代形参,则必须在实参前使用“%”。11.1宏汇编11.1.3宏定义和宏调用中参数的使用计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术14行参(变元)可以是操作码。宏定义:FOOMACROP1,P2,P3MOVAX,P1P2P3ENDM宏调用:FOOWORD-VAR,INC,AX宏展开:1MOVAX,WORD-VAR1INCAX11.1宏汇编11.1.3宏定义和宏调用中参数的使用计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术15变元可以是操作码的一部分。CONCALLMACROCON,SUBNLOCALEGOONJN&CONGOONCALLSUBNGOON:NOPENDM该宏定义所定义的宏指令CONCALL可以实现子程序的条件调用。设有宏调用CONCALLC,SUBl则其宏扩展为:+JNC??0000??0000是汇编程序自动产生的标号+CALLSUB1+??0000:NOP11.1宏汇编11.1.3宏定义和宏调用中参数的使用计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术1611.1宏汇编11.1.3宏定义和宏调用中参数的使用〈〉的使用STKMACROXSSEGSEGMENTSTACKDBXSSEGENDSENDM若某个源程序需要定义200个字节,初值为0的堆栈段,则可以使用宏调用:STK<200DUP(0)>其宏扩展为:+SSEGSEGMENTSTACK+DB200DUP(0)+SSEGENDS—字符串传递操作符,用于括起字符串。在宏调用中,如果传递的字符串实参数含有逗号、空格等间隔符号,则必须用这对操作符,以保证字符串的完整.计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术1711.1宏汇编11.1.3宏定义和宏调用中参数的使用%的使用DISPMACROXDB‘ANSWER:’,‘&X’,‘$’ENDM则用符号“%”的宏调用:DISP%(2*11-8)产生的宏扩展为:+DB‘ANSWER:’,‘14’,‘$’不使用符号“%”的宏调用:DISP2*11-8产生的宏扩展却是:+DB‘ANSWER:’,‘2*11-8’,‘$’计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术18注意:在实参中使用“&”、“”、“”、“%”等符号,但不作宏运算符时,就必须在其前使用!”。如:DISPMACROXDB‘ANSWER:’,‘&X’,‘$’ENDM宏调用:DISP!%(2*11-8)产生的宏扩展为:+DB‘ANSWER:’,‘%(2*11-8)’,‘$’11.1宏汇编11.1.3宏定义和宏调用中参数的使用计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术19宏指令一经定义便可在源程序中调用,若宏体中使用了标号或变量,在多次宏调用时就会出现多个相同标号或出现变量的重复定义,使用LOCAL伪指令可以解决这一问题。LOCAL伪指令的使用方法及功能如下:(1)LOCAL伪指令的一般格式:LOCAL标号及变量表各标号、变量之间均用逗号分隔。(2)在宏定义中,LOCAL伪指令必须紧接MACRO伪指令之后。(3)在处理各个宏调用时,汇编程序将自动以??0000,??0001,……??FFFF替代LOCAL从伪指令列出的各个标号或变量,从而避免多次宏调用时出现多个相同标号或出现变量重复定义的问题。11.1.3宏定义和宏调用中参数的使用11.1宏汇编计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术2011.1宏汇编11.1.4宏嵌套宏嵌套象子程序一样包括两种情况:其一,宏定义的宏体中包括宏调用,即在宏体中调用宏指令。在这种情况下要注意,其中调用的宏指令必须先行定义;其二,宏体中包括宏定义。注意:向所有的编程语言一样,不能在源程序中直接调用内层定义的宏指令。换言之,在源程序中只有通过外层宏指令的调用才能调用内层宏指令,不能跨层调用。计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术2111.1宏汇编11.1.4宏嵌套(1)宏指令名可以与指令助记符及伪指令名同名。在此情况下,宏指令的优先级较高,同名的指令或伪指令的原有功能失效。在利用这一方法改变了某个指令助记符或伪指令名的原有功能后,可以通过宏调用来使用新定义的功能。若要恢复其原有功能,只要使用清除宏定义的伪指令:PURGE宏指令名表例如:CBW是一个已定义宏名那么下面:CBW;宏调用……PURGECBW;清除对CBW的宏定义CBW;将(AL)的符号扩展到AH计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术2211.1宏汇编11.1.4宏嵌套(2)宏定义时也要注意现场的保护和恢复。注意宏扩展后程序的一致性、完整性。计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术23比较是源程序级的简化:宏调用在汇编时进行程序语句的展开,不需要返回;不减小目标程,执行速度没有改变通过形参、实参结合实现参数传递,简捷直观、灵活多变是目标程序级的简化:子程序调用在执行时由CALL指令转向、RET指令返回;形成的目标代码较短,执行速度减慢需要利用寄存器、存储单元或堆栈等传递参数宏子程序11.1宏汇编11.1.2宏调用和宏扩展计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术24宏与子程序具有各自的特点,程序员应该根据具体问题选择使用那种方法。通常,当程序段较短或要求较快执行时,应选用宏;当程序段较长或为减小目标代码时,要选用子程序。比较结论宏子程序11.1宏汇编11.1.2宏调用和宏扩展计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术2511.3条件汇编11.1宏汇编11.4库的使用11.2重复汇编第11章高级汇编语言技术计算机科学与技术系《汇编语言程序设计》2020/2/16第11章高级汇编语言技术2611.2.1使用REPT伪指令的重复汇编结构11.2重复汇编格式:REPT整数表达式重复体ENDM功能:使汇编程序对重复体作重复汇编,以整数表达式的值作为重复次数。例如:CHAR=41HREPT10DBCHARCHAR=CHAR+1ENDM其结果等价于:DB41H,42H,43H,44H,45