80*86汇编语言程序设计 第2版 教学课件 ppt 作者 马力妮 第7章 高级汇编技术

上传人:E**** 文档编号:89442665 上传时间:2019-05-25 格式:PPT 页数:33 大小:596.50KB
返回 下载 相关 举报
80*86汇编语言程序设计 第2版 教学课件 ppt 作者 马力妮 第7章 高级汇编技术_第1页
第1页 / 共33页
80*86汇编语言程序设计 第2版 教学课件 ppt 作者 马力妮 第7章 高级汇编技术_第2页
第2页 / 共33页
80*86汇编语言程序设计 第2版 教学课件 ppt 作者 马力妮 第7章 高级汇编技术_第3页
第3页 / 共33页
80*86汇编语言程序设计 第2版 教学课件 ppt 作者 马力妮 第7章 高级汇编技术_第4页
第4页 / 共33页
80*86汇编语言程序设计 第2版 教学课件 ppt 作者 马力妮 第7章 高级汇编技术_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《80*86汇编语言程序设计 第2版 教学课件 ppt 作者 马力妮 第7章 高级汇编技术》由会员分享,可在线阅读,更多相关《80*86汇编语言程序设计 第2版 教学课件 ppt 作者 马力妮 第7章 高级汇编技术(33页珍藏版)》请在金锄头文库上搜索。

1、第7章 高级汇编技术,7.1 宏汇编 7.2 重复汇编 7.3 条件汇编,7.1 宏汇编,7.1.1 宏定义 7.1.2 宏定义和调用时的参数使用 7.1.3 宏定义的伪指令 7.1.4 宏库的建立和使用,7.1.1 宏定义,1.指令格式: 宏指令名 MACRO 形式参数表 宏体 ENDM,2.宏调用和宏展开: 宏指令的使用过程分为三步,即:宏定义、宏调用和宏展开. 1)宏调用 经过定义后的宏,就可以在程序中用下列形式进行宏调用 指令格式: 宏指令名 实参表 当源程序被汇编时,汇编程序将对宏调用作宏展开。宏展开就是用宏定义体取代源程序中的宏指令名,用实参取代宏定义中的形式参数,也就是,汇编程序

2、将宏指令用相应的宏体来代替,一条指令变成了一组指令。在取代时,实参和形参一一对应。 2宏展开(宏扩展) 在宏展开时进行语法检查,产生相应的目标代码,在源列表文件(*.LST)中被展开的语句之前有特殊标志: MASM2.0 为 “+“。 MASM5.0 为 “1“ ,与宏定义的个数及扩展的次数无关,如果宏定义嵌套有其他的宏调用,则用“2“表示有与其它宏的嵌套关系。,【例7-1】分别编写显示一个10进制数的宏和子程序。 (1)编写程序 宏定义: ;显示一位10进制数据的宏,要显示的数在DL中 DISPLDATAM MACRO ADD DL,30H ;将要显示的10进制数转换成ASCII码 MOV

3、AH,02H ;显示 INT 21H ENDM 子程序: ;显示一位10进制数据的子程序 ;入口参数:要显示的数在DL中 DISPLDATAP PROC PUSH AX ;保护现场 ADD DL,30H ;将要显示的10进制数转换成ASCII码 MOV AH,02H ;显示 INT 21H POP AX ;恢复现场 RET DISPLDATAP ENDP,主程序:MODEL SMALL 386 CODE STARTUP MOV DL,3 ;要显示的10进制数3送DL中 DISPLDATAM ;调用宏在屏幕显示3 MOV DL,9 ;要显示的10进制数9送DL中 CALL DISPLDATAP

4、;调用子程序在屏幕显示9 EXIT ;返回DOS END (2)宏展开 MODEL SMALL 386 CODE STARTUP MOV DL,3 ;要显示的10进制数3送DL中 1 ADD DL,30H ;将要显示的10进制数转换成ASCII码 1 MOV AH,02H ;显示 1 INT 21H MOV DL,9 ;要显示的10进制数9送DL中 CALL DISPLDATAP ;调用子程序在屏幕显示9 EXIT ;返回DOS END,(3)说明 宏展开后,在原主程序中的宏指令名DISPLDATAM的位置上用宏定义体取代,使目标程序变长,而子程序的调用,只是在程序执行时去执行子程序,在子程序

5、中使用了堆栈来保存断点,而宏则不需要。,3 宏与子程序的区别: (1)宏展开占有的存贮空间与调用次数有关:调用次数越多,占内存越大。 (2)子程序占有它自身大小的空间,由主程序调用时,空间不随调用次数增大。 因此,代码较长的功能段往往使用子程序,不用宏汇编。对代码较短的而且形式参数较多的功能段,使用宏更为合理,7.1.2 宏定义和调用时的参数使用,实参可以是常数,寄存器,变量以及用寻址方式能找到的地址或表达式等。但它还可以是指令的操作码或操作码的一部分。 1.实参是常数 2.实参是寄存器 3.实参是变量 4.实参是标号 5.嵌套的宏,【例7-3】交换两寄存器的内容。 (1)宏定义 REGG M

6、ACRO X,Y,Z MOV Z,X MOV X,Y MOV Y,Z ENDM (2)宏调用 REGG AX, BX,DX (3)宏展开 1 MOV DX,AX 1 MOV AX,BX 1 MOV BX,DX,【例7-2】将AL中内容乘以某常数。 (1)宏定义 MUL1 MACRO DATA1 ;DATA1是一个常数 MOV BL,DATA1 ;将某常数送BL MUL BL ENDM (2)宏调用 MUL1 8 (3)宏展开 1 MOV BL,8 ;将某常数送BL 1 MUL BL ;ALBL,【例7-4】交换两变量的内容 (1)宏定义 VAR MACRO X,Y,Z MOV Z,X XCHG

7、 Z,Y MOV X,Z ENDM (2)宏调用 VAR X1,Y1,DX ;X1、Y1为字变量 (3)宏展开 1 MOV DX, X1 ;变量X1的内容送变量Y1 1 XCHG DX, Y1 1 MOV X1,DX (4)说明 该宏定义与例7-3是相同的,其形参可以是寄存器,也可以是变量和寄存器,只是在宏展开时应符合 汇编指令的要求。,【例7-5】通过宏产生JZ或JNZ指令,同时转移标号是通过实参来传递的。 (1)宏定义 VARIABLE MACRO CHAR1,LAB ;CHAR1是操作码的一部分,LAB是标号 J&CHAR1 LAB ;J与CHAR1连接组成一个操作码 ENDM (2)宏

8、调用 VARIABLE Z,LOP1 VARIABLE NZ,LOP2 (3)宏展开 1 JZ LOP1 1 JNZ LOP2 (4)说明 &为宏操作符,当形参为标识符或字符串的一部分时,必须用 & 来分隔。,【例7-6】宏定义中调用另一个已定义的宏。 (1)宏定义 MAC1 MACRO X ;宏MAC1 INC X ENDM MAC2 MACRO Y ;宏MAC2 MOV Y, 0 MAC1 Y ;宏调用MAC1 EDNM (2)宏调用 MAC2 AX (3) 宏展开 1 MOV AX,0 2 INC AX ;表示本条宏展开是嵌套在其它宏中的宏展开 (4)说明 在宏定义MAC2中允许使用宏调

9、用: MAC1 Y 其限制条件是:必须先定义后调用。 也允许宏定义中宏定义。,7.1.3 宏定义的伪指令,1.宏内局部标号定义伪指令 指令格式: LOCAL 标号 ,标号. 指令功能:解决宏扩展时引起的标号重复定义的问题。 2.宏定义废除伪指令 指令格式: PURGE 宏名字 ,宏名字 . 指令功能:废除指定的宏,释放所占用的存储空间。废除的宏必须是已定义的,废除多个宏时,宏名字之间用逗号隔开。,【例7-7】软件延时DELAY的宏 (1)宏定义 DELAY MACRO TIME ;延时宏定义,TIME为外循环次数 LOCAL P1,P2 ;对宏体中的标号定义 PUSHA ;保护现场 AX,CX

10、,DX,BX,SP,BP,SI,DI进栈, SPSP-16 MOV DX,TIME P1: MOV CX,0FF00H ;内循环次数为0FF00H P2: LOOP P2 DEC DX JNZ P1 POPA ;出栈送DI,SI,BP,SP,BX,DX,CX,AX, SPSP+16 ENDM,(2)宏扩展 第一次调用DELAY宏: + PUSHA + MOV DX,TIME +?0000:MOV CX,0FF00H +?0001:LOOP ?0001 + DEC DX + JNZ ?0000 + POPA 第二次调用DELAY宏: + PUSHA + MOV DX,TIME +?0002:MO

11、V CX,0FF00H +?0003:LOOP ?0003 + DEC DX + JNZ ?0002 + POPA,(3)说明 1)在主程序中多次调用DELAY宏时,宏体内的标号P1和P2变成+?0000+?FFFF 。 2)用LOCAL说明了标号P1、P2以后,其它宏定义中仍可以使用P1、P2作为标号,从例中可以看到:汇编程序进行宏扩展时,为这个标号赋予一个新的内部标号名。用这种方法可以保证在汇编的程序中的所有标都是唯一的。,7.1.4 宏库的建立和使用,对于高级语言有系统提供的库函数和自定义的函数,供其它程序使用,在汇编程序中也可以定义宏库,在宏库中定义的宏在任何程序中都可以调用,方便了程

12、序编写,提高程序的执行效率。 1.宏库的建立 定义了一些宏后,将这些已调试过的宏定义建立成一个独立的文件,通常用扩展名MAC或LIB来表示,该文件就是宏库。 由于宏库中的源程序是公用程序,在编写该源程序时应具有通用性,因此,在建立宏库时应注意以下问题: (1)宏定义中的标号,必须用LOCAL伪指令说明。 (2)与子程序一样,对于每一个宏都必须注明宏名字、 对参数的要求。 (3)在宏中用到的寄存器也必须进行现场保护,以免不 破坏原来程序的寄存器的内容。 (4)应附有必要的注释。,2.宏库的使用 当应用程序需要使用宏库中的某些宏定义,只需要在该程序的开始用INCLUDE伪指令,说明该宏库所在的完整

13、路径,就可以使用宏库中的宏定义了。 如:INCLUDE C:MASM库文件名.MAC 该伪指令的含义是源程序包含了宏库,宏库中的所有定义的宏命令都可以在源程序中使用。INCLUDE伪指令可以放在程序的最前面,也可放在其它地方,但必须在所有的宏调用之前。它的运行机制是:在第一次汇编过程中遇到宏调用的伪指令,在宏库中搜索是否有该宏定义,若无,则显示错误信息;若有,则在原宏调用的地方进行宏扩展,然后再对整个程序进行语法检查,给出汇编的结果。,【例7-8】将缓冲区的3个字符串合并成1个字符串。创建一个宏库,宏库名为: MACOR.LIB (1)宏库创建: ;INITZ功能:初始化DS、ES,使DS和E

14、S指向同一个段。 ;入口参数:数据段名DATA,宏调用格式:INITZ ;出口参数:无 INITZ MACRO DATA MOV AX,DATA MOV DS,AX MOV ES,AX ENDM ;DISPL功能:显示缓冲区中的字符串。 ;入口参数:MESSGE显示缓冲区的偏移地址,宏调用格式:DISPL MESSGE ;出口参数:无 DISPL MACRO MESSGE MOV DX, OFFSET MESSGE MOV AH,9 INT 21H ENDM ;FINISH功能:返回DOS。 ;入口参数:无 ;出口参数:无 FINISH MACRO MOV AX,4C00H INT 21H E

15、NDM 将宏库保存到当前目录下:宏库名为:MACOR.LIB。,(2)宏库的使用: INCLUDE MACOR.LIB ;将MACOR.LIB包含到本程序中 STACK SEGMENT PARA STACK DW 100 DUP(?) STACK ENDS DATA SEGMENT PARA MESSGE DB HOW,0DH,0AH DB ARE,0DH,0AH DB YOU,0DH,0AH DB 0DH,0AH DB $ MESSGE _LEN EQU $-BUFF ;缓冲区的长度 MESSGE _END DW $ ;缓冲区的结束符 DATA ENDS CODE SEGMENT CODE ASSUME CS:CODE,DS:D

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号