资源预览内容
第1页 / 共78页
第2页 / 共78页
第3页 / 共78页
第4页 / 共78页
第5页 / 共78页
第6页 / 共78页
第7页 / 共78页
第8页 / 共78页
第9页 / 共78页
第10页 / 共78页
亲,该文档总共78页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
IBM-PC汇编语言程序设计第七章第七章 高级汇编语言技术高级汇编语言技术任课教师:陶雪丽任课教师:陶雪丽xueli_xl126.comIBM-PC汇编语言程序设计本章内容提要本章内容提要 高级语言特性高级语言特性宏汇编宏汇编重复汇编重复汇编条件汇编条件汇编7/29/20242河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计7.1 7.1 高级语言特性高级语言特性 1 1条件控制伪指令条件控制伪指令2 2循环控制伪指令循环控制伪指令3 3过程声明和过程调用伪指令过程声明和过程调用伪指令7/29/20243河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计MASM6.0MASM6.0引入高级语言的程序设计特性引入高级语言的程序设计特性 条件控制伪指令条件控制伪指令.IF .ELSE .ENDIF.IF .ELSE .ENDIF循环控制伪指令循环控制伪指令.WHILE .ENDW .REPEAT .UNTIL.WHILE .ENDW .REPEAT .UNTIL过程声明和过程调用伪指令过程声明和过程调用伪指令.PROTO .INVOKE.PROTO .INVOKE7/29/20244河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计7.1.1 7.1.1 条件控制伪指令条件控制伪指令 利用条件分支伪指令可以简化分支结构的编程。利用条件分支伪指令可以简化分支结构的编程。格式:格式:.IF.IF条件表达式条件表达式分支体分支体. ELSEIF. ELSEIF条件表达式条件表达式分支体分支体 .ELSE.ELSE分支体分支体 .ENDIF.ENDIF条件表达式允许的操作符。条件表达式允许的操作符。 这些伪指令在汇编时要展开,自动生成相应的比较和条件转移指这些伪指令在汇编时要展开,自动生成相应的比较和条件转移指令序列,实现程序分支。令序列,实现程序分支。7/29/20245河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计操作注意操作注意运算符的优先级顺序:运算符的优先级顺序:逻辑非最高;逻辑非最高;其次是比较类运算符;其次是比较类运算符;最低是逻辑与、逻辑或。最低是逻辑与、逻辑或。圆括号可以改变优先级顺序。圆括号可以改变优先级顺序。确定操作数的符号:确定操作数的符号: 条件表达式中的变量,若是用条件表达式中的变量,若是用DBDB、DWDW、DDDD定义的,则一定义的,则一律视为无符号数。律视为无符号数。 若需要进行有符号数的比较,变量定义时要用若需要进行有符号数的比较,变量定义时要用SBYTESBYTE、SWORDSWORD、SDWORDSDWORD。7/29/20246河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计条件伪指令应用举例条件伪指令应用举例例例1 1单分支单分支例例2 2双分支双分支例例3 3有无实根判断有无实根判断7/29/20247河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计7.1.2 7.1.2 循环控制伪指令循环控制伪指令先判断后执行的先判断后执行的WHILEWHILE结构伪指令格式:结构伪指令格式:.WHILE.WHILE 条件表达式条件表达式循环体循环体.ENDW.ENDW先执行后判断的先执行后判断的UNTILUNTIL结构伪指令格式:结构伪指令格式:.REPEAT.REPEAT.REPEAT.REPEAT循环体循环体或或循环体循环体.UNTIL.UNTIL 条件表达式条件表达式.UNTILCXZ .UNTILCXZ 条件表达式条件表达式 .BREAK.BREAK:无条件退出循环;无条件退出循环;.CONTINUE.CONTINUE:转向循环开始。:转向循环开始。7/29/20248河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计操作注意操作注意 不带条件表达式的不带条件表达式的.repeat/.repeat/.untilcxzuntilcxz伪指令将汇编成一条伪指令将汇编成一条looploop指令,即重复执行直到指令,即重复执行直到CXCX减减1 1后,后,CX=0CX=0; 带有条件表达式的带有条件表达式的.repeat/.repeat/.untilcxzuntilcxz伪指令的循环结束条件伪指令的循环结束条件是是CXCX减减1 1后等于后等于0 0或指定的条件为真。或指定的条件为真。 . .untilcxzuntilcxz伪指令的条件表达式只能是比较:寄存器与寄存器、伪指令的条件表达式只能是比较:寄存器与寄存器、存储单元和常数;存储单元与常数相等或不等。存储单元和常数;存储单元与常数相等或不等。7/29/20249河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计循环伪指令应用举例循环伪指令应用举例例例4 41 1100100求和求和WHILEWHILE结构结构例例5 51 1100100求和求和UNTILEUNTILE结构结构例例6 6数组中非负数的和数组中非负数的和7/29/202410河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计7.1.3 7.1.3 过程定义和过程调用伪操作过程定义和过程调用伪操作过程名过程名 PROCPROC调用距离调用距离 语言类型语言类型 作用范围作用范围 USES USES 寄存器列表寄存器列表, , 参数参数: :类型类型LOCAL LOCAL 参数表参数表; ;汇编语言语句汇编语言语句过程名过程名 ENDPENDP要调用带参数过程定义的过程,不应采用要调用带参数过程定义的过程,不应采用CALLCALL指令,因为比较烦琐。指令,因为比较烦琐。应该采用过程调用伪指令应该采用过程调用伪指令INVOKEINVOKE。使用使用INVOKEINVOKE伪指令的前提是需要用伪指令的前提是需要用PROTOPROTO伪指令对过程进行声明。伪指令对过程进行声明。过程声明伪指令:用于事先声明过程的结构过程声明伪指令:用于事先声明过程的结构过程名过程名 PROTO PROTO 调用距离调用距离 语言类型语言类型, , 参数参数: :类型类型过程调用伪指令过程调用伪指令INVOKE INVOKE 过程名过程名, ,参数参数,.,.例例ltd.asmltd.asm7/29/202411河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计7.2 7.2 宏汇编宏汇编 1 1宏定义、宏调用和宏展开宏定义、宏调用和宏展开2 2宏定义中的参数宏定义中的参数3 3LOCALLOCAL伪操作伪操作4 4在宏定义内使用宏在宏定义内使用宏5 5列表伪操作列表伪操作6 6宏库的建立与调用宏库的建立与调用7 7PURGEPURGE与与EXITMEXITM伪操作伪操作7/29/202412河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计宏结构宏结构宏汇编、重复汇编、条件汇编宏汇编、重复汇编、条件汇编宏结构宏结构7/29/202413河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计7.2.1 7.2.1 宏定义、宏调用与宏展开宏定义、宏调用与宏展开宏宏具有宏名的一段汇编语句序列,在具有宏名的一段汇编语句序列,在宏定义宏定义时书写;时书写; 宏(宏(MacroMacro)是汇编语言的一个特点,它是与子程序类似又独具)是汇编语言的一个特点,它是与子程序类似又独具特色的另一种简化源程序的方法。特色的另一种简化源程序的方法。宏指令宏指令这段汇编语句序列的缩写,在这段汇编语句序列的缩写,在宏调用宏调用时书写;时书写;宏展开宏展开宏指令处用这段宏代替的过程,在宏指令处用这段宏代替的过程,在宏汇编宏汇编时实现时实现7/29/202414河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计1. 1. 宏定义宏定义格式:格式:宏名宏名macro macro 形参表形参表 宏定义体宏定义体endmendm宏名:宏名:给出该宏定义的名称,调用时就使用宏名来调用该宏定义。给出该宏定义的名称,调用时就使用宏名来调用该宏定义。宏名必须以字母开头,可以是字母、数字或下划线组成的标识符。宏名必须以字母开头,可以是字母、数字或下划线组成的标识符。 形参:形参:又称哑元。形参表给出了宏定义中所用到的形式参数(或称又称哑元。形参表给出了宏定义中所用到的形式参数(或称虚参),参数之间用逗号隔开。虚参),参数之间用逗号隔开。例例7.17.1宏定义宏定义7/29/202415河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计2. 2. 宏调用宏调用宏名宏名 实参表实参表 实参:实参:又称实元。各参数之间用逗号隔开。又称实元。各参数之间用逗号隔开。宏必须先定义后调用。宏必须先定义后调用。一般把宏定义放在程序中所有段的代码之前。一般把宏定义放在程序中所有段的代码之前。例例7.17.1宏调用宏调用7/29/202416河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计3. 3. 宏展开宏展开 宏展开:宏展开:在汇编时,用宏定义体的代码序列替代宏指令的过程。在汇编时,用宏定义体的代码序列替代宏指令的过程。 而且用实参取代宏定义中的形参。在取代时,实参和形参是一而且用实参取代宏定义中的形参。在取代时,实参和形参是一一对应的。一对应的。一般来说,实参和形参的个数应相等。一般来说,实参和形参的个数应相等。 当实参个数大于形参个数时,则多于的实参不予考虑;若实参当实参个数大于形参个数时,则多于的实参不予考虑;若实参个数小于形参个数时,则多于的形参作个数小于形参个数时,则多于的形参作“空空”处理。处理。例例7.17.1宏展开宏展开7/29/202417河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计宏与子程序宏与子程序宏:宏: 仅是源程序级的简化:仅是源程序级的简化:宏调用在汇编时进行程序语宏调用在汇编时进行程序语句的展开,不需要返回;不句的展开,不需要返回;不减小目标程序,执行速度没减小目标程序,执行速度没有改变。有改变。 通过形参、实参结合实通过形参、实参结合实现参数传递,简捷直观、灵现参数传递,简捷直观、灵活多变。活多变。子程序:子程序: 还是目标程序级的简化:还是目标程序级的简化:子程序调用在执行时由子程序调用在执行时由CALLCALL指令转向、指令转向、RETRET指令返回;形指令返回;形成的目标代码较短,执行速成的目标代码较短,执行速度减慢度减慢 需要利用寄存器、存储需要利用寄存器、存储单元或堆栈等传递参数单元或堆栈等传递参数 通常,当程序段较短或要求较快执行时,应选用宏;当程序通常,当程序段较短或要求较快执行时,应选用宏;当程序段较长或为减小目标代码时,要选用子程序。段较长或为减小目标代码时,要选用子程序。如图如图7.17.1所示所示。7/29/202418河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计7.2.2 7.2.2 宏定义中的参数宏定义中的参数 宏的参数功能强大,颇具特色。配合宏,还有宏操作符和有关伪宏的参数功能强大,颇具特色。配合宏,还有宏操作符和有关伪指令。指令。宏定义时宏定义时: : 可以无参数,如可以无参数,如例例7.27.2。 可以带有一个参数,可以带有一个参数,例例7.57.5 也可以具有多个参数;如也可以具有多个参数;如例例7.37.3、例例7.47.4、例例7.67.6、例例7.77.7 参数可以是常数、变量、存储单元、指令(操作码)或参数可以是常数、变量、存储单元、指令(操作码)或它们的一部分,也可以是表达式;如它们的一部分,也可以是表达式;如例例7.37.3、例例7.47.4、例例7.5 7.5 、例例7.77.7。 宏定义体可以是任何合法的汇编语句,既可以是硬指令序列,又宏定义体可以是任何合法的汇编语句,既可以是硬指令序列,又可以是伪指令序列;如可以是伪指令序列;如例例8 8。7/29/202419河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计宏操作符宏操作符 ;宏注释符宏注释符,用于表示在宏定义中的注释。采用这个符号的注释,用于表示在宏定义中的注释。采用这个符号的注释,在宏展开时不出现。在宏展开时不出现。&替换操作符替换操作符,用于将参数与其他字符分开。如果参数紧接在其,用于将参数与其他字符分开。如果参数紧接在其他字符之前或之后,或者参数出现在带引号的字符串中,就必须使用他字符之前或之后,或者参数出现在带引号的字符串中,就必须使用该伪操作符。该伪操作符。字符串传递操作符字符串传递操作符,用于括起字符串。在宏调用中,如果传,用于括起字符串。在宏调用中,如果传递的字符串实参中含有逗号、空格等间隔符号,则必须用这对操作符,递的字符串实参中含有逗号、空格等间隔符号,则必须用这对操作符,以保证字符串的完整。以保证字符串的完整。!转义操作符转义操作符,用于指示其后的一个字符作为一般字符,不含特,用于指示其后的一个字符作为一般字符,不含特殊意义。殊意义。%表达式操作符表达式操作符,用在宏调用中,表示将后跟的一个表达式的值,用在宏调用中,表示将后跟的一个表达式的值作为实参,而不是将表达式本身作为参数。作为实参,而不是将表达式本身作为参数。7/29/202420河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计7.2.3 LOCAL7.2.3 LOCAL伪操作伪操作 局部标号伪指令:局部标号伪指令:LOCAL LOCAL 标号列表标号列表宏定义体采用了标号,应使用宏定义体采用了标号,应使用LOCALLOCAL加以说明。加以说明。它必须是宏定义它必须是宏定义MACROMACRO语句之后的第一条语句。语句之后的第一条语句。在在MACROMACRO和和LOCALLOCAL之间不允许有注释和分号标志。之间不允许有注释和分号标志。例例7.87.87/29/202421河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计7.2.4 7.2.4 在宏定义中使用宏在宏定义中使用宏 例例7.97.9、例例7.107.10、例例7.117.117/29/202422河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计7.2.5 7.2.5 列表伪操作列表伪操作 MASMMASM提供提供.XALL.XALL、.LALL.LALL和和.SALL.SALL来控制汇编清单中宏展开的列来控制汇编清单中宏展开的列出情况。出情况。 .XALL.XALL为默认情况,它指示清单中只列出产生目标代码的宏展为默认情况,它指示清单中只列出产生目标代码的宏展开;开;.LALL.LALL指示列出包括注释在内的所有宏展开。指示列出包括注释在内的所有宏展开。.SALL.SALL则不列出任何展开信息。则不列出任何展开信息。MASM6.0MASM6.0中,三个伪操作分别为:中,三个伪操作分别为:.LISTMACROALL.LISTMACROALL.LISTMACRO.LISTMACRO.NOLISTMACRO.NOLISTMACRO见见P256 P256 例例7.127.127/29/202423河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计7.2.6 7.2.6 宏库的建立和调用宏库的建立和调用 宏库:宏库:包含若干宏定义的文件,扩展名为包含若干宏定义的文件,扩展名为.MAC.MAC或或.INC.INC。 如果程序中定义了很多宏,或者用户可以把自己编程中常用的如果程序中定义了很多宏,或者用户可以把自己编程中常用的宏定义建立成一个独立的文件,即宏库。宏定义建立成一个独立的文件,即宏库。 当程序中需要宏库中的宏定义时,只需在程序的开始部分用当程序中需要宏库中的宏定义时,只需在程序的开始部分用INCLUDEINCLUDE语句说明即可。如:语句说明即可。如:INCLUDEINCLUDEC:MACRO.MACC:MACRO.MAC汇编程序将把宏库中的所有宏定义都包含在应用程序中。汇编程序将把宏库中的所有宏定义都包含在应用程序中。 INCLUDEINCLUDE语句不一定要放在程序的最前面,但必须放在所有语句不一定要放在程序的最前面,但必须放在所有宏调用之前。宏调用之前。见见P259P259261261的代码的代码7/29/202424河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计7.2.7 PURGE7.2.7 PURGE和和EXITMEXITM伪操作伪操作 宏定义删除伪指令宏定义删除伪指令PURGE PURGE 宏名表宏名表不需要某个宏定义时,可以把它删除。不需要某个宏定义时,可以把它删除。宏定义退出伪指令宏定义退出伪指令EXITMEXITM伪指令伪指令EXITMEXITM表示结束当前宏调用的展开。表示结束当前宏调用的展开。7/29/202425河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计7.3 7.3 重复汇编重复汇编 1 1重复伪操作重复伪操作2 2不定重复伪操作不定重复伪操作7/29/202426河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计重复汇编重复汇编 重复汇编指在汇编过程中,重复展开一段(基本)相同的语句。重复汇编指在汇编过程中,重复展开一段(基本)相同的语句。重复汇编没有名字,不能被调用。重复汇编没有名字,不能被调用。重复汇编常用在宏定义体中,也可以在一般汇编语句中使用。重复汇编常用在宏定义体中,也可以在一般汇编语句中使用。重复汇编伪指令有三个:重复汇编伪指令有三个:REPEATREPEAT按参数值重复;按参数值重复;FORFOR按参数个数重复按参数个数重复FORCFORC按参数的字符个数重复按参数的字符个数重复(在(在MASM5.0MASM5.0版本中依次是版本中依次是REPT/IRP/IRPCREPT/IRP/IRPC)最后,用最后,用ENDMENDM结束。结束。7/29/202427河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计7.3.1 7.3.1 重复伪操作重复伪操作 按参数值重复按参数值重复REPEAT/REPT:REPEAT/REPT:REPEATREPEAT(REPTREPT) 重复次数重复次数 重复体重复体ENDMENDM例例7.137.13、例例7.147.14、例例7.157.15、例例7.167.167/29/202428河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计7.3.2 7.3.2 不定重复伪操作不定重复伪操作 按参数个数重复按参数个数重复FOR/IRP:FOR/IRP:FOR FOR 形参形参, ,实参表实参表 重复体重复体ENDMENDM按参数字符个数重复按参数字符个数重复FORC/IRPC:FORC/IRPC:FORC FORC 形参形参, , 字符串字符串重复体重复体ENDMENDM例例7.177.17、例例7.187.18例例7.197.19、例例7.207.207/29/202429河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计7.4 7.4 条件汇编条件汇编 1 1条件伪操作条件伪操作IFIF的使用举例的使用举例2 2条件伪操作条件伪操作IFIIFI的使用举例的使用举例3 3条件伪操作条件伪操作IFNDEFIFNDEF的使用举例的使用举例4 4条件伪操作条件伪操作IFBIFB的使用举例的使用举例5 5条件伪操作条件伪操作IFIDNIFIDN的使用举例的使用举例7/29/202430河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计条件汇编语句条件汇编语句 条件汇编伪指令在汇编过程中,根据条件决定汇编的语句。条件汇编伪指令在汇编过程中,根据条件决定汇编的语句。IFxxIFxx 表达式表达式; ;满足,汇编分支语句体满足,汇编分支语句体1 1分支语句体分支语句体1 1 ELSE ELSE; ;不满足,汇编分支语句体不满足,汇编分支语句体2 2分支语句体分支语句体2 2 ENDIFENDIF; ;条件汇编结束条件汇编结束表达式中可以使用的关系操作符表达式中可以使用的关系操作符EQEQ、NENE、LTLT、LELE、GTGT和和GEGE。 条件伪操作可以用在宏定义体内,也可以用在宏定义体外,条件伪操作可以用在宏定义体内,也可以用在宏定义体外,还允许嵌套。还允许嵌套。7/29/202431河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计条件汇编伪操作条件汇编伪操作 7/29/202432河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计条件伪操作应用举例条件伪操作应用举例 IFIF伪操作伪操作例例7.217.21、例、例7.227.22、例、例7.237.23P266-268P266-268IF1IF1伪操作伪操作例例7.247.24P269-230P269-230IFNDEFIFNDEF伪操作伪操作P270-274 P270-274 例例7.257.25IFBIFB伪操作伪操作例例7.267.26、例、例7.27 P274-2767.27 P274-276IFIDNIFIDN伪操作伪操作P276-278 P276-278 例例7.287.28例例9 97/29/202433河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计练习与作业练习与作业P278-281 习题习题练习:练习:7.97.9、7.157.15提交作业:提交作业:7.77.7、7.117.117/29/202434河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计条件表达式中的操作符条件表达式中的操作符 格式:格式:数值表达式数值表达式 & & 位数位数优先级顺序优先级顺序7/29/202435河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例1 1 单分支单分支求求AXAX绝对值绝对值.IF.IFAX 0AX =ax=axmovmovtag , 0tag , 0.else.elsemovmovtag , 1tag , 1. .endifendif.exit.exit0 0endend7/29/202440河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例4 4实现实现1 1100100求和。求和。xorxorax , axax , axmovmovcxcx , 100 , 100.while.while cxcx!=0!=0addaddax , ax , cxcx decdec cxcx. .endwendwmovmovsum , axsum , ax7/29/202441河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例5 5xorxorax , axax , axmovmovcxcx , 100 , 100.repeat.repeataddaddax , ax , cxcxdecdeccxcx.until.until cxcx=0=0movmovsum , axsum , ax.repeat.repeataddaddax , ax , cxcx. .untilcxzuntilcxz7/29/202442河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例6-16-1 设设arrayarray是是100100个字元素的数组,试计算其中前若干个非负数个字元素的数组,试计算其中前若干个非负数之和,直到出现第一个负数为止,并将结果存入之和,直到出现第一个负数为止,并将结果存入resultresult单元(不单元(不考虑进位和溢出)。考虑进位和溢出)。.model.model small small.stack.stack.data.dataarrayarrayswordsword100 dup(?)100 dup(?)resultresult swordsword? ?.code.code.startup.startupmovmovcxcx , 100 , 1007/29/202443河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例6-26-2 xorxorax , axax , axlealeabxbx , array , array.repeat.repeat.if.ifsword sword ptrptr bxbx=0=0addaddax , ax , bxbx .else.else.break.break. .endifendifincincbxbxincincbxbx. .untilcxzuntilcxzmovmovresult , axresult , ax.exit.exit0 0endend7/29/202444河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例ltd.asm-1ltd.asm-1; ;汇编语言程序汇编语言程序.model small.model smallchecksumdchecksumd PROTO c , :word , :word PROTO c , :word , :word ; ;声明过程声明过程.stack.stack.data.dataarrayarraydbdb 12h,25h,0f0h,0a3h,3 12h,25h,0f0h,0a3h,3dbdb 68h,71h,0cah,0ffh,90h 68h,71h,0cah,0ffh,90hcountcountequequ $-array$-array; ;数组的元素个数数组的元素个数resultresult db db ? ?; ;校验和校验和.code.code.startup.startupINVOKE INVOKE checksumdchecksumd ,count, offset array ,count, offset array; ;调用过程调用过程movmov result,alresult,al; ;保存校验和保存校验和.exit 0.exit 07/29/202445河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例ltd.asm-2ltd.asm-2 checksumdchecksumd PROC c USES PROC c USES bxbx cxcx, ,countp:word,arrayp:wordcountp:word,arrayp:wordmovmov bxbx , , arrayparrayp;BX;BX数组的偏移地址数组的偏移地址movmov cxcx , , countpcountp;CX;CX数组的元素个数数组的元素个数xorxor al , alal , alsumdsumd: :add add al , al , bxbx ; ;求和:求和:ALAL+DS:BXALAL+DS:BXincincbxbxloop loop sumdsumdretretchecksumdchecksumd endpendpendend列表文件列表文件7/29/202446河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例ltd.asmltd.asm列表文件列表文件-1-1; ;ltd.asmltd.asm的列表文件(的列表文件(ltd.lstltd.lst).INVOKE INVOKE checksumd,count,offsetchecksumd,count,offset array array * *movmov ax , word ax , word ptrptr OFFSET array OFFSET array * *pushpushaxax * *movmov ax , +000Ahax , +000Ah * *pushpushaxax * *call call checksumdchecksumd * *add add sp , 04hsp , 04hmovmov result , alresult , al.checksumdchecksumd PROC c USES PROC c USES bxbx cxcx,countp:word,arrayp:wordcountp:word,arrayp:word * *push push bpbp; ;起始代码起始代码7/29/202447河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例ltd.asmltd.asm列表文件列表文件-2-2* *movmov bp,spbp,sp* *push push bxbx; ;保护保护bxbx和和cxcx* *push push cxcxmovmov bx,arraypbx,arrayp; ;arrayparrayp=BP+6=BP+6movmov cx,countpcx,countp; ;cuontpcuontp=BP+4=BP+4.retret * *pop pop cxcx; ;结尾代码结尾代码 * *pop pop bxbx* *pop pop bpbp* *ret 0000hret 0000hchecksumcchecksumc endpendp进入调试程序观察进入调试程序观察7/29/202448河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.1 7.1 宏定义宏定义例例7.1 7.1 用宏指令定义两个字操作数相乘,得到一个用宏指令定义两个字操作数相乘,得到一个1616位的第三个位的第三个操作数作为结果。宏定义如下:操作数作为结果。宏定义如下:MULTIPLYMULTIPLYMACROMACROOPR1 , OPR2 , RESULTOPR1 , OPR2 , RESULTPUSHPUSHDXDXPUSHPUSHAXAXMOVMOVAX , OPR1AX , OPR1IMULIMULOPR2OPR2MOVMOVRESULT , AXRESULT , AXPOPPOPAXAXPOPPOPDXDXENDMENDM7/29/202449河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.2 7.2 宏调用宏调用宏调用如下:宏调用如下:MULTIPLYMULTIPLYCX , VAR , XYZBXCX , VAR , XYZBXMULTIPLYMULTIPLY240 , BX , SAVE240 , BX , SAVE7/29/202450河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.3 7.3 宏展开宏展开-1-1宏展开如下宏展开如下: :1 1PUSHPUSHDXDX1 1PUSHPUSHAXAX1 1MOVMOVAX , CXAX , CX1 1IMULIMULVARVAR1 1MOVMOVXYZBX , AXXYZBX , AX1 1POPPOPAXAX1 1POPPOPDXDX7/29/202451河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.3 7.3 宏展开宏展开-2-21 1PUSHPUSHDXDX1 1PUSHPUSHAXAX1 1MOVMOVAX , 240AX , 2401 1IMULIMULBXBX1 1MOVMOVSAVE , AXSAVE , AX1 1POPPOPAXAX1 1POPPOPDXDX7/29/202452河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计图图7.1 7.1 宏调用与子程序调用宏调用与子程序调用 7/29/202453河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.27.2宏定义可以无参数。宏定义可以无参数。;宏定义;宏定义SAVERGESAVERGEMACROMACROPUSHPUSHAXAXPUSHPUSHBXBXPUSHPUSHCXCXPUSHPUSHDXDXPUSHPUSHSISIPUSHPUSHDIDIENDMENDM; ;宏调用宏调用SAVERGESAVERGE; ;宏展开时则将宏定义体的内容全部列出宏展开时则将宏定义体的内容全部列出7/29/202454河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.37.3参数可以是操作码。参数可以是操作码。;宏定义;宏定义FOOFOOMACROMACROP1 , P2 , P3P1 , P2 , P3MOVMOVAX , P1AX , P1P2P2P3P3ENDMENDM;宏调用;宏调用FOOFOOWORD_VAR , INC , AXWORD_VAR , INC , AX;宏展开;宏展开1 1MOVMOVAX , WORD_VARAX , WORD_VAR1 1INCINCAXAX7/29/202455河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.47.4 参数可以是操作码的一部分,但在宏定义体中必须使用参数可以是操作码的一部分,但在宏定义体中必须使用& &作为作为操作符。操作符。;宏定义;宏定义LEALEAMACROMACROCOND , LABCOND , LABJ J& &CONDCOND LABLABENDMENDM;宏调用;宏调用LEALEAZ , THEREZ , THERELEALEANZ , HERENZ , HERE;宏展开;宏展开1 1JZJZTHERETHERE1 1JNZJNZHEREHERE替换操作符替换操作符7/29/202456河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.57.5& &操作符的应用:形成操作数操作符的应用:形成操作数;宏定义;宏定义FOFOMACROMACROP1P1JMPJMPTATA& &P1P1ENDMENDM;宏调用;宏调用FOFOWORD_VARWORD_VAR;宏展开;宏展开1 1JMPJMPTAWORD_VARTAWORD_VAR7/29/202457河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.67.6& &操作符的应用:参数是操作符的应用:参数是ASCIIASCII串。串。;宏定义;宏定义MSGGENMSGGEN MACROMACROLAB , NUM , XYZLAB , NUM , XYZLAB&NUMLAB&NUMDBDBHELLO MR. &XYZHELLO MR. &XYZENDMENDM;宏调用;宏调用MSGGENMSGGEN MSG , 1 ,TAYLORMSG , 1 ,TAYLOR;宏展开;宏展开1 1MSG1MSG1DBDBHELLO MR. TAYLORHELLO MR. TAYLOR7/29/202458河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.7-17.7-1% %操作符的应用操作符的应用;宏定义;宏定义MSGMSGMACROMACROCOUNT , STRINGCOUNT , STRINGMSGMSG& &COUNTCOUNTDBDBSTRINGSTRINGENDMENDMERRMSGERRMSG MACROMACROTEXTTEXTCNTR=CNTR+1CNTR=CNTR+1MSGMSG% %CNTR , TEXTCNTR , TEXTENDMENDM表达式操作符表达式操作符7/29/202459河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.7-27.7-2;宏调用;宏调用CNTR=0CNTR=0ERRMSGERRMSG SYNTAX ERRORSYNTAX ERRORERRMSGERRMSG INVALID OPERANDINVALID OPERAND;宏展开;宏展开CNTR=0CNTR=01 1CNTR=CNTR+1CNTR=CNTR+11 1MSGMSG% % CNTR , SYNTAX ERRORCNTR , SYNTAX ERROR2 2MSG1MSG1DBDBSYNTAX ERRORSYNTAX ERROR1 1CNTR=CNTR+1CNTR=CNTR+11 1MSGMSG% %CNTR , INVALID OPERANDCNTR , INVALID OPERAND2 2MSG2MSG2DBDBINVALID OPERANDINVALID OPERAND7/29/202460河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例8 8;宏定义;宏定义dstringdstringmacro stringmacro stringdb db & &stringstring& &,0dh,0ah,$,0dh,0ah,$endmendm;宏调用;宏调用dstringdstring dstringdstring 0 0 ! ! Number Number ! ! 10 ;宏展开;宏展开 1 1db This is a example., 0dh,0ah,$db This is a example., 0dh,0ah,$ 1 1db 0 Number 10, 0dh,0ah, $db 0 Number 10, 0dh,0ah, $转义操作符转义操作符传递操作符传递操作符7/29/202461河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.87.8;宏定义;宏定义absolabsolmacro macro operoperlocallocalnextnextcmpcmpoperoper , 0 , 0jgejgenextnextnegnegoperopernext:next:endmendm;宏调用;宏调用absolabsol varvarabsolabsol bxbx;宏展开;宏展开 1 1cmpcmp varvar , 0 , 0 1 1jgejge ?0000?0000 1 1negneg varvar 1 1?0000?0000 : : 1 1cmpcmpbxbx , 0 , 0 1 1jgejge ?0001?0001 1 1negneg bxbx 1 1?0001?0001 : :单独占一行单独占一行7/29/202462河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.9-17.9-1宏必须先定义后调用。宏必须先定义后调用。;宏定义;宏定义DIFDIFMACROMACROX ,YX ,YMOVMOVAX , YAX , YSUBSUBAX , YAX , YENDMENDMDIFSQRDIFSQR MACROMACROOPR1 , OPR2 , RESULTOPR1 , OPR2 , RESULTPUSHPUSHDXDXPUSHPUSHAXAXDIFDIFOPR1 , OPR2OPR1 , OPR2IMULIMULAXAXMOVMOVRESULT , AXRESULT , AXPOPPOPAXAXPOPPOPBXBXENDMENDM7/29/202463河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.9-27.9-2;宏调用;宏调用DIFSQRDIFSQRVAR1 , VAR2 , VAR3VAR1 , VAR2 , VAR3;宏展开;宏展开1 1PUSHPUSHDXDX1 1PUSHPUSHAXAX2 2MOVMOVAX , VAR1AX , VAR12 2SUBSUBAX , VAR2AX , VAR21 1IMULIMULAXAX1 1MOVMOVVAR3 , AXVAR3 , AX1 1POPPOPAXAX1 1POPPOPDXDX7/29/202464河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.10-17.10-1;宏定义;宏定义INT21INT21MACROMACROFUNCTNFUNCTNMOVMOVAH , FUNCTNAH , FUNCTNINTINT21H21HENDMENDMDISPDISPMACROMACROCHARCHARMOVMOVDL , CHARDL , CHARINT21INT2102H02HENDMENDM;宏调用;宏调用DISPDISP?7/29/202465河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.10-27.10-2;宏展开;宏展开1 1MOVMOVDL , ?DL , ?2 2MOVMOVAH , 02HAH , 02H2 2INTINT21H21H7/29/202466河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.11-17.11-1宏定义体内还可以包含宏定义。宏定义体内还可以包含宏定义。;宏定义;宏定义DEFMACDEFMAC MACROMACROMACNAM , OPERATORMACNAM , OPERATORMACNAMMACNAM MACROMACROX ,Y ,ZX ,Y ,ZPUSHPUSHAXAXMOVMOVAX ,YAX ,YOPERATOPOPERATOPAX ,YAX ,YMOVMOVZ , AXZ , AXPOPPOPAX AX ENDMENDMENDMENDM7/29/202467河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.11-27.11-2;宏调用;宏调用DEFMACDEFMACADDTION , ADDADDTION , ADD;形成加法宏定义;形成加法宏定义ADDTIONADDTIONMACROMACROX ,Y , ZX ,Y , ZPUSHPUSHAX AX MOVMOVAX ,XAX ,XADDADDAX ,YAX ,YMOVMOVZ ,AXZ ,AXPOPPOPAXAXENDMENDM;宏调用;宏调用DEFMACDEFMAC SUBTRACT , SUBSUBTRACT , SUB;形成减法宏定义;形成减法宏定义DEFMACDEFMAC LOGOR , ORLOGOR , OR;形成逻辑或宏定义;形成逻辑或宏定义7/29/202468河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.11-37.11-3;接下来,宏调用;接下来,宏调用ADDTIONADDTIONVAR1 , VAR2 , VAR3VAR1 , VAR2 , VAR3;宏展开;宏展开1 1PUSHPUSHAXAX1 1MOVMOVAX , VAR1AX , VAR11 1ADDADDAX ,VAR2AX ,VAR21 1MOVMOVVAR3 , AXVAR3 , AX1 1POPPOPAXAX7/29/202469河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.137.13X=0X=0REPTREPT1010X=X+1X=X+1DBDBX XENDMENDM 1 1DBDB1 1 1 1DBDB2 2 1 1DBDB3 3. 1 1DBDB1010 7/29/202470河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.147.14CHAR=ACHAR=ATABLETABLELABELLABELBYTEBYTEREPTREPT2626DBDBCHARCHARCHAR=CHAR+1CHAR=CHAR+1ENDMENDM 1 1DBDB41H41H 1 1DBDB42H42H. 1 1DBDB5AH5AH把字符把字符A A到到Z Z的的ASCIIASCII码填入数组码填入数组TABLETABLE。7/29/202471河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.157.15;宏定义;宏定义PUSH_TABPUSH_TABMACROMACROK KPUSHPUSHTAB+KTAB+KENDMENDM 用宏定义及重复伪操作把用宏定义及重复伪操作把TABTAB,TAB+2TAB+2,TAB+4TAB+4,TAB+8TAB+8的内的内容存入堆栈。容存入堆栈。;宏调用;宏调用I=0I=0REPTREPT5 5PUSH_TABPUSH_TAB%I%II=I+2I=I+2ENDMENDM 2 2PUSHPUSHTAB+0TAB+0 2 2PUSHPUSHTAB+2TAB+2 2 2PUSHPUSHTAB+4TAB+4 2 2PUSHPUSHTAB+6TAB+6 2 2PUSHPUSHTAB+8TAB+87/29/202472河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.167.16ARRAYARRAYLABLELABLEWORDWORDREPTREPT7 7DWDW$+2$+2ENDMENDMDWDWARRAYARRAY 建立一个建立一个8 8字数组,其中每个字的内容是下一个字的地址,字数组,其中每个字的内容是下一个字的地址,而最后一个字的内容是第一个字的地址。而最后一个字的内容是第一个字的地址。 1 1DWDW$+2$+2 1 1DWDW$+2$+2. 1 1DWDW$+2$+2DWDWARRAYARRAY7 7个字个字7/29/202473河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.177.17IRPIRPX , X , DBDBX XENDMENDM 1 1DBDB1 1 1 1DBDB2 2. 1 1DBDB10107/29/202474河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.187.18IRPIRPREG , REG , PUSHPUSHREGREGENDMENDM 1 1PUSHPUSHAXAX 1 1PUSHPUSHBXBX 1 1PUSHPUSHCXCX 1 1PUSHPUSHDXDX7/29/202475河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.197.19IRPCIRPCX , 01234567X , 01234567DBDBX+1X+1ENDMENDM 1 1DBDB1 1 1 1DBDB2 2 1 1DBDB8 87/29/202476河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例7.207.20IRPCIRPCK , ABCDK , ABCDPUSHPUSHK&XK&XENDMENDM 1 1PUSHPUSHAXAX 1 1PUSHPUSHBXBX 1 1PUSHPUSHCXCX 1 1PUSHPUSHDXDX7/29/202477河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院IBM-PC汇编语言程序设计 例例9 9定义一个元素个数不超过定义一个元素个数不超过100100的数组。的数组。pdatapdatamacro nummacro num IF IF num num ltlt 100 100;如果如果num 100num 100,则汇编如下语句,则汇编如下语句dbdbnum dup (?)num dup (?) ELSE ELSE;否则,汇编如下语句否则,汇编如下语句db db 100 dup (?)100 dup (?) ENDIF ENDIFendmendm;*pdatapdata 1212 ; ;宏调用宏调用db db 12 12 dup(?)dup(?) ; ;宏汇编结果宏汇编结果pdatapdata 102102; ;宏调用宏调用db db 100100 dup(?) dup(?); ;宏汇编结果宏汇编结果7/29/202478河南师范大学计算机与信息技术学院河南师范大学计算机与信息技术学院
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号