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

上传人:tian****1990 文档编号:3375435 上传时间:2019-12-12 格式:PPT 页数:34 大小:358.81KB
返回 下载 相关 举报
宏汇编汇编语言第5章.ppt_第1页
第1页 / 共34页
宏汇编汇编语言第5章.ppt_第2页
第2页 / 共34页
宏汇编汇编语言第5章.ppt_第3页
第3页 / 共34页
点击查看更多>>
资源描述
第章结构化程序设计,教学要求:理解宏汇编的概念和作用。掌握宏汇编的编程技术。,教学要求:理解宏汇编的概念和作用。掌握宏汇编的编程技术。,教学要求:理解宏汇编的概念和作用。掌握宏汇编的编程技术。,教学要求:理解宏汇编的概念和作用。掌握宏汇编的编程技术。,教学要求:理解宏汇编的概念和作用。掌握宏汇编的编程技术。,5.1子程序的概念5.2子程序的定义、调用和返回*5.3子程序的现场保护与参数传递*5.4子程序设计*5.5子程序的嵌套与递归调用5.6宏汇编程序设计,教学基本内容,什么是宏?,宏是源程序中一段有独立功能的程序代码。它只需在源程序中定义一次就可以多次调用它,调用时,只需要用一个宏指令语句就可以了宏(Macro)是汇编语言的一个特点,它是与子程序类似又独具特色的另一种简化源程序的方法,5.6宏结构程序设计,宏汇编重复汇编条件汇编,宏结构,一、宏汇编,内容宏定义宏调用宏展开,、宏定义,宏名macro形参表;宏指令体(宏体)endm,()宏名(宏指令名):给出该宏定义的名称(第一个符号必须是字母)。()macro/endm系统提供的定义宏的伪指令。()形参表:给出宏定义中所用到的形式参数,参数可以没有,或带有一个或是多个,当是多个参数时,每个形参之间需用逗号隔开。具体参数可以是常数、变量、指令或它们的一部分,也可以是表达式。()宏指令体:一组有独立功能的汇编程序代码。其中可以包括指令、伪指令及宏指令等。,1、宏定义(续),fillsegmacroDsegname;带有形参Dsegnamemovax,Dsegname;宏定义中使用参数movds,axendm;宏定义结束,举例:,思考:此处的形参Dsegname是什么?,Dsegname是数据段的段名,2、宏调用,宏名实参表;调用时,只需使用宏指令名来调用该宏定义,例如:对上面的宏定义的调用形式为:FILLSEGDATA;DATA为数据段的段名说明:()汇编时,汇编程序对每个宏调用作宏展开用宏定义体取代源程序中的宏指令名,用实参代替宏定义中的形参。取代时,实参和形参是一一对应的。若实参个数形参个数,则多余实参不考虑,若实参个数形参个数,则多余形参作“空”处理。()取代后,所得到的语句应该是有效的,否则汇编程序将会指示出错。()每调用一次就把宏定义体展开一次,因而它占有的存储空间与调用次数有关。,、宏展开,宏调用的实质是在汇编过程中进行宏展开宏展开的具体过程是:当汇编程序扫描源程序遇到已有定义的宏调用时,即用相应的宏定义体取代源程序的宏指令,同时用位置匹配的实参对形参进行取代。,1MOVAX,DATA1MOVDS,AX,例如:上面的宏调用,其展开形式为:,宏汇编应用举例例,datasegmentbuf1db0dh,0ah,whatareyourname?$buf2db0dh,0ah,mynameisliyang!$dataendscodesegmentassumeds:data,cs:codestart:movax,datamovds,ax,dispmacromleadx,mmovah,9int21hendmdispbuf1dispbuf2movah,4chint21hcodeendsendstart,宏汇编应用举例例17P148,multiplymacroopr1,opr2,result;定义宏pushdxpushaxmoval,opr1imulopr2movresult,axpopaxpopdxendmdatasegmentadb3bdw?dataendsstacksegmentstackdb200dup(0)stackends,codesegmentassumeds:data,cs:code,ss:stackstart:movax,datamovds,axmovcl,2movbx,0multiplycl,a,bbx;宏调用movdx,bbxadddl,30hmovah,2int21hmovah,4chint21hcodeendsendstart,宏具有宏名的一段汇编语句序列宏定义时书写宏指令这段汇编语句序列的缩写宏调用时书写宏展开宏指令处用这段宏代替的过程宏汇编时实现宏的参数功能强大,颇具特色,思考:,在汇编语言程序设计过程中,可以将具有一定功能,需多次重复使用,且比较短的程序段定义成一条宏指令。使用宏指令语句可以减少程序书写错误,缩短源程序长度,使源程序编写像高级语言一样清晰、简洁。特别是使用宏库后,可以提高编程效率。,在什么情况下使用宏?为什么要使用宏?,比较,仅是源程序级的简化:宏调用在汇编时进行程序语句的展开,不需要返回;不减小目标程序,执行速度没有改变通过形参、实参结合实现参数传递,简捷直观、灵活多变,还是目标程序级的简化:子程序调用在执行时由CALL指令转向、RET指令返回;形成的目标代码较短,执行速度减慢需要利用寄存器、存储单元或堆栈等传递参数,宏,子程序,比较结论,宏,子程序,相同点:简化源程序的设计和结构不同点:对目标程序的长度影响不同。对目标程序执行速度的影响不同。传递参数的方式不同;传递参数过程中如出现错误,错误的性质不同。(宏:语法;子程序:逻辑)宏与子程序具有各自的特点,程序员应该根据具体问题选择使用那种方法通常,当程序段较短或要求较快执行时,应选用宏;当程序段较长或为减小目标代码时,要选用子程序,4、宏调用中的参数(宏运算),宏的参数形式灵活多变,可以是常数、变量、存储单元、指令操作码或它们的一部分,也可以是表达式,使用灵活多变的参数,同一个宏定义甚至可以执行不同的操作。几个宏操作符的使用%:表达式操作符:将其后面跟的表达式的值作为实参,而不是将表达式本身作为参数,用在实参中。:替换操作符:用于将参数与其他字符分开。用在宏体中。如果参数紧跟在其他字符之前或之后,或者参数出现在带引号的字符串中,就必须使用该伪操作符。,表达符操作%示例。DAMACROA,B,C,DDWA,B,CDBDDUP(0)ENDM如果宏调用为:X=10Y=20DA%X+2,5,%X+Y,%Y-5DAX+2,5,X+Y,Y-5,则相应的宏展开为:DW12,5,30DB15DUP(0)DWX+2,5,X+YDBY-5DUP(0),表达符操作%示例,dat1macroa,b,c,ddwa,b,cdbddup(0)endmdatasegmentx=10y=20dat1%x+2,5,%x+y,%y-5dat1x+2,5,x+y,y-5dataends,codesegmentassumeds:data,cs:codestart:movax,datamovds,axmovah,4chint21hcodeendsendstart,表达符操作%示例,表达符操作示例。DAMACROSSDBExam:重复次数重复的语句组ENDM,例1:定义100个初值为32的字节单元,该存储单元的起始符号地址为Table。,方法1:用伪指令REPT来实现TableLABELbyterept100db32endm,汇编结果为:TableLABELbytedb32db32,上述字节定义重复100次,方法2:用DUP来实现:TableDB100DUP(32),本例用伪指令REPT重复定义的存储单元可以用重复操作符DUP来代替,但前者的功能更灵活、更强大。,重复次数确定,格式:,【例2】将AZ这26个字母数据填入数组CHAR中。CHARLABELBYTECHR=AREPT26DBCHRCHR=CHR+1ENDM,汇编后产生:1DB41H1DB42HDB5AH,例3:计算1+2+100,并把其值存入寄存器AX。,方法1:用伪指令REPT来实现xorAX,axCOUNT=1REPT100ADcAX,COUNTCOUNT=COUNT+1ENDM,汇编结果与下面程序段相一致:xorAX,0ADcAX,1ADcAX,2ADcAX,100,比较:右边语句的执行能完成所指定的功能,但是用100条加法指令来直接计算,这无疑会大大增加目标代码的长度。,方法2:用循环指令LOOP来实现xorax,axmovcx,100again:adcax,cxloopagain,方法与方法的比较,不难看出:伪指令REPT与循环指令起作用的时期和方式是截然不同的。它们之间的主要差异如下表所列,操作演示,伪指令REPT与循环指令LOOP之间的主要差异,、伪指令IRP,重复次数不确定,格式:,IRP形参,;重复的语句ENDM,其中,实参数必须写在尖括号内,可以有多个,参数之间用逗号分隔开。重复时,第一次重复将用第一个实参数替换语句块中的形参所在位置,第二次重复用第二个实参数,依此类推。如果没有实参数,那么这个块只处理一次,并且被一个空参数所替换。,例5:把8个16位通用寄存器之值相加,并把结果存入寄存器AX中。解答:由于16位通用寄存器名是一些不同的符号,不能用计数的方法来依次访问它们,所以,我们需要用伪指令IRP来实现。,IRPREG,ADDAX,REGENDM,【例4】产生将AX、BX、CX和DX压入堆栈的指令。TABELLABELNEARIRPREG,PUSHREGENDM,扩展后为TABELLABELNEARPUSHAXPUSHBXPUSHCXPUSHDX,条件汇编允许用户在编制汇编语言程序时根据某些条件是否成立(为真)来决定是否汇编某一段语句。条件汇编指令提供有10个,分为互补的对,分别用来测试表达式扫描遍数、符号定义、参数和两个字符串是否相同等。条件汇编伪指令的一般格式是:IF表达式或参数语句1;成立时汇编这一段语句ELSE语句2;条件不成立时汇编这一段语句(称为反条件语句块)ENDIF;条件汇编结束命令,三、条件汇编,其中,条件伪指令IF中的”可以是1、2、E、DEF、NDEF、B、NB、IDN和DIF等,用来规定条件,表达式或参数指明被测试的条件表达式或参数。当被测试的表达式或参数符合条件(成立)时,IF和ELSE之间的条件语句块才被汇编。ELSE是一个可选择的子句,它表示条件为假时,ELSE和ENDIF之间的反条件语句块才被汇编。,1.IF和IFE格式:IF表达式IFE表达式IF表示如果表达式的值不为零()则为真,而IFE表示当表达式的值为零时则为真。注意:表达式只能有一个,表达式中的项不能是变量且不能提前引用。,条件汇编语句是不会生成目标代码的。因此IF语句除在汇编时选择条件块语句或反条件块语句外,不影响标志寄存器的状态。此外,IF语句中的LT表示小于的关系运算符,当关系成立时为真,否则为假。类似地也可使用关系符EQ、NE、LE、GT和GE等。,例7:定义一个元素个数不超过100个的数组。PDATAMACRONUMIFNUMLT100DBNUMDUP(?)ELSEDB100DUP(?)ENDIFENDM,使用条件汇编伪指令的主要目的:同一个源程序能根据不同的汇编条件生成不同功能的目标程序,增强宏定义的使用范围。条件汇编伪指令与高级语言(如:C/C+)的条件编译语句在书写形式上相似,在所起作用方面是完全一致的。,作业,定义100个初值分别为1,2,100的字节单元,该存储单元的起始符号地址为Table。,作业,定义100个初值分别为1,2,100的字节单元,该存储单元的起始符号地址为Table。TableLABELbyte汇编结果相当于:COUNT=1TableLABELTYPEREPT100DB1DBCOUNTDB2COUNT=COUNT1ENDMDB100上面定义了100个字节,其初值为1,2,100。本例好象不能用重复操作符DUP来说明字节存储单元。,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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