您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 宏汇编 汇编语言第5章
第5章结构化程序设计教学要求:•理解宏汇编的概念和作用。•掌握宏汇编的编程技术。教学要求:•理解宏汇编的概念和作用。•掌握宏汇编的编程技术。教学要求:•理解宏汇编的概念和作用。•掌握宏汇编的编程技术。教学要求:•理解宏汇编的概念和作用。•掌握宏汇编的编程技术。教学要求:•理解宏汇编的概念和作用。•掌握宏汇编的编程技术。5.1子程序的概念5.2子程序的定义、调用和返回**5.3子程序的现场保护与参数传递**5.4子程序设计*5.5子程序的嵌套与递归调用5.6宏汇编程序设计教学基本内容什么是宏?宏是源程序中一段有独立功能的程序代码。它只需在源程序中定义一次就可以多次调用它,调用时,只需要用一个宏指令语句就可以了宏(Macro)是汇编语言的一个特点,它是与子程序类似又独具特色的另一种简化源程序的方法5.6宏结构程序设计宏汇编重复汇编条件汇编宏结构一、宏汇编内容宏定义宏调用宏展开1、宏定义宏名macro[形参表]┇;宏指令体(宏体)endm(1)宏名(宏指令名):给出该宏定义的名称(第一个符号必须是字母)。(2)macro/endm系统提供的定义宏的伪指令。(3)形参表:给出宏定义中所用到的形式参数,参数可以没有,或带有一个或是多个,当是多个参数时,每个形参之间需用逗号隔开。具体参数可以是常数、变量、指令或它们的一部分,也可以是表达式。(4)宏指令体:一组有独立功能的汇编程序代码。其中可以包括指令、伪指令及宏指令等。1、宏定义(续)fillsegmacroDsegname;带有形参Dsegnamemovax,Dsegname;宏定义中使用参数movds,axendm;宏定义结束举例:思考:此处的形参Dsegname是什么?Dsegname是数据段的段名2、宏调用宏名[实参表];调用时,只需使用宏指令名来调用该宏定义例如:对上面的宏定义的调用形式为:┆FILLSEGDATA;DATA为数据段的段名┆说明:(1)汇编时,汇编程序对每个宏调用作宏展开–––用宏定义体取代源程序中的宏指令名,用实参代替宏定义中的形参。取代时,实参和形参是一一对应的。若实参个数形参个数,则多余实参不考虑,若实参个数形参个数,则多余形参作“空”处理。(2)取代后,所得到的语句应该是有效的,否则汇编程序将会指示出错。(3)每调用一次就把宏定义体展开一次,因而它占有的存储空间与调用次数有关。3、宏展开宏调用的实质是在汇编过程中进行宏展开宏展开的具体过程是:当汇编程序扫描源程序遇到已有定义的宏调用时,即用相应的宏定义体取代源程序的宏指令,同时用位置匹配的实参对形参进行取代。1MOVAX,DATA1MOVDS,AX例如:上面的宏调用,其展开形式为:宏汇编应用举例例5-9datasegmentbuf1db0dh,0ah,'whatareyourname?$'buf2db0dh,0ah,'mynameisliyang!$'dataendscodesegmentassumeds:data,cs:codestart:movax,datamovds,axdispmacromleadx,mmovah,9int21hendmdispbuf1dispbuf2movah,4chint21hcodeendsendstart宏汇编应用举例例5-17P148multiplymacroopr1,opr2,result;定义宏pushdxpushaxmoval,opr1imulopr2movresult,axpopaxpopdxendmdatasegmentadb3bdw?dataendsstacksegmentstackdb200dup(0)stackendscodesegmentassumeds:data,cs:code,ss:stackstart:movax,datamovds,axmovcl,2movbx,0multiplycl,a,b[bx];宏调用movdx,b[bx]adddl,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则相应的宏展开为:1DW12,5,301DB15DUP(0)1DWX+2,5,X+Y1DBY-5DUP(0)表达符操作%示例dat1macroa,b,c,ddwa,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,4chint21hcodeendsendstart表达符操作%示例表达符操作&示例。DAMACROSSDB‘Exam:&ss’,0ah,0dh,’$’ENDM如果宏调用为:DAbook则相应的宏展开为:1DB‘Exam:book’,0ah,0dh,’$’演示P152例5-20二、重复汇编在编写源程序时,有时会出现连续相同或相似的语句(组)。当出现这种情况时,可利用重复汇编伪指令来重复语句(组),从而达到简化程序的目的。重复汇编伪指令所定义的重复块是宏的一种特殊形式:(1)由伪指令ENDM来结束重复块;(2)重复块可带有参数,并在汇编过程中参数被实参代替,重复块不会被命名,不能在程序的其它地方引用;(3)重复汇编伪指令与宏指令的不同之处在于不必预先进行定义,常在宏体内使用,但也可以在宏体外使用;(4)重复汇编没有名字,不能被调用。重复汇编伪指令有3条(REPT、IRP、IRPC),3条伪指令区别在于如何规定重复次数。1、按参数值重复伪指令-REPTREPT数值表达式;重复次数重复的语句组ENDM例1:定义100个初值为32的字节单元,该存储单元的起始符号地址为Table。方法1:用伪指令REPT来实现TableLABELbyterept100db32endm汇编结果为:TableLABELbytedb32┆db32上述字节定义重复100次方法2:用DUP来实现:TableDB100DUP(32)本例用伪指令REPT重复定义的存储单元可以用重复操作符DUP来代替,但前者的功能更灵活、更强大。重复次数确定格式:【例2】将A~Z这26个字母数据填入数组CHAR中。CHARLABELBYTECHR='A'REPT26DBCHRCHR=CHR+1ENDM汇编后产生:1DB41H1DB42H1DB5AH2┆例3:计算1+2+…+100,并把其值存入寄存器AX。方法1:用伪指令REPT来实现…xorAX,axCOUNT=1REPT100ADcAX,COUNTCOUNT=COUNT+1ENDM…汇编结果与下面程序段相一致:xorAX,0ADcAX,1ADcAX,2…ADcAX,100…比较:右边语句的执行能完成所指定的功能,但是用100条加法指令来直接计算,这无疑会大大增加目标代码的长度。方法2:用循环指令LOOP来实现…xorax,axmovcx,100again:adcax,cxloopagain…方法1与方法2的比较,不难看出:伪指令REPT与循环指令起作用的时期和方式是截然不同的。它们之间的主要差异如下表所列操作演示伪指令REPT循环指令LOOP起作用的时期汇编程序把源文件翻译成目标文件时期程序的执行时期起作用的方式把被重复的指令(组)直接重复写入目标文件通过反复执行同一指令(组)来实现重复重复次数对目标文件的影响由于重复次数决定着被重复指令(组)写入目标文件的次数,所以,改变重复次数一定会改变目标文件的字节数由于重复的指令数与重复次数无关,所以,改变重复次数不会改变目标文件的字节数伪指令REPT与循环指令LOOP之间的主要差异2、伪指令IRP重复次数不确定格式:IRP形参,实参[,…];重复的语句ENDM其中,①实参数必须写在尖括号内,可以有多个,参数之间用逗号分隔开。②重复时,第一次重复将用第一个实参数替换语句块中的形参所在位置,第二次重复用第二个实参数,依此类推。如果没有实参数,那么这个块只处理一次,并且被一个空参数所替换。例5:把8个16位通用寄存器之值相加,并把结果存入寄存器AX中。解答:由于16位通用寄存器名是一些不同的符号,不能用计数的方法来依次访问它们,所以,我们需要用伪指令IRP来实现。IRPREG,BX,CX,DX,SP,BP,SI,DIADDAX,REGENDM【例4】产生将AX、BX、CX和DX压入堆栈的指令。TABELLABELNEARIRPREG,AX,BX,CX,DXPUSHREGENDM扩展后为TABELLABELNEAR1PUSHAX1PUSHBX1PUSHCX1PUSHDX条件汇编允许用户在编制汇编语言程序时根据某些条件是否成立(为真)来决定是否汇编某一段语句。条件汇编指令提供有10个,分为互补的5对,分别用来测试表达式扫描遍数、符号定义、参数和两个字符串是否相同等。条件汇编伪指令的一般格式是:IF××表达式或参数语句1;成立时汇编这一段语句[ELSE语句2];条件不成立时汇编这一段语句(称为反条件语句块)ENDIF;条件汇编结束命令三、条件汇编其中,条件伪指令IF中的”××”可以是1、2、E、DEF、NDEF、B、NB、IDN和DIF等,用来规定条件,表达式或参数指明被测试的条件表达式或参数。当被测试的表达式或参数符合条件(成立)时,IF××和ELSE之间的条件语句块才被汇编。ELSE是一个可选择的子句,它表示条件为假时,ELSE和ENDIF之间的反条件语句块才被汇编。伪指令含义IFexp若数值表达式exp的值不为0,则语句组1包含在目标文件中IFEexp若数值表达式exp的值为0,则语句组1包含在目标文件中IFDEFlabel若标号label有定义或被说明为EXTRN,则语句组1包含在目标文件中IFNDEFlabel若标号label没有定义,也没被说明为EXTRN,则语句组1包含在目标文件中IFB参数在宏引用时,若该形参没有相
本文标题:宏汇编 汇编语言第5章
链接地址:https://www.777doc.com/doc-3455528 .html