汇编语言程序设计-第七章_高级汇编语言技术.ppt
第七章 高级汇编语言技术,河南师范大学计算机与信息技术学院,2,2023/2/25,本章内容提要,河南师范大学计算机与信息技术学院,3,2023/2/25,7.1 高级语言特性,河南师范大学计算机与信息技术学院,4,2023/2/25,MASM6.0引入高级语言的程序设计特性,条件控制伪指令.IF.ELSE.ENDIF,循环控制伪指令.WHILE.ENDW.REPEAT.UNTIL,过程声明和过程调用伪指令.PROTO.INVOKE,河南师范大学计算机与信息技术学院,5,2023/2/25,7.1.1 条件控制伪指令,利用条件分支伪指令可以简化分支结构的编程。,格式:,.IF条件表达式分支体.ELSEIF条件表达式分支体.ELSE分支体.ENDIF,条件表达式允许的操作符。,这些伪指令在汇编时要展开,自动生成相应的比较和条件转移指令序列,实现程序分支。,河南师范大学计算机与信息技术学院,6,2023/2/25,操作注意,运算符的优先级顺序:,逻辑非最高;其次是比较类运算符;最低是逻辑与、逻辑或。圆括号可以改变优先级顺序。,确定操作数的符号:,条件表达式中的变量,若是用DB、DW、DD定义的,则一律视为无符号数。若需要进行有符号数的比较,变量定义时要用SBYTE、SWORD、SDWORD。,河南师范大学计算机与信息技术学院,7,2023/2/25,条件伪指令应用举例,例1单分支,例2双分支,例3有无实根判断,河南师范大学计算机与信息技术学院,8,2023/2/25,7.1.2 循环控制伪指令,先判断后执行的WHILE结构伪指令格式:.WHILE条件表达式循环体.ENDW,先执行后判断的UNTIL结构伪指令格式:.REPEAT.REPEAT循环体或循环体.UNTIL条件表达式.UNTILCXZ 条件表达式,.BREAK:无条件退出循环;.CONTINUE:转向循环开始。,河南师范大学计算机与信息技术学院,9,2023/2/25,操作注意,不带条件表达式的.repeat/.untilcxz伪指令将汇编成一条loop指令,即重复执行直到CX减1后,CX=0;,带有条件表达式的.repeat/.untilcxz伪指令的循环结束条件是CX减1后等于0或指定的条件为真。,.untilcxz伪指令的条件表达式只能是比较:寄存器与寄存器、存储单元和常数;存储单元与常数相等或不等。,河南师范大学计算机与信息技术学院,10,2023/2/25,循环伪指令应用举例,例41100求和WHILE结构,例51100求和UNTILE结构,例6数组中非负数的和,河南师范大学计算机与信息技术学院,11,2023/2/25,7.1.3 过程定义和过程调用伪操作,过程名PROC调用距离 语言类型 作用范围 USES 寄存器列表,参数:类型LOCAL 参数表;汇编语言语句过程名ENDP,要调用带参数过程定义的过程,不应采用CALL指令,因为比较烦琐。应该采用过程调用伪指令INVOKE。使用INVOKE伪指令的前提是需要用PROTO伪指令对过程进行声明。,过程声明伪指令:用于事先声明过程的结构过程名PROTO 调用距离 语言类型,参数:类型过程调用伪指令INVOKE 过程名,参数,.,例ltd.asm,河南师范大学计算机与信息技术学院,12,2023/2/25,7.2 宏汇编,河南师范大学计算机与信息技术学院,13,2023/2/25,宏结构,宏汇编、重复汇编、条件汇编宏结构,河南师范大学计算机与信息技术学院,14,2023/2/25,7.2.1 宏定义、宏调用与宏展开,宏具有宏名的一段汇编语句序列,在宏定义时书写;,宏(Macro)是汇编语言的一个特点,它是与子程序类似又独具特色的另一种简化源程序的方法。,宏指令这段汇编语句序列的缩写,在宏调用时书写;,宏展开宏指令处用这段宏代替的过程,在宏汇编时实现,河南师范大学计算机与信息技术学院,15,2023/2/25,1.宏定义,格式:,宏名macro 形参表宏定义体endm,宏名:给出该宏定义的名称,调用时就使用宏名来调用该宏定义。,宏名必须以字母开头,可以是字母、数字或下划线组成的标识符。,形参:又称哑元。形参表给出了宏定义中所用到的形式参数(或称虚参),参数之间用逗号隔开。,例7.1宏定义,河南师范大学计算机与信息技术学院,16,2023/2/25,2.宏调用,宏名实参表,实参:又称实元。各参数之间用逗号隔开。,宏必须先定义后调用。,一般把宏定义放在程序中所有段的代码之前。,例7.1宏调用,河南师范大学计算机与信息技术学院,17,2023/2/25,3.宏展开,宏展开:在汇编时,用宏定义体的代码序列替代宏指令的过程。,而且用实参取代宏定义中的形参。在取代时,实参和形参是一一对应的。,一般来说,实参和形参的个数应相等。,当实参个数大于形参个数时,则多于的实参不予考虑;若实参个数小于形参个数时,则多于的形参作“空”处理。,例7.1宏展开,河南师范大学计算机与信息技术学院,18,2023/2/25,宏与子程序,宏:仅是源程序级的简化:宏调用在汇编时进行程序语句的展开,不需要返回;不减小目标程序,执行速度没有改变。通过形参、实参结合实现参数传递,简捷直观、灵活多变。,子程序:还是目标程序级的简化:子程序调用在执行时由CALL指令转向、RET指令返回;形成的目标代码较短,执行速度减慢 需要利用寄存器、存储单元或堆栈等传递参数,通常,当程序段较短或要求较快执行时,应选用宏;当程序段较长或为减小目标代码时,要选用子程序。如图7.1所示。,河南师范大学计算机与信息技术学院,19,2023/2/25,7.2.2 宏定义中的参数,宏的参数功能强大,颇具特色。配合宏,还有宏操作符和有关伪指令。,宏定义时:,可以无参数,如例7.2。可以带有一个参数,例7.5 也可以具有多个参数;如例7.3、例7.4、例7.6、例7.7 参数可以是常数、变量、存储单元、指令(操作码)或它们的一部分,也可以是表达式;如例7.3、例7.4、例7.5、例7.7。,宏定义体可以是任何合法的汇编语句,既可以是硬指令序列,又可以是伪指令序列;如例8。,河南师范大学计算机与信息技术学院,20,2023/2/25,宏操作符,;宏注释符,用于表示在宏定义中的注释。采用这个符号的注释,在宏展开时不出现。&替换操作符,用于将参数与其他字符分开。如果参数紧接在其他字符之前或之后,或者参数出现在带引号的字符串中,就必须使用该伪操作符。字符串传递操作符,用于括起字符串。在宏调用中,如果传递的字符串实参中含有逗号、空格等间隔符号,则必须用这对操作符,以保证字符串的完整。!转义操作符,用于指示其后的一个字符作为一般字符,不含特殊意义。%表达式操作符,用在宏调用中,表示将后跟的一个表达式的值作为实参,而不是将表达式本身作为参数。,河南师范大学计算机与信息技术学院,21,2023/2/25,7.2.3 LOCAL伪操作,局部标号伪指令:LOCAL 标号列表,宏定义体采用了标号,应使用LOCAL加以说明。,它必须是宏定义MACRO语句之后的第一条语句。,在MACRO和LOCAL之间不允许有注释和分号标志。,例7.8,河南师范大学计算机与信息技术学院,22,2023/2/25,7.2.4 在宏定义中使用宏,例7.9、例7.10、例7.11,河南师范大学计算机与信息技术学院,23,2023/2/25,7.2.5 列表伪操作,MASM提供.XALL、.LALL和.SALL来控制汇编清单中宏展开的列出情况。,.XALL为默认情况,它指示清单中只列出产生目标代码的宏展开;,.LALL指示列出包括注释在内的所有宏展开。,.SALL则不列出任何展开信息。,MASM6.0中,三个伪操作分别为:,.LISTMACROALL.LISTMACRO.NOLISTMACRO,见P256 例7.12,河南师范大学计算机与信息技术学院,24,2023/2/25,7.2.6 宏库的建立和调用,宏库:包含若干宏定义的文件,扩展名为.MAC或.INC。,如果程序中定义了很多宏,或者用户可以把自己编程中常用的宏定义建立成一个独立的文件,即宏库。,当程序中需要宏库中的宏定义时,只需在程序的开始部分用INCLUDE语句说明即可。如:INCLUDEC:MACRO.MAC,汇编程序将把宏库中的所有宏定义都包含在应用程序中。,INCLUDE语句不一定要放在程序的最前面,但必须放在所有宏调用之前。,见P259261的代码,河南师范大学计算机与信息技术学院,25,2023/2/25,7.2.7 PURGE和EXITM伪操作,宏定义删除伪指令PURGE 宏名表,不需要某个宏定义时,可以把它删除。,宏定义退出伪指令EXITM,伪指令EXITM表示结束当前宏调用的展开。,河南师范大学计算机与信息技术学院,26,2023/2/25,7.3 重复汇编,河南师范大学计算机与信息技术学院,27,2023/2/25,重复汇编,重复汇编指在汇编过程中,重复展开一段(基本)相同的语句。,重复汇编没有名字,不能被调用。,重复汇编常用在宏定义体中,也可以在一般汇编语句中使用。,重复汇编伪指令有三个:,REPEAT按参数值重复;FOR按参数个数重复FORC按参数的字符个数重复(在MASM5.0版本中依次是REPT/IRP/IRPC),最后,用ENDM结束。,河南师范大学计算机与信息技术学院,28,2023/2/25,7.3.1 重复伪操作,按参数值重复REPEAT/REPT:,REPEAT(REPT)重复次数 重复体ENDM,例7.13、例7.14、例7.15、例7.16,河南师范大学计算机与信息技术学院,29,2023/2/25,7.3.2 不定重复伪操作,按参数个数重复FOR/IRP:,FOR 形参,实参表 重复体ENDM,按参数字符个数重复FORC/IRPC:,FORC 形参,字符串重复体ENDM,例7.17、例7.18,例7.19、例7.20,河南师范大学计算机与信息技术学院,30,2023/2/25,7.4 条件汇编,河南师范大学计算机与信息技术学院,31,2023/2/25,条件汇编语句,条件汇编伪指令在汇编过程中,根据条件决定汇编的语句。,IFxx 表达式;满足,汇编分支语句体1分支语句体1 ELSE;不满足,汇编分支语句体2分支语句体2 ENDIF;条件汇编结束,表达式中可以使用的关系操作符EQ、NE、LT、LE、GT和GE。,条件伪操作可以用在宏定义体内,也可以用在宏定义体外,还允许嵌套。,河南师范大学计算机与信息技术学院,32,2023/2/25,条件汇编伪操作,河南师范大学计算机与信息技术学院,33,2023/2/25,条件伪操作应用举例,IF伪操作例7.21、例7.22、例7.23P266-268,IF1伪操作例7.24P269-230,IFNDEF伪操作P270-274 例7.25,IFB伪操作例7.26、例7.27 P274-276,IFIDN伪操作P276-278 例7.28,例9,河南师范大学计算机与信息技术学院,34,2023/2/25,练习与作业,练习:7.9、7.15提交作业:7.7、7.11,河南师范大学计算机与信息技术学院,35,2023/2/25,条件表达式中的操作符,格式:数值表达式&位数,优先级顺序,河南师范大学计算机与信息技术学院,36,2023/2/25,例1 单分支,求AX绝对值.IFAX 0;等价于.IF SIGN?NEGAX;满足,求补.ENDIFMOVRESULT,AX,河南师范大学计算机与信息技术学院,37,2023/2/25,例2 双分支,.IFax=5movbx,axmovax,0.ELSEdecax.ENDIF,汇编后的列表文件,河南师范大学计算机与信息技术学院,38,2023/2/25,例2的列表文件,例2汇编后的列表文件:.IFax=5*cmpax,05h*jneC0001movbx,axmovax,0.ELSE*jmpC0003*C0001:dec ax.ENDIF*C0003:,河南师范大学计算机与信息技术学院,39,2023/2/25,例3 有无实根-1,.model small.stack.data_asbyte?_bsbyte?_csbyte?tagbyte?.code.startupmoval,_bimulalmovbx,ax,河南师范大学计算机与信息技术学院,40,2023/2/25,例3 有无实根-2,moval,_aimul_cmovcx,4imulcx.ifsword ptr bx=axmovtag,0.elsemovtag,1.endif.exit0end,河南师范大学计算机与信息技术学院,41,2023/2/25,例4,实现1100求和。xorax,axmovcx,100.whilecx!=0addax,cx dec cx.endwmovsum,ax,河南师范大学计算机与信息技术学院,42,2023/2/25,例5,xorax,axmovcx,100.repeataddax,cxdeccx.untilcx=0movsum,ax,.repeataddax,cx.untilcxz,河南师范大学计算机与信息技术学院,43,2023/2/25,例6-1,设array是100个字元素的数组,试计算其中前若干个非负数之和,直到出现第一个负数为止,并将结果存入result单元(不考虑进位和溢出)。.model small.stack.dataarraysword100 dup(?)resultsword?.code.startupmovcx,100,河南师范大学计算机与信息技术学院,44,2023/2/25,例6-2,xorax,axleabx,array.repeat.ifsword ptr bx=0addax,bx.else.break.endifincbxincbx.untilcxzmovresult,ax.exit0end,河南师范大学计算机与信息技术学院,45,2023/2/25,例ltd.asm-1,;汇编语言程序.model smallchecksumd PROTO c,:word,:word;声明过程.stack.dataarraydb 12h,25h,0f0h,0a3h,3db 68h,71h,0cah,0ffh,90hcountequ$-array;数组的元素个数resultdb?;校验和.code.startupINVOKE checksumd,count,offset array;调用过程mov result,al;保存校验和.exit 0,河南师范大学计算机与信息技术学院,46,2023/2/25,例ltd.asm-2,checksumd PROC c USES bx cx,countp:word,arrayp:wordmov bx,arrayp;BX数组的偏移地址mov cx,countp;CX数组的元素个数xor al,alsumd:add al,bx;求和:ALAL+DS:BXincbxloop sumdretchecksumd endpend,列表文件,河南师范大学计算机与信息技术学院,47,2023/2/25,例ltd.asm列表文件-1,;ltd.asm的列表文件(ltd.lst).INVOKE checksumd,count,offset array*mov ax,word ptr OFFSET array*pushax*mov ax,+000Ah*pushax*call checksumd*add sp,04hmov result,al.checksumd PROC c USES bx cx,countp:word,arrayp:word*push bp;起始代码,河南师范大学计算机与信息技术学院,48,2023/2/25,例ltd.asm列表文件-2,*mov bp,sp*push bx;保护bx和cx*push cxmov bx,arrayp;arrayp=BP+6mov cx,countp;cuontp=BP+4.ret*pop cx;结尾代码*pop bx*pop bp*ret 0000hchecksumc endp,河南师范大学计算机与信息技术学院,49,2023/2/25,例7.1 宏定义,例7.1 用宏指令定义两个字操作数相乘,得到一个16位的第三个操作数作为结果。宏定义如下:MULTIPLYMACROOPR1,OPR2,RESULTPUSHDXPUSHAXMOVAX,OPR1IMULOPR2MOVRESULT,AXPOPAXPOPDXENDM,河南师范大学计算机与信息技术学院,50,2023/2/25,例7.2 宏调用,宏调用如下:MULTIPLYCX,VAR,XYZBXMULTIPLY240,BX,SAVE,河南师范大学计算机与信息技术学院,51,2023/2/25,例7.3 宏展开-1,宏展开如下:1PUSHDX1PUSHAX1MOVAX,CX1IMULVAR1MOVXYZBX,AX1POPAX1POPDX,河南师范大学计算机与信息技术学院,52,2023/2/25,例7.3 宏展开-2,1PUSHDX1PUSHAX1MOVAX,2401IMULBX1MOVSAVE,AX1POPAX1POPDX,河南师范大学计算机与信息技术学院,53,2023/2/25,图7.1 宏调用与子程序调用,河南师范大学计算机与信息技术学院,54,2023/2/25,例7.2,宏定义可以无参数。;宏定义SAVERGEMACROPUSHAXPUSHBXPUSHCXPUSHDXPUSHSIPUSHDIENDM;宏调用SAVERGE;宏展开时则将宏定义体的内容全部列出,河南师范大学计算机与信息技术学院,55,2023/2/25,例7.3,参数可以是操作码。;宏定义FOOMACROP1,P2,P3MOVAX,P1P2P3ENDM;宏调用FOOWORD_VAR,INC,AX;宏展开1MOVAX,WORD_VAR1INCAX,河南师范大学计算机与信息技术学院,56,2023/2/25,例7.4,参数可以是操作码的一部分,但在宏定义体中必须使用&作为操作符。;宏定义LEAMACROCOND,LABJ&CONDLABENDM;宏调用LEAZ,THERELEANZ,HERE;宏展开1JZTHERE1JNZHERE,替换操作符,河南师范大学计算机与信息技术学院,57,2023/2/25,例7.5,&操作符的应用:形成操作数;宏定义FOMACROP1JMPTA&P1ENDM;宏调用FOWORD_VAR;宏展开1JMPTAWORD_VAR,河南师范大学计算机与信息技术学院,58,2023/2/25,例7.6,&操作符的应用:参数是ASCII串。;宏定义MSGGENMACROLAB,NUM,XYZLAB&NUMDBHELLO MR.&XYZENDM;宏调用MSGGENMSG,1,TAYLOR;宏展开1MSG1DBHELLO MR.TAYLOR,河南师范大学计算机与信息技术学院,59,2023/2/25,例7.7-1,%操作符的应用;宏定义MSGMACROCOUNT,STRINGMSG&COUNTDBSTRINGENDMERRMSGMACROTEXTCNTR=CNTR+1MSG%CNTR,TEXTENDM,表达式操作符,河南师范大学计算机与信息技术学院,60,2023/2/25,例7.7-2,;宏调用CNTR=0ERRMSGSYNTAX ERRORERRMSGINVALID OPERAND;宏展开CNTR=01CNTR=CNTR+11MSG%CNTR,SYNTAX ERROR2MSG1DBSYNTAX ERROR1CNTR=CNTR+11MSG%CNTR,INVALID OPERAND2MSG2DBINVALID OPERAND,河南师范大学计算机与信息技术学院,61,2023/2/25,例8,;宏定义dstringmacro stringdb&string&,0dh,0ah,$endm;宏调用dstringdstring;宏展开 1db This is a example.,0dh,0ah,$1db 0 Number 10,0dh,0ah,$,转义操作符,传递操作符,河南师范大学计算机与信息技术学院,62,2023/2/25,例7.8,;宏定义absolmacro operlocalnextcmpoper,0jgenextnegopernext:endm,;宏调用absol varabsol bx;宏展开 1cmp var,0 1jge?0000 1neg var 1?0000:1cmpbx,0 1jge?0001 1neg bx 1?0001:,河南师范大学计算机与信息技术学院,63,2023/2/25,例7.9-1,宏必须先定义后调用。;宏定义DIFMACROX,YMOVAX,YSUBAX,YENDMDIFSQRMACROOPR1,OPR2,RESULTPUSHDXPUSHAXDIFOPR1,OPR2IMULAXMOVRESULT,AXPOPAXPOPBXENDM,河南师范大学计算机与信息技术学院,64,2023/2/25,例7.9-2,;宏调用DIFSQRVAR1,VAR2,VAR3;宏展开1PUSHDX1PUSHAX2MOVAX,VAR12SUBAX,VAR21IMULAX1MOVVAR3,AX1POPAX1POPDX,河南师范大学计算机与信息技术学院,65,2023/2/25,例7.10-1,;宏定义INT21MACROFUNCTNMOVAH,FUNCTNINT21HENDMDISPMACROCHARMOVDL,CHARINT2102HENDM;宏调用DISP?,河南师范大学计算机与信息技术学院,66,2023/2/25,例7.10-2,;宏展开1MOVDL,?2MOVAH,02H2INT21H,河南师范大学计算机与信息技术学院,67,2023/2/25,例7.11-1,宏定义体内还可以包含宏定义。;宏定义DEFMACMACROMACNAM,OPERATORMACNAMMACROX,Y,ZPUSHAXMOVAX,YOPERATOPAX,YMOVZ,AXPOPAX ENDMENDM,河南师范大学计算机与信息技术学院,68,2023/2/25,例7.11-2,;宏调用DEFMACADDTION,ADD;形成加法宏定义ADDTIONMACROX,Y,ZPUSHAX MOVAX,XADDAX,YMOVZ,AXPOPAXENDM;宏调用DEFMACSUBTRACT,SUB;形成减法宏定义DEFMACLOGOR,OR;形成逻辑或宏定义,河南师范大学计算机与信息技术学院,69,2023/2/25,例7.11-3,;接下来,宏调用ADDTIONVAR1,VAR2,VAR3;宏展开1PUSHAX1MOVAX,VAR11ADDAX,VAR21MOVVAR3,AX1POPAX,河南师范大学计算机与信息技术学院,70,2023/2/25,例7.13,X=0REPT10X=X+1DBXENDM,1DB1 1DB2 1DB3.1DB10,河南师范大学计算机与信息技术学院,71,2023/2/25,例7.14,CHAR=ATABLELABELBYTEREPT26DBCHARCHAR=CHAR+1ENDM,1DB41H 1DB42H.1DB5AH,把字符A到Z的ASCII码填入数组TABLE。,河南师范大学计算机与信息技术学院,72,2023/2/25,例7.15,;宏定义PUSH_TABMACROKPUSHTAB+KENDM,用宏定义及重复伪操作把TAB,TAB+2,TAB+4,TAB+8的内容存入堆栈。,;宏调用I=0REPT5PUSH_TAB%II=I+2ENDM,2PUSHTAB+0 2PUSHTAB+2 2PUSHTAB+4 2PUSHTAB+6 2PUSHTAB+8,河南师范大学计算机与信息技术学院,73,2023/2/25,例7.16,ARRAYLABLEWORDREPT7DW$+2ENDMDWARRAY,建立一个8字数组,其中每个字的内容是下一个字的地址,而最后一个字的内容是第一个字的地址。,1DW$+2 1DW$+2.1DW$+2DWARRAY,河南师范大学计算机与信息技术学院,74,2023/2/25,例7.17,IRPX,DBXENDM,1DB1 1DB2.1DB10,河南师范大学计算机与信息技术学院,75,2023/2/25,例7.18,IRPREG,PUSHREGENDM,1PUSHAX 1PUSHBX 1PUSHCX 1PUSHDX,河南师范大学计算机与信息技术学院,76,2023/2/25,例7.19,IRPCX,01234567DBX+1ENDM,1DB1 1DB2 1DB8,河南师范大学计算机与信息技术学院,77,2023/2/25,例7.20,IRPCK,ABCDPUSHK&XENDM,1PUSHAX 1PUSHBX 1PUSHCX 1PUSHDX,河南师范大学计算机与信息技术学院,78,2023/2/25,例9,定义一个元素个数不超过100的数组。pdatamacro num IFnum lt 100;如果num 100,则汇编如下语句dbnum dup(?)ELSE;否则,汇编如下语句db 100 dup(?)ENDIFendm;*pdata 12;宏调用db 12 dup(?);宏汇编结果pdata 102;宏调用db 100 dup(?);宏汇编结果,