汇编语言程序设计第11章高级汇编语言技术.ppt
2023/10/26,1,第11章 高级汇编语言技术,2023/10/26,2,11.1 宏汇编,11.3 条件汇编,11.2 重复汇编,第11章 高级汇编语言技术,11.4 库的使用,2023/10/26,3,什么是宏?宏(或宏指令)是源程序中一段有独立功能的程序代码,只需定义一次,可以多次调用。为什么使用宏汇编?在编制汇编语言程序过程中,有些功能程序段需要多次重复使用,所不同的只是参与操作的操作数。使用宏指令语句可以减少程序书写错误,缩短源程序长度,使源程序编写像高级语言一样清晰、简洁。特别是使用宏库后,可以提高编程效率。为了减少编程的工作量,通常采用两种方法:将程序段编写为独立的子程序 将程序段定义成宏,11.1 宏汇编,由此引出宏定义、调用、参数传递、嵌套等问题,2023/10/26,4,宏定义的格式 由伪指令MACRO与ENDM实现。形式如下:宏指令名MACRO 形式参数表;宏体 ENDM,11.1.1 宏定义,11.1 宏汇编,说明:(1)宏指令名由编程序者自定,但必须符合标号的命名规则。(2)MACRO和ENDM是一对伪指令,分别表示宏定义的开始和结束。(3)宏体必须是指令、伪指令及宏指令构成的程序段。(4)形参表可根据需要作取舍。当需要设置多个形参时,各形参之间要用逗号分隔。,2023/10/26,5,宏定义的功能,将宏体定义为一条宏指令,以便在其后的程序中通过对宏指令的调用来使用对应的宏体。,11.1 宏汇编,11.1.1 宏定义,2023/10/26,6,例11.1 以下宏定义所定义的宏指令AX10可以实现寄存器AX内容乘以10的功能。,AX10 MACRO;宏名 AX10 PUSH DX SAL AX,1 MOV DX,AX SAL AX,1 SAL AX,1 ADD AX,DX POP DX ENDM,11.1 宏汇编,11.1.1 宏定义,2023/10/26,7,11.1 宏汇编,11.1.2 宏调用和宏扩展,宏调用的格式,宏调用的格式为:宏指令名 实参表,说明:宏指令名所指定的宏指令的定义必须放在该宏调用 之前。(2)实参表通常与宏定义中形参表相对应。当需要使用多个实参时,各实参之间要用逗号分隔。,2023/10/26,8,宏扩展,宏汇编程序在汇编源程序时自动用宏指令的内容代替宏指令,叫宏扩展。,11.1 宏汇编,11.1.2 宏调用和宏扩展,当宏汇编程序在汇编时扫描到宏指令语句时,就把宏定义中宏体的程序段目标代码插入在宏指令语句的位置上,如果是带参数的宏指令语句,同时把相应实参一一替代宏体中对应形参的位置,对原有宏体目标代码作相应修改。这样,在程序的目标代码中,每个宏指令语句位置上都包含有相应宏体的目标代码,因此宏指令的使用不会减少程序的目标代码长度。,注意:它与子程序的差别。前者在翻译阶段,后者在执行阶段起作用。,2023/10/26,9,两个字操作数相乘宏定义:MULTIPLYMACRO OPR1,OPR2,RESULTPUSHDXPUSHAXMOVAX,OPR1IMULOPR2MOVRESULT,AXPOPAXPOPDXENDM宏调用:MULTIPLYCX,VAR,XYZBXMULTIPLY240,BX,SAVE,11.1 宏汇编,11.1.2 宏调用和宏扩展,2023/10/26,10,宏展开(借助列表文件可看到宏展开的效果)1PUSH DX 1PUSH AX 1MOV AX,CX 1IMUL VAR 1MOV XYZBX,AX 1POP AX 1POP DX 1PUSH DX 1PUSH AX 1MOV AX,240 1IMUL BX 1MOV SAVE,AX 1POP AX 1POP DX,11.1 宏汇编,11.1.2 宏调用和宏扩展,2023/10/26,11,11.1 宏汇编,宏定义和宏调用中参数的使用,实参和形参是一一对应的,若实参的个数多于形参,则忽略多余的实参;若实元的个数少于哑参,则多余的形参为空。,形参可以作为宏体中指令的助记符、操作数及标号,宏调用用实参取代形参时必须保证所产生的指令是有效。,2023/10/26,12,宏运算符、及!的使用,(1)形参可以作为宏体中指令助记符、操作数或标 号的某一部分,在宏体中必须使用“”。,(2)当某一个实参中含有空格、逗号等分隔符时,必 须用“”将其括起,以免被视作多个实参。,(3)在宏调用时,若要求将实参所代表的数值(而不是 实参本身)替代形参,则必须在实参前使用“”。,11.1 宏汇编,宏定义和宏调用中参数的使用,2023/10/26,13,变元可以是操作码。宏定义:FOO MACROP1,P2,P3MOV AX,P1P2P3ENDM宏调用:FOO WORDVAR,INC,AX宏展开:1MOVAX,WORDVAR1INCAX,11.1 宏汇编,宏定义和宏调用中参数的使用,2023/10/26,14,变元可以是操作码的一部分。CONCALL MACRO CON,SUBN LOCALE GOON JN&CON GOON CALL SUBN GOON:NOP ENDM该宏定义所定义的宏指令CONCALL可以实现子程序的条件调用。设有宏调用 CONCALL C,SUBl则其宏扩展为:+JNC?0000+CALL SUB1+?0000:NOP,11.1 宏汇编,宏定义和宏调用中参数的使用,2023/10/26,15,11.1 宏汇编,宏定义和宏调用中参数的使用,的使用STK MACRO XSSEG SEGMENT STACK DB XSSEG ENDSSTK ENDM若某个源程序需要定义200个字节,初值为0的堆栈段,则可以使用宏调用:STK 200 DUP(0)其宏扩展为:+SSEG SEGMENT STACK+DB 200 DUP(0)+SSEG ENDS,2023/10/26,16,11.1 宏汇编,宏定义和宏调用中参数的使用,%的使用 DISP MACRO X DBANSWER:,&X,$ENDM则用符号“”的宏调用:DISP%(2*11-8)产生的宏扩展为:+DB ANSWER:,14,$不使用符号“”的宏调用:DISP 2*11-8产生的宏扩展却是:+DB ANSWER:,2*11-8,$,2023/10/26,17,注意:在实参中使用“&”、“”、“”、“%”等符号,但不作宏运算符时,就必须在其前使用!”。,如:DISP MACRO X DBANSWER:,&X,$ENDM则用符号“!”的宏调用:DISP!%(2*11-8)产生的宏扩展为:+DB ANSWER:,%(2*11-8),$,11.1 宏汇编,宏定义和宏调用中参数的使用,2023/10/26,18,宏指令一经定义便可在源程序中调用,若宏体中使用了标号或变量,在多次宏调用时就会出现多个相同标号或出现变量的重复定义,使用LOCAL伪指令可以解决这一问题。LOCAL伪指令的使用方法及功能如下:(1)LOCAL伪指令的一般格式:LOCAL 标号及变量表 各标号、变量之间均用逗号分隔。(2)在宏定义中,LOCAL伪指令必须紧接MACRO伪指令之后。(3)在处理各个宏调用时,汇编程序将自动以?0000,?0001,?FFFF替代LOCAL从伪指令列出的各个标号或变量,从而避免多次宏调用时出现多个相同标号或出现变量重复定 义的问题。,宏定义和宏调用中参数的使用,11.1 宏汇编,2023/10/26,19,例:宏定义:ABSOL MACRO OPERCMP OPER,0JGE NEXTNEG OPERNEXT:ENDM上例中的ABSOL宏定义在考虑到有多次调用可能性的情况下,用LOCAL伪操作应定义为:ABSOL MACRO OPER;求某操作数的绝对值 LOCAL NEXT CMP OPER,0 JGE NEXT NEG OPER;如果是负数,则求补 NEXT:ENDM,2023/10/26,20,宏展开:.1 CMP VAR,01 JGE?00001 NEG VAR 1?0000:.1 CMP BX,01 JGE?00011 NEG BX1?0001:.,宏调用:.ABSOL VAR.ABSOL BX.,2023/10/26,21,11.1 宏汇编,11.1.4 宏嵌套,宏嵌套向子程序一样包括两种情况:其一,宏定义的宏体中包括宏调用,即在宏体中调用宏指令。在这种情况下要注意,其中调用的宏指令必须先行定义;其二,宏体中包括宏定义。,注意:向所有的编程语言一样,不能在源程序中直接调用内层定义的宏指令。换言之,在源程序中只有通过外层宏指令的调用才能调用内层宏指令,不能跨层调用。,2023/10/26,22,11.1 宏汇编,11.1.4 宏嵌套,(1)宏指令名可以与指令助记符及伪指令名同名。在此情况下,宏指令的优先级较高,同名的指令或伪指令的原有功能失效。在利用这一方法改变了某个指令助记符或伪指令名的原有功能后,可以通过宏调用来使用新定义的功能。若要恢复其原有功能,只要使用清除宏定义的伪指令:PURGE 宏指令名表,例如:CBW是一个已定义宏名那么下面:CBW;宏调用 PURGE CBW;清除对CBW的宏定义 CBW;将(AL)的符号扩展到AH,2023/10/26,23,11.1 宏汇编,11.1.4 宏嵌套,(2)宏定义时也要注意现场的保护和恢复。,注意宏扩展后程序的一致性、完整性。,2023/10/26,24,比较,是源程序级的简化:宏调用在汇编时进行程 序 语句的展开,不需要返回;不减小目标程,执行速度没有改变 通过形参、实参结合实现参数传递,简捷直观、灵活多变,是目标程序级的简化:子程序调用在执行时由CALL指令转向、RET指令返回;形成的目标代码较短,执行速度减慢 需要利用寄存器、存储单元或堆栈等传递参数,宏,子程序,11.1 宏汇编,11.1.2 宏调用和宏扩展,2023/10/26,25,宏与子程序具有各自的特点,程序员应该根据具体问题选择使用那种方法。通常,当程序段较短或要求较快执行时,应选用宏;当程序段较长或为减小目标代码时,要选用子程序。,比较结论,宏,子程序,11.1 宏汇编,11.1.2 宏调用和宏扩展,2023/10/26,26,11.3 条件汇编,11.1 宏汇编,11.4 库的使用,11.2 重复汇编,第11章 高级汇编语言技术,2023/10/26,27,11.2.1 使用REPT伪指令的重复汇编结构,11.2 重复汇编,格式:REPT 整数表达式 重复体 ENDM功能:使汇编程序对重复体作重复汇编,以整数表达式的值作为重复次数。,例如:CHAR=41H REPT 10 DB CHAR CHAR=CHAR+1 ENDM,其结果等价于:DB 41H,42H,43H,44H,45H,46H,47H,48H,49H,4AH,2023/10/26,28,11.2.2 使用IRP伪指令的重复汇编结构,11.2 重复汇编,格式:IRP 形参,实参表 重复体 ENDM功能:使汇编程序对重复体作重复汇编,每作一次汇编就依次将实参表中的一个实参取代重复体中的形参。,例如:IRP REG,AX,BX,CX,DX PUSH REG ENDM,其结果等价于:PUSH AX PUSH BX PUSH CX PUSH DX,2023/10/26,29,11.2.3 使用IRPC伪指令的重复汇编结构,11.2 重复汇编,格式:IRPC 形参,字符串 重复体 ENDM功能:使汇编程序对重复体作重复汇编,每作一次汇编就依次用字符串中的一个字符取代重复体中的形参。,例如:IRPC X,0123456789 DB X ENDM,其结果等价于:DB 0,1,2,3,4,5,6,7,8,9,2023/10/26,30,11.1.4 宏嵌套,11.3 条件汇编,重复汇编与循环程序结构的比较,2023/10/26,31,11.2 重复汇编,11.1 宏汇编,11.4 库的使用,11.3 条件汇编,第11章 高级汇编语言技术,2023/10/26,32,11.3.1 条件汇编的概念及条件汇编结构,11.3 条件汇编,概念:汇编程序可以根据条件来确定是否汇编某段源程序。,条件汇编结构的格式:(1)IF XX 条件(2)IF XX 条件 程序块1 程序块 ELSE ENDIF 程序块2 ENDIF,2023/10/26,33,11.3.2 条件汇编伪指令,11.3 条件汇编,条件汇编伪指令,2023/10/26,34,pdatamacro num IF num lt 100;如果num 100,则汇编如下语句db num dup(?)ELSE;否则,汇编如下语句db 100 dup(?)ENDIFendmpdata 12;宏调用db 12 dup(?);宏汇编结果pdata 102;宏调用db 100 dup(?);宏汇编结果,例,2023/10/26,35,例11.19 试定义一个实现无条件转移或条件转移的宏指令。当宏调用时给出一个实参,则将其作为无条件转移的目标位置;当宏调用时给出两个实参,则将第一个实参作为条件转移的目标位置,将第二个实参数是否为零作为转移的条件为零则转,非零则不转。,GOTO MACRO DEST,CONDIFB COND JMP DESTELSE MOV AX,COND CMP AX,0 JZ DESTENDIFENDM,11.3.2 条件汇编伪指令,11.3 条件汇编,2023/10/26,36,11.3.2 条件汇编伪指令,11.3 条件汇编,COND 为真:JMP DEST,COND 为假:MOV AX,COND CMP AX,0 JZ DEST,2023/10/26,37,11.2 重复汇编,11.1 宏汇编,11.3 条件汇编,11.4 库的使用,第11章 高级汇编语言技术,2023/10/26,38,11.4 库的使用,11.4.1 库的建立,将具有通用价值或经常用到的源程序段编辑成一个文件,这就产生了一个汇编语言源程序库。内容为宏定义的源程序库称为宏库。,有两种库:1.宏库;2.子程序库本教材介绍的是1,即宏库。,2023/10/26,39,建立库要注意以下几个方面:(1)其中的宏定义使用的标号必须用LOCAL伪指令说明。(2)其中的宏定义或子程序必须作现场的保护和恢复。(3)源程序段要尽量具备通用性。(4)源程序段中不得使用END伪指令,这是因为使用源程序 库本身已设置该伪指令。(5)附上必要的使用说明。,11.4 库的使用,11.4.1 库的建立,2023/10/26,40,11.4 库的使用,11.4.2 库的使用,源程序在使用库时,用伪指令INCLUDE:格式:INCLUDE 库文件名,2023/10/26,41,要正确选择INCLUDE伪指令的位置。当使用的库为宏库 时,宜在源程序的开始位置使用该伪指令,以符合宏指 令的先定义后调用原则。(2)当宏库包含多个宏定义,而调用处又不希望使用其中的 某些宏定义时,可以在INCLUDE伪指令后用PURGE伪 指令取消不用的宏定义,以达到节省目标代码所占空间 的目的。这种取消仅对本次库的使用产生影响,而不影 响宏库。,11.4 库的使用,11.4.2 库的使用,教学要求,掌握宏定义、宏调用和宏展开熟悉重复汇编和条件汇编使用方法:宏汇编、重复汇编和条件汇编为源程序的编写提供了很多方便,灵活运用它们可以编写出非常良好的源程序来作业:,