宏汇编汇编语言第5章.ppt

上传人:wuy****n92 文档编号:90671752 上传时间:2023-05-17 格式:PPT 页数:34 大小:232.66KB
返回 下载 相关 举报
宏汇编汇编语言第5章.ppt_第1页
第1页 / 共34页
宏汇编汇编语言第5章.ppt_第2页
第2页 / 共34页
点击查看更多>>
资源描述

《宏汇编汇编语言第5章.ppt》由会员分享,可在线阅读,更多相关《宏汇编汇编语言第5章.ppt(34页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第章结构化程序设计第章结构化程序设计教学要求:教学要求:理解宏汇编的概念和作用。掌握宏汇编的编程技术。教学要求:教学要求:理解宏汇编的概念和作用。掌握宏汇编的编程技术。教学要求:教学要求:理解宏汇编的概念和作用。掌握宏汇编的编程技术。教学要求:教学要求:理解宏汇编的概念和作用。掌握宏汇编的编程技术。教学要求:教学要求:理解宏汇编的概念和作用。掌握宏汇编的编程技术。5.1子程序的概念子程序的概念5.2子程序的定义、调用和返回子程序的定义、调用和返回*5.3子程序的现场保护与参数传递子程序的现场保护与参数传递*5.4子程序设计子程序设计*5.5子程序的嵌套与递归调用子程序的嵌套与递归调用5.6宏汇

2、编程序设计宏汇编程序设计教学基本内容教学基本内容什么是宏?什么是宏?宏是源程序中一段有独立功能的程序代码。它只需在源程序中定义一次就可以多次调用它,调用时,只需要用一个宏指令语句就可以了宏(Macro)是汇编语言的一个特点,它是与子程序类似又独具特色的另一种简化源程序的方法5.6宏结构程序设计宏结构程序设计宏汇编宏汇编重复汇编重复汇编条件汇编条件汇编宏结构宏结构一、宏汇编一、宏汇编内容内容宏定义宏定义宏调用宏调用宏展开宏展开、宏定义、宏定义宏名宏名macro macro 形参表形参表;宏指令体(宏体);宏指令体(宏体)endmendm()宏名(宏指令名)()宏名(宏指令名):给出该宏定义的名称

3、:给出该宏定义的名称(第一个符号必第一个符号必须是字母须是字母)。()()macro/endm macro/endm 系统提供的定义宏的伪指令。系统提供的定义宏的伪指令。()形参表()形参表 :给出宏定义中所用到的形式参数,参数可以没:给出宏定义中所用到的形式参数,参数可以没有,或带有一个或是多个,当是多个参数时,每个形参之间需用有,或带有一个或是多个,当是多个参数时,每个形参之间需用逗号隔开。具体参数可以是常数、变量、指令或它们的一部分,逗号隔开。具体参数可以是常数、变量、指令或它们的一部分,也可以是表达式。也可以是表达式。()宏指令体()宏指令体 :一组有独立功能的汇编程序代码。其中可以包

4、:一组有独立功能的汇编程序代码。其中可以包括指令、伪指令及宏指令等。括指令、伪指令及宏指令等。1 1、宏定义(续)、宏定义(续)fillsegfillsegmacro Dsegnamemacro Dsegname;带有形参带有形参DsegnameDsegnamemov ax,Dsegname mov ax,Dsegname;宏定义中使用参数宏定义中使用参数mov ds,axmov ds,axendmendm ;宏定义结束宏定义结束举例:举例:思考:思考:此处的形参此处的形参DsegnameDsegname是什么?是什么?DsegnameDsegname是数据段的段名是数据段的段名2 2、宏调用

5、、宏调用宏名宏名 实参表实参表;调用时,只需使用宏指令名来调用该宏定义;调用时,只需使用宏指令名来调用该宏定义例如:例如:对上面的宏定义的调用形式为:对上面的宏定义的调用形式为:FILLSEGFILLSEGDATA;DATA为数据段的段名为数据段的段名 说说明明:()汇汇编编时时,汇汇编编程程序序对对每每个个宏宏调调用用作作宏宏展展开开用用宏宏定定义义体体取取代代源源程程序序中中的的宏宏指指令令名名,用用实实参参代代替替宏宏定定义义中中的的形形参参。取取代代时时,实实参参和和形形参参是是一一一一对对应应的的。若若实实参参个个数数形形参参个个数数,则则多多余余实实参参不不考考虑虑,若若实实参参个

6、个数数形形参参个个数数,则则多多余余形形参参作作“空空”处理。处理。()取取代代后后,所所得得到到的的语语句句应应该该是是有有效效的的,否否则则汇汇编编程程序序将将会会指指示出错。示出错。()每每调调用用一一次次就就把把宏宏定定义义体体展展开开一一次次,因因而而它它占占有有的的存存储储空空间间与调用次数与调用次数有关。有关。、宏展开、宏展开宏调用宏调用的实质是在汇编过程中进行宏展开的实质是在汇编过程中进行宏展开宏展开宏展开的具体过程是:当汇编程序扫描源程序遇到已有定义的具体过程是:当汇编程序扫描源程序遇到已有定义的宏调用时,即用相应的的宏调用时,即用相应的宏定义体取代源程序的宏指令宏定义体取代

7、源程序的宏指令,同时,同时用用位置匹配的实参对形参进行取代。位置匹配的实参对形参进行取代。1MOVAX,DATA1MOVDS,AX例如:上面的宏调用,其展开形式为:例如:上面的宏调用,其展开形式为:宏汇编应用举例例宏汇编应用举例例data segmentbuf1 db 0dh,0ah,what are your name?$buf2 db 0dh,0ah,my name is liyang!$data endscode segment assume ds:data,cs:codestart:mov ax,data mov ds,ax dispmacromleadx,mmovah,9int21h

8、endm disp buf1 disp buf2 mov ah,4ch int 21hcode ends end start 宏汇编应用举例例宏汇编应用举例例17P148multiplymacroopr1,opr2,result;定义宏定义宏pushdxpushaxmoval,opr1imulopr2movresult,axpopaxpopdxendmdatasegmentadb3bdw?dataendsstacksegmentstackdb200dup(0)stackendscodesegmentassumeds:data,cs:code,ss:stackstart:movax,datamo

9、vds,axmovcl,2movbx,0multiplycl,a,bbx;宏调用宏调用movdx,bbxadddl,30hmovah,2int21hmovah,4chint21hcodeendsendstart 宏宏具有宏名的一段汇编语句序列具有宏名的一段汇编语句序列宏定义宏定义时书写时书写宏指令宏指令这段汇编语句序列的缩写这段汇编语句序列的缩写宏调用宏调用时书写时书写宏展开宏展开宏指令处用这段宏代替的过程宏指令处用这段宏代替的过程宏汇编宏汇编时实现时实现宏的参数宏的参数功能强大,颇具特色功能强大,颇具特色思考:思考:在汇编语言程序设计过程中,可以将在汇编语言程序设计过程中,可以将具有一具有一

10、定功能定功能,需,需多次重复使用多次重复使用,且,且比较短比较短的程序的程序段定义成一条宏指令。段定义成一条宏指令。使用宏指令语句可以减少程序书写错误,缩使用宏指令语句可以减少程序书写错误,缩短源程序长度,使源程序编写像高级语言一短源程序长度,使源程序编写像高级语言一样清晰、简洁。特别是使用宏库后,可以提样清晰、简洁。特别是使用宏库后,可以提高编程效率。高编程效率。在什么情况下使用宏?为什么要使用宏?在什么情况下使用宏?为什么要使用宏?比较比较仅是仅是源程序级源程序级的的简化简化:宏调用在宏调用在汇编时汇编时进行程进行程序语句的展开,不需要序语句的展开,不需要返回;不减小目标程序,返回;不减小

11、目标程序,执行执行速度速度没有改变没有改变通过形参、实参结合实通过形参、实参结合实现参数传递,简捷直观、现参数传递,简捷直观、灵活多变灵活多变还是还是目标程序级目标程序级的的简化简化:子程序调用在子程序调用在执行时执行时由由CALLCALL指令转向、指令转向、RETRET指令返回;形成的指令返回;形成的目目标代码较短标代码较短,执行,执行速速度减慢度减慢需要利用寄存器、存储需要利用寄存器、存储单元或堆栈等传递参单元或堆栈等传递参数数宏宏子程序子程序比较比较结论结论宏宏子程序子程序相同点:简化源程序的设计和结构相同点:简化源程序的设计和结构不同点:不同点:对目标程序的长度影响不同。对目标程序的长

12、度影响不同。对目标程序执行速度的影响不同。对目标程序执行速度的影响不同。传递参数的方式不同;传递参数过程中如出现错误,错误传递参数的方式不同;传递参数过程中如出现错误,错误的性质不同。(宏:语法;子程序:逻辑)的性质不同。(宏:语法;子程序:逻辑)宏与子程序具有各自的特点,程序员应该根据具体问题选择宏与子程序具有各自的特点,程序员应该根据具体问题选择使用那种方法使用那种方法通常,当程序段较短或要求较快执行时,应选用宏;当程序通常,当程序段较短或要求较快执行时,应选用宏;当程序段较长或为减小目标代码时,要选用子程序段较长或为减小目标代码时,要选用子程序4、宏调用中的参数(宏运算)、宏调用中的参数

13、(宏运算)宏的参数形式灵活多变,可以是常数、变量、存储单元、指令宏的参数形式灵活多变,可以是常数、变量、存储单元、指令操作码或它们的一部分,也可以是表达式,使用灵活多变的参操作码或它们的一部分,也可以是表达式,使用灵活多变的参数,同一个宏定义甚至可以执行不同的操作。数,同一个宏定义甚至可以执行不同的操作。几个宏操作符的使用几个宏操作符的使用%:表达式操作符:将其后面跟的表达式的值作为实参,表达式操作符:将其后面跟的表达式的值作为实参,而不是将表达式本身作为参数,用在而不是将表达式本身作为参数,用在实参实参中。中。:替换操作符:用于将参数与其他字符分开。用在:替换操作符:用于将参数与其他字符分开

14、。用在宏宏体体中。如果参数紧跟在其他字符之前或之后,中。如果参数紧跟在其他字符之前或之后,或者参或者参数出现在数出现在带引号的字符串带引号的字符串中,就必须使用该伪操作符。中,就必须使用该伪操作符。表达符操作表达符操作%示例。示例。DAMACROA,B,C,DDWA,B,CDBDDUP(0)ENDM如果宏调用为:如果宏调用为:X=10Y=20DA%X+2,5,%X+Y,%Y-5DAX+2,5,X+Y,Y-5则相应的宏展开为:则相应的宏展开为:DW 12,5,30DB 15DUP(0)DW X+2,5,X+YDB Y-5DUP(0)表达符操作表达符操作%示例示例dat1macroa,b,c,dd

15、wa,b,cdbddup(0)endmdatasegmentx=10y=20dat1%x+2,5,%x+y,%y-5dat1x+2,5,x+y,y-5dataendscodesegmentassumeds:data,cs:codestart:movax,datamovds,axmovah,4chint21hcode endsendstart表达符操作表达符操作%示例示例表达符操作示例。表达符操作示例。DAMACROSSDBExam:&ss,0ah,0dh,$ENDM如果宏调用为:如果宏调用为:DAbook则相应的宏展开为:则相应的宏展开为:1DBExam:book,0ah,0dh,$演示演示P

16、152例例二、重复汇编二、重复汇编在编写源程序时,有时会出现连续相同或相似的在编写源程序时,有时会出现连续相同或相似的语句(组)语句(组)。当出现这种情况时,可利用当出现这种情况时,可利用重复汇编伪指令重复汇编伪指令来重复语句(组),来重复语句(组),从而达到从而达到简化程序简化程序的目的。的目的。重复汇编伪指令所定义的重复块是重复汇编伪指令所定义的重复块是宏的一种特殊形式:宏的一种特殊形式:(1)由伪指令)由伪指令ENDM来结束重复块;来结束重复块;(2)重复块)重复块可带有参数可带有参数,并在汇编过程中参数被实参代替,并在汇编过程中参数被实参代替,重复块重复块不会被命名不会被命名,不能在程

17、序的其它地方引用;,不能在程序的其它地方引用;(3)重复汇编伪指令与宏指令的)重复汇编伪指令与宏指令的不同之处不同之处在于不必预先进行在于不必预先进行定义定义,常在常在宏体内宏体内使用,但也可以在宏体外使用;使用,但也可以在宏体外使用;(4)重复汇编没有名字,不能被调用。)重复汇编没有名字,不能被调用。重复汇编重复汇编伪指令伪指令有有3条(条(REPT、IRP、IRPC),),3条伪指令区条伪指令区别在于如何规定别在于如何规定重复次数重复次数。、按参数值重复伪指令、按参数值重复伪指令REPTREPT数值表达式数值表达式;重复次数重复次数重复的语句组重复的语句组ENDM例例1:定义:定义100个

18、初值为个初值为32的字节单元,该存储单元的起始的字节单元,该存储单元的起始符号地址为符号地址为Table。方法方法1:用伪指令:用伪指令REPT来实现来实现TableLABELbyterept100db32endm 汇编结果为:汇编结果为:TableLABELbytedb32db32上述字节定义重复上述字节定义重复100次次方法方法2:用:用DUP来实现:来实现:TableDB100DUP(32)本例用伪指令本例用伪指令REPT重复定重复定义的存储单元可以用重复义的存储单元可以用重复操作符操作符DUP来代替,但前来代替,但前者的功能更灵活、更强大。者的功能更灵活、更强大。重复次数确定重复次数确

19、定格式:格式:【例【例2】将将AZ这这26个字母数据填入数组个字母数据填入数组CHAR中。中。CHARLABELBYTECHR=AREPT26 DBCHRCHR=CHR+1 ENDM汇编后产生:汇编后产生:1DB 41H1 DB 42H1DB 5AH2 2 例例3:计算计算1+2+100,并把其值存入寄存器,并把其值存入寄存器AX。方法方法1:用伪指令:用伪指令REPT来实现来实现xorAX,axCOUNT=1REPT100ADcAX,COUNTCOUNT=COUNT+1ENDM汇编结果与下面程序段相一致:汇编结果与下面程序段相一致:xorAX,0ADcAX,1ADcAX,2ADcAX,100

20、比较比较:右边语句的执行能完成所指定的功能,但是用:右边语句的执行能完成所指定的功能,但是用100条条加法指令来直接计算,这无疑会大大增加目标代码的长度。加法指令来直接计算,这无疑会大大增加目标代码的长度。方法方法2:用循环指令:用循环指令LOOP来实现来实现xorax,axmovcx,100again:adcax,cxloopagain方法与方法的比较,不难方法与方法的比较,不难看出:伪指令看出:伪指令REPT与循环指令与循环指令起作用的时期和方式是截然不起作用的时期和方式是截然不同的。它们之间的主要差异如同的。它们之间的主要差异如下表所列下表所列 操作演示操作演示伪指令伪指令REPT循循环

21、环指令指令LOOP起作用的时期起作用的时期汇编程序把源文件汇编程序把源文件翻译成目标文件时翻译成目标文件时期期程序的执行时期程序的执行时期起作用的方式起作用的方式把被重复的指令把被重复的指令(组组)直接重复写入目直接重复写入目标文件标文件通过反复执行同一通过反复执行同一指令指令(组组)来实现重来实现重复复重复次数对目标文重复次数对目标文件的影响件的影响由于重复次数决定由于重复次数决定着被重复指令着被重复指令(组组)写入目标文件的次写入目标文件的次数,所以,改变重数,所以,改变重复次数一定会改变复次数一定会改变目标文件的字节数目标文件的字节数由于重复的指令数由于重复的指令数与重复次数无关,与重复

22、次数无关,所以,改变重复次所以,改变重复次数不会改变目标文数不会改变目标文件的字节数件的字节数伪指令伪指令REPT与循环指令与循环指令LOOP之间的主要差异之间的主要差异、伪指令、伪指令IRP重复次数不确定重复次数不确定格式:格式:IRP 形参,;重复的语句 ENDM其其中中,实实参参数数必必须须写写在在尖尖括括号号内内,可可以以有有多多个个,参参数数之之间间用用逗逗号号分分隔隔开开。重重复复时时,第第一一次次重重复复将将用用第第一一个个实实参参数数替替换换语语句句块块中中的的形形参参所所在在位位置置,第第二二次次重重复复用用第第二二个个实实参参数数,依依此此类类推推。如如果果没没有有实实参参

23、数数,那么这个块只处理一次,并且被一个空参数所替换。那么这个块只处理一次,并且被一个空参数所替换。例例5:把把8个个16位通用寄存器之值相加,并把结果存入寄存器位通用寄存器之值相加,并把结果存入寄存器AX中。中。解答:由于解答:由于16位通用寄存器名是一些不同的符号,不能用计数位通用寄存器名是一些不同的符号,不能用计数的方法来依次访问它们,所以,我们需要用伪指令的方法来依次访问它们,所以,我们需要用伪指令IRP来实现。来实现。IRPREG,ADDAX,REGENDM【例【例4】产生将产生将AX、BX、CX和和DX压压入堆栈的指令。入堆栈的指令。TABELLABELNEARIRPREG,PUSH

24、REGENDM扩展后为扩展后为TABELLABELNEARPUSHAXPUSHBXPUSHCXPUSHDX条条件件汇汇编编允允许许用用户户在在编编制制汇汇编编语语言言程程序序时时根根据据某某些些条条件件是是否否成成立立(为为真真)来来决决定定是是否否汇汇编编某某一一段段语语句句。条条件件汇汇编编指指令令提提供供有有10个个,分分为为互互补补的的对对,分分别别用用来来测测试试表表达达式式扫扫描描遍遍数数、符符号号定定义义、参参数数和和两两个个字字符符串串是是否否相相同同等等。条条件件汇汇编编伪指令的一般格式是:伪指令的一般格式是:IF表达式或参数表达式或参数语句语句1;成立时汇编这一段语句成立时

25、汇编这一段语句ELSE语语句句2 ;条条件件不不成成立立时时汇汇编编这这一一段段语语句句(称称为为反反 条件语句块)条件语句块)ENDIF;条件汇编结束命令;条件汇编结束命令三、条三、条件件汇汇编编其其中中,条条件件伪伪指指令令IF中中的的”可可以以是是1、2、E、DEF、NDEF、B、NB、IDN和和DIF等等,用用来来规规定定条条件件,表表达达式式或或参参数数指指明明被被测测试试的的条条件件表表达达式式或或参参数数。当当被被测测试试的的表表达达式式或或参参数数符符合合条条件件(成成立立)时时,IF和和ELSE之之间间的的条条件件语语句句块块才才被被汇汇编编。ELSE是是一一个个可可选选择择

26、的的子子句句,它它表表示示条条件件为为假假时时,ELSE和和ENDIF之之间间的的反条件语句块才被汇编。反条件语句块才被汇编。伪指令含义IF exp若数值表达式exp的值不为0,则语句组1包含在目标文件中IFE exp若数值表达式exp的值为0,则语句组1包含在目标文件中IFDEF label若标号label有定义或被说明为EXTRN,则语句组1包含在目标文件中IFNDEF label若标号label没有定义,也没被说明为EXTRN,则语句组1包含在目标文件中IFB 在宏引用时,若该形参没有相应的实参相对应,则语句组1包含在目标文件中IFNB 在宏引用时,若该形参没有相应的实参相对应,则语句组

27、1包含在目标文件中IFIDN,若参数1参数2,则语句组1包含在目标文件中IFDIF,若参数1参数2,则语句组1包含在目标文件中IF1若汇编程序在第一遍扫描时,则语句组1包含在目标文件中IF2若汇编程序在第二遍扫描时,则语句组1包含在目标文件中1.IF和和IFE格式:格式:IF表达式表达式IFE表达式表达式IF表表示示如如果果表表达达式式的的值值不不为为零零()则则为为真真,而而IFE表示当表达式的值为零时则为真。表示当表达式的值为零时则为真。注注意意:表表达达式式只只能能有有一一个个,表表达达式式中中的的项项不不能能是是变量且不能提前引用。变量且不能提前引用。条条件件汇汇编编语语句句是是不不会

28、会生生成成目目标标代代码码的的。因因此此IF语语句句除除在在汇汇编编时时选选择择条条件件块块语语句句或或反反条条件件块块语语句句外外,不不影影响响标标志志寄寄存存器器的的状状态态。此此外外,IF语语句句中中的的LT表表示示小小于于的的关关系系运运算算符符,当当关关系系成成立立时时为为真真,否否则则为为假假。类类似似地地也也可可使使用用关关系系符符EQ、NE、LE、GT和和GE等。等。例例7:定义一个元素个数不超过:定义一个元素个数不超过100个的数组。个的数组。PDATAMACRONUMIFNUMLT100DBNUMDUP(?)(?)ELSEDB100DUP(?)(?)ENDIFENDM使用条

29、件汇编伪指令的主要目的:使用条件汇编伪指令的主要目的:同一个源程序能根据不同的汇编条件生成不同同一个源程序能根据不同的汇编条件生成不同功能的目标程序,增强宏定义的使用范围。功能的目标程序,增强宏定义的使用范围。条件汇编伪指令与高级语言条件汇编伪指令与高级语言(如:如:C/C+)的条的条件编译语句在书写形式上相似,在所起作用方件编译语句在书写形式上相似,在所起作用方面是完全一致的。面是完全一致的。作业作业定义定义100个初值分别为个初值分别为1,2,100的字节单元,该存储单元的的字节单元,该存储单元的起始符号地址为起始符号地址为Table。作业作业定义定义100个初值分别为个初值分别为1,2,100的字节单元,该存储单元的的字节单元,该存储单元的起始符号地址为起始符号地址为Table。TableLABELbyte汇编结果相当于:汇编结果相当于:COUNT=1TableLABELTYPEREPT100DB1DBCOUNTDB2COUNT=COUNT1ENDMDB100上面定义了上面定义了100个字节,其初值为个字节,其初值为1,2,100。本例好象不能。本例好象不能用重复操作符用重复操作符DUP来说明字节存储单元。来说明字节存储单元。

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

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com