汇编语言宏指令语句.ppt
第5章 汇编语言程序设计 5.4 宏指令语句宏指令语句1.宏指令、宏定义和宏调用宏指令、宏定义和宏调用宏指令是源程序中具有宏指令是源程序中具有独立功能的一段程序代码独立功能的一段程序代码。在汇编语言中,如果在源程序中需要多次使用同一个在汇编语言中,如果在源程序中需要多次使用同一个程序段,可以将这个程序段定义(宏定义)为一个宏程序段,可以将这个程序段定义(宏定义)为一个宏指令,然后指令,然后每次需要是,即可简单地用宏指令名来代每次需要是,即可简单地用宏指令名来代替(称为宏调用),替(称为宏调用),从而避免了重复书写,使源程序从而避免了重复书写,使源程序更加简洁、易读。更加简洁、易读。宏定义由宏定义由MASM宏汇编程序提供的伪指令实现,宏汇编程序提供的伪指令实现,其格式为其格式为第5章 汇编语言程序设计 宏指令名宏指令名 MACRO 形式参数形式参数 ENDM宏调用的格式为宏调用的格式为 宏指令名宏指令名 实际参数实际参数这就是说,只要在源程序中写上已定义过的宏指这就是说,只要在源程序中写上已定义过的宏指令名就算是调用该宏指令了。令名就算是调用该宏指令了。具有宏调用的源程序被汇编时,每个宏调用将被具有宏调用的源程序被汇编时,每个宏调用将被MASM进行宏展开。宏展开实际上是用宏定义式设计的进行宏展开。宏展开实际上是用宏定义式设计的宏体去代替相应的宏指令,并用实际参数一一取代形参。宏体去代替相应的宏指令,并用实际参数一一取代形参。宏体第5章 汇编语言程序设计 由此可见,使用宏的过程共有三步:首先由此可见,使用宏的过程共有三步:首先进行宏定进行宏定义义;然后可以进行;然后可以进行宏调用宏调用;最后,汇编时由;最后,汇编时由MASM进行进行宏展开宏展开。例例 若源程序中多处需要将若源程序中多处需要将AL和和CL寄存器中的寄存器中的两位压缩型的两位压缩型的BCD数相加,并将和送回数相加,并将和送回BL寄存器,则寄存器,则可象下述这样定义宏指令,然后在需要的地方进行调用。可象下述这样定义宏指令,然后在需要的地方进行调用。DECADDMACROADD AL,CLDAAENDM显而易见,这是一个无形式参数的宏定义。显而易见,这是一个无形式参数的宏定义。第5章 汇编语言程序设计 如果对分别存放在任意如果对分别存放在任意8位寄存器或存储单元中的位寄存器或存储单元中的两个压缩型的两个压缩型的BCD数进行加法运算,则可将上例宏定数进行加法运算,则可将上例宏定义改写为义改写为DECADD1 MACRO OPR1,OPR2MOV AL,OPR1ADD AL,OPR2DAAMOV OPR1,ALENDM这是一个带有两个形式参数的宏定义。宏指令为这是一个带有两个形式参数的宏定义。宏指令为DECADD1。例如有以下宏调用:。例如有以下宏调用:第5章 汇编语言程序设计 DECADD1 DL,BUFFERDECADD1AREA1,AREA2则汇编时进行宏展开,得到以下指令:则汇编时进行宏展开,得到以下指令:DECADD1 DL,BUFFER+MOV AL,DL+ADD AL,BUFFER+DAA+MOV DL,AL DECADD1 AREA1,AREA2+MOV AL,AREA1+ADD AL,AREA2+DAA+MOV AREA1,AL宏扩展后,原来宏体中的指令前面都加上了符号宏扩展后,原来宏体中的指令前面都加上了符号“”,以示区别以示区别。第5章 汇编语言程序设计 宏指令与子程序的区别宏指令与子程序的区别在汇编语言程序设计中,宏指令和子程序都给设计在汇编语言程序设计中,宏指令和子程序都给设计者提供了很大方便。他们都是可被程序多次调用的程序者提供了很大方便。他们都是可被程序多次调用的程序段,并且调用前必须由设计者事先根据需要按一定格式段,并且调用前必须由设计者事先根据需要按一定格式进行定义。然而,宏指令和子程序由于定义方法和几个进行定义。然而,宏指令和子程序由于定义方法和几个是不同,使用中会有许多不同之处,主要是空间和时间是不同,使用中会有许多不同之处,主要是空间和时间的差异。的差异。子程序由子程序由CALL指令调用,由指令调用,由RET指令返回指令返回,所以汇编后子程序的机器码只占有一个程序段,不管调所以汇编后子程序的机器码只占有一个程序段,不管调用多少次均如此,较为节约内存。宏指令在每次宏调用用多少次均如此,较为节约内存。宏指令在每次宏调用处宏展开时,宏体都要占一个程序段,调用次数愈多,处宏展开时,宏体都要占一个程序段,调用次数愈多,占用内存愈多。因此从内存空间开销来说,子程序优于占用内存愈多。因此从内存空间开销来说,子程序优于宏指令。宏指令。第5章 汇编语言程序设计 从程序的执行时间来分析,每调用一次子程序从程序的执行时间来分析,每调用一次子程序都要保护和恢复返回地址(断点)及寄存器内容(现场)都要保护和恢复返回地址(断点)及寄存器内容(现场)等,要消耗较多的时间。宏指令调用时不需要这个过程,等,要消耗较多的时间。宏指令调用时不需要这个过程,执行时间较短。因此,从执行时间来分析,宏指令又优执行时间较短。因此,从执行时间来分析,宏指令又优于子程序。于子程序。综上所述,综上所述,当某一需多次访问的程序段较长,访当某一需多次访问的程序段较长,访问次数又不是太多时,选用子程序结构较好。当某一需问次数又不是太多时,选用子程序结构较好。当某一需多次访问的程序段较短,访问次数又很频繁时,选用宏多次访问的程序段较短,访问次数又很频繁时,选用宏指令结构显然要更好些。指令结构显然要更好些。第5章 汇编语言程序设计.EXE.EXE文件文件5.5 汇编语言程序上机过程要想在计算机上要想在计算机上 运行汇编语言程序,必须首先运行汇编语言程序,必须首先对源程序进行汇编和连接。下图表示了对汇编语言源对源程序进行汇编和连接。下图表示了对汇编语言源程序的编辑、汇编和连接的过程。程序的编辑、汇编和连接的过程。手写程序手写程序.ASM.ASM文件文件.OBJ.OBJ文件文件编辑程序编辑汇编程序汇编连接程序连接EDITEDITEDITMASMMASMMASMLINKLINKLINK汇编语言程序上机过程汇编语言程序上机过程第5章 汇编语言程序设计 5.5.1 用编辑程序建立汇编语言源程序文件用编辑程序建立汇编语言源程序文件建立一个汇编语言源程序,可以使用建立一个汇编语言源程序,可以使用Windows系统系统下的下的记事本程序记事本程序来编写,也可以使用来编写,也可以使用DOS操作系统下的操作系统下的EDIT程序程序来编写。来编写。例如从键盘输入二个数存入内存以例如从键盘输入二个数存入内存以DATA开始的二开始的二个单元中,然后选出其中的大数输出。个单元中,然后选出其中的大数输出。设编辑后的汇编语言源程序名为:设编辑后的汇编语言源程序名为:exp1.asm第5章 汇编语言程序设计 5.5.2 用汇编程序将用汇编程序将.ASM文件汇编成目标程序文件文件汇编成目标程序文件.OBJ在对汇编语言源程序文件(简称在对汇编语言源程序文件(简称ASM文件)文件)汇编时,汇编程序将对汇编时,汇编程序将对ASM文件进行二遍扫描。文件进行二遍扫描。若程序文件中有语法错误,则在结束汇编后将若程序文件中有语法错误,则在结束汇编后将指出源程序中的错误语句及错误类型。否则将指出源程序中的错误语句及错误类型。否则将在汇编后生成目标程序文件(即在汇编后生成目标程序文件(即OBJ文件)文件)完成汇编功能的是小汇编程序完成汇编功能的是小汇编程序ASM或宏汇或宏汇编程序编程序MASM。汇编过程如下表所示:汇编过程如下表所示:第5章 汇编语言程序设计 MASM宏汇编的提示信息及回答宏汇编的提示信息及回答交叉参考文件用的文件名(缺省:无交叉参考文件)Cross referenceNUL.CRF:(交叉参考文件名)列表文件名(缺省:无列表文件)Source listingNUL.LST:(源列表文件名)可重新定位目标文件名(缺省:源文件名.OBJ)Object filenameSource.OBJ:(目标文件名)欲汇编的.ASM源文件名(缺省:命令中的文件名)Source filename.ASM:(源文件名)回 答提 示 信 息第5章 汇编语言程序设计 5.2.3 用连接程序生成可执行程序文件用连接程序生成可执行程序文件(EXE 文件)文件)经汇编后产生的目标程序文件(经汇编后产生的目标程序文件(OBJ文件)并不是文件)并不是可执行程序文件,必须经连接后才能成为可执行文件可执行程序文件,必须经连接后才能成为可执行文件(EXE文件)。连接程序并不是专门为汇编语言程序设文件)。连接程序并不是专门为汇编语言程序设计的,如果一个程序是由若干个模块组成的,也可以通计的,如果一个程序是由若干个模块组成的,也可以通过连接程序把它们连接在一起。这些模块可以是汇编程过连接程序把它们连接在一起。这些模块可以是汇编程序产生的目标程序文件,也可以是高级语言编译程序产序产生的目标程序文件,也可以是高级语言编译程序产生的目标程序文件。生的目标程序文件。完成连接功能的程序是完成连接功能的程序是LINK程序。连接过程如下程序。连接过程如下表所示:表所示:第5章 汇编语言程序设计 LINK程序的提示信息及回答程序的提示信息及回答库文件名表(各文件之间用号隔开)Libraries.LIB(库文件)列表文件名(缺省:无文件名)List File NUL.MAP(列表文件)连接后生成的执行文件名(缺省:目标文件名)Run File object.EXE(运行文件)目标代码模块表(各模块之间用号隔开)Oject Modules.OBJ(目标模块)回 答提 示 信 息第5章 汇编语言程序设计 DATA SEGMENT DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATASTART:MOV AX,DATAMOV DS,AXMOV ES,AXMOV AH,4CHINT 21HCODE ENDS END START第5章 汇编语言程序设计 DATA SEGMENT DATA ENDSCODE SEGMENTMAIN FROC FAR ASSUME CS:CODE,DS:DATA,ES:DATASTART:PUSH DSXOR AX,AXPUSH AXMOV AX,DATAMOV DS,AXMOV ES,AXRETMAIN ENDPCODE ENDS END START