《宏汇编汇编语言第5章.ppt》由会员分享,可在线阅读,更多相关《宏汇编汇编语言第5章.ppt(34页珍藏版)》请在三一办公上搜索。
1、第章结构化程序设计,教学要求:理解宏汇编的概念和作用。掌握宏汇编的编程技术。,教学要求:理解宏汇编的概念和作用。掌握宏汇编的编程技术。,教学要求:理解宏汇编的概念和作用。掌握宏汇编的编程技术。,教学要求:理解宏汇编的概念和作用。掌握宏汇编的编程技术。,教学要求:理解宏汇编的概念和作用。掌握宏汇编的编程技术。,5.1 子程序的概念5.2 子程序的定义、调用和返回*5.3 子程序的现场保护与参数传递*5.4 子程序设计*5.5 子程序的嵌套与递归调用5.6 宏汇编程序设计,教学基本内容,什么是宏?,宏是源程序中一段有独立功能的程序代码。它只需在源程序中定义一次就可以多次调用它,调用时,只需要用一个
2、宏指令语句就可以了宏(Macro)是汇编语言的一个特点,它是与子程序类似又独具特色的另一种简化源程序的方法,5.6 宏结构程序设计,宏汇编重复汇编条件汇编,宏结构,一、宏汇编,内容宏定义宏调用宏展开,、宏定义,宏名macro 形参表;宏指令体(宏体)endm,()宏名(宏指令名):给出该宏定义的名称(第一个符号必须是字母)。()macro/endm 系统提供的定义宏的伪指令。()形参表:给出宏定义中所用到的形式参数,参数可以没有,或带有一个或是多个,当是多个参数时,每个形参之间需用逗号隔开。具体参数可以是常数、变量、指令或它们的一部分,也可以是表达式。()宏指令体:一组有独立功能的汇编程序代码
3、。其中可以包括指令、伪指令及宏指令等。,1、宏定义(续),fillsegmacro Dsegname;带有形参Dsegnamemov ax,Dsegname;宏定义中使用参数mov ds,axendm;宏定义结束,举例:,思考:此处的形参Dsegname是什么?,Dsegname是数据段的段名,2、宏调用,宏名实参表;调用时,只需使用宏指令名来调用该宏定义,例如:对上面的宏定义的调用形式为:FILLSEG DATA;DATA为数据段的段名说明:()汇编时,汇编程序对每个宏调用作宏展开 用宏定义体取代源程序中的宏指令名,用实参代替宏定义中的形参。取代时,实参和形参是一一对应的。若实参个数形参个数
4、,则多余实参不考虑,若实参个数 形参个数,则多余形参作“空”处理。()取代后,所得到的语句应该是有效的,否则汇编程序将会指示出错。()每调用一次就把宏定义体展开一次,因而它占有的存储空间与调用次数有关。,、宏展开,宏调用的实质是在汇编过程中进行宏展开 宏展开的具体过程是:当汇编程序扫描源程序遇到已有定义的宏调用时,即用相应的宏定义体取代源程序的宏指令,同时用位置匹配的实参对形参进行取代。,1 MOVAX,DATA1 MOVDS,AX,例如:上面的宏调用,其展开形式为:,宏汇编应用举例例,data segmentbuf1 db 0dh,0ah,what are your name?$buf2 d
5、b 0dh,0ah,my name is liyang!$data endscode segment assume ds:data,cs:codestart:mov ax,data mov ds,ax,disp macro m lea dx,m mov ah,9 int 21h endm disp buf1 disp buf2 mov ah,4ch int 21hcode ends end start,宏汇编应用举例例17 P148,multiply macro opr1,opr2,result;定义宏 push dx push ax mov al,opr1 imul opr2 mov res
6、ult,ax pop ax pop dx endmdata segmenta db 3b dw?data endsstack segment stack db 200 dup(0)stack ends,code segment assume ds:data,cs:code,ss:stackstart:mov ax,data mov ds,ax mov cl,2 mov bx,0 multiply cl,a,bbx;宏调用 mov dx,bbx add dl,30h mov ah,2 int 21h mov ah,4ch int 21hcode ends end start,宏具有宏名的一段汇编
7、语句序列宏定义时书写宏指令这段汇编语句序列的缩写宏调用时书写宏展开宏指令处用这段宏代替的过程宏汇编时实现宏的参数功能强大,颇具特色,思考:,在汇编语言程序设计过程中,可以将具有一定功能,需多次重复使用,且比较短的程序段定义成一条宏指令。使用宏指令语句可以减少程序书写错误,缩短源程序长度,使源程序编写像高级语言一样清晰、简洁。特别是使用宏库后,可以提高编程效率。,在什么情况下使用宏?为什么要使用宏?,比较,仅是源程序级的简化:宏调用在汇编时进行程序语句的展开,不需要返回;不减小目标程序,执行速度没有改变通过形参、实参结合实现参数传递,简捷直观、灵活多变,还是目标程序级的简化:子程序调用在执行时由
8、CALL指令转向、RET指令返回;形成的目标代码较短,执行速度减慢需要利用寄存器、存储单元或堆栈等传递参数,宏,子程序,比较结论,宏,子程序,相同点:简化源程序的设计和结构不同点:对目标程序的长度影响不同。对目标程序执行速度的影响不同。传递参数的方式不同;传递参数过程中如出现错误,错误的性质不同。(宏:语法;子程序:逻辑)宏与子程序具有各自的特点,程序员应该根据具体问题选择使用那种方法 通常,当程序段较短或要求较快执行时,应选用宏;当程序段较长或为减小目标代码时,要选用子程序,4、宏调用中的参数(宏运算),宏的参数形式灵活多变,可以是常数、变量、存储单元、指令操作码或它们的一部分,也可以是表达
9、式,使用灵活多变的参数,同一个宏定义甚至可以执行不同的操作。几个宏操作符的使用%:表达式操作符:将其后面跟的表达式的值作为实参,而不是将表达式本身作为参数,用在实参中。:替换操作符:用于将参数与其他字符分开。用在宏体中。如果参数紧跟在其他字符之前或之后,或者参数出现在带引号的字符串中,就必须使用该伪操作符。,表达符操作%示例。DA MACRO A,B,C,D DW A,B,C DB D DUP(0)ENDM如果宏调用为:X=10Y=20DA%X+2,5,%X+Y,%Y-5DA X+2,5,X+Y,Y-5,则相应的宏展开为:DW12,5,30DB15 DUP(0)DWX+2,5,X+YDBY-5
10、 DUP(0),表达符操作%示例,dat1macro a,b,c,d dw a,b,cdb d dup(0)endmdata segmentx=10y=20dat1%x+2,5,%x+y,%y-5dat1x+2,5,x+y,y-5data ends,code segment assume ds:data,cs:codestart:mov ax,data mov ds,ax mov ah,4ch int 21hcodeends end start,表达符操作%示例,表达符操作示例。DA MACRO SS DB Exam:&ss,0ah,0dh,$ENDM如果宏调用为:DA book,则相应的宏展
11、开为:1 DB Exam:book,0ah,0dh,$,演示P152 例,二、重复汇编,在编写源程序时,有时会出现连续相同或相似的语句(组)。当出现这种情况时,可利用重复汇编伪指令来重复语句(组),从而达到简化程序的目的。重复汇编伪指令所定义的重复块是宏的一种特殊形式:(1)由伪指令ENDM来结束重复块;(2)重复块可带有参数,并在汇编过程中参数被实参代替,重复块不会被命名,不能在程序的其它地方引用;(3)重复汇编伪指令与宏指令的不同之处在于不必预先进行定义,常在宏体内使用,但也可以在宏体外使用;(4)重复汇编没有名字,不能被调用。重复汇编伪指令有3条(REPT、IRP、IRPC),3条伪指令
12、区别在于如何规定重复次数。,、按参数值重复伪指令 REPT,REPT 数值表达式;重复次数重复的语句组 ENDM,例1:定义100个初值为32的字节单元,该存储单元的起始符号地址为Table。,方法1:用伪指令REPT来实现TableLABELbyte rept 100 db 32 endm,汇编结果为:TableLABELbyte db 32 db 32,上述字节定义重复100次,方法2:用DUP来实现:TableDB100 DUP(32),本例用伪指令REPT重复定义的存储单元可以用重复操作符DUP来代替,但前者的功能更灵活、更强大。,重复次数确定,格式:,【例2】将AZ这26个字母数据填
13、入数组CHAR中。CHAR LABELBYTE CHR=A REPT 26 DB CHR CHR=CHR+1 ENDM,汇编后产生:1 DB 41H 1 DB 42H DB 5AH,例3:计算1+2+100,并把其值存入寄存器AX。,方法1:用伪指令REPT来实现 xorAX,ax COUNT=1 REPT 100 ADcAX,COUNT COUNT=COUNT+1 ENDM,汇编结果与下面程序段相一致:xorAX,0ADcAX,1ADcAX,2 ADcAX,100,比较:右边语句的执行能完成所指定的功能,但是用100条加法指令来直接计算,这无疑会大大增加目标代码的长度。,方法2:用循环指令L
14、OOP来实现 xor ax,ax mov cx,100again:adc ax,cx loop again,方法与方法的比较,不难看出:伪指令REPT与循环指令起作用的时期和方式是截然不同的。它们之间的主要差异如下表所列,操作演示,伪指令REPT与循环指令LOOP之间的主要差异,、伪指令IRP,重复次数不确定,格式:,IRP 形参,;重复的语句 ENDM,其中,实参数必须写在尖括号内,可以有多个,参数之间用逗号分隔开。重复时,第一次重复将用第一个实参数替换语句块中的形参所在位置,第二次重复用第二个实参数,依此类推。如果没有实参数,那么这个块只处理一次,并且被一个空参数所替换。,例5:把8个16
15、位通用寄存器之值相加,并把结果存入寄存器AX中。解答:由于16位通用寄存器名是一些不同的符号,不能用计数的方法来依次访问它们,所以,我们需要用伪指令IRP来实现。,IRP REG,ADD AX,REG ENDM,【例4】产生将AX、BX、CX和DX压 入堆栈的指令。TABEL LABEL NEAR IRP REG,PUSH REG ENDM,扩展后为 TABEL LABEL NEAR PUSH AX PUSH BX PUSH CX PUSH DX,条件汇编允许用户在编制汇编语言程序时根据某些条件是否成立(为真)来决定是否汇编某一段语句。条件汇编指令提供有10个,分为互补的对,分别用来测试表达式
16、扫描遍数、符号定义、参数和两个字符串是否相同等。条件汇编伪指令的一般格式是:IF 表达式或参数语句1;成立时汇编这一段语句 ELSE 语句2;条件不成立时汇编这一段语句(称为反 条件语句块)ENDIF;条件汇编结束命令,三、条 件 汇 编,其中,条件伪指令IF中的”可以是1、2、E、DEF、NDEF、B、NB、IDN和DIF等,用来规定条件,表达式或参数指明被测试的条件表达式或参数。当被测试的表达式或参数符合条件(成立)时,IF和ELSE之间的条件语句块才被汇编。ELSE是一个可选择的子句,它表示条件为假时,ELSE和ENDIF之间的反条件语句块才被汇编。,1.IF和IFE 格式:IF 表达式
17、 IFE 表达式 IF表示如果表达式的值不为零()则为真,而IFE表示当表达式的值为零时则为真。注意:表达式只能有一个,表达式中的项不能是变量且不能提前引用。,条件汇编语句是不会生成目标代码的。因此IF语句除在汇编时选择条件块语句或反条件块语句外,不影响标志寄存器的状态。此外,IF语句中的LT表示小于的关系运算符,当关系成立时为真,否则为假。类似地也可使用关系符 EQ、NE、LE、GT和GE等。,例7:定义一个元素个数不超过100个的数组。PDATAMACRO NUM IF NUM LT 100 DB NUM DUP(?)ELSE DB 100 DUP(?)ENDIFENDM,使用条件汇编伪指
18、令的主要目的:同一个源程序能根据不同的汇编条件生成不同功能的目标程序,增强宏定义的使用范围。条件汇编伪指令与高级语言(如:C/C+)的条件编译语句在书写形式上相似,在所起作用方面是完全一致的。,作业,定义100个初值分别为1,2,100的字节单元,该存储单元的起始符号地址为Table。,作业,定义100个初值分别为1,2,100的字节单元,该存储单元的起始符号地址为Table。TableLABELbyte 汇编结果相当于:COUNT=1 TableLABELTYPE REPT 100 DB1 DBCOUNT DB2 COUNT=COUNT 1 ENDM DB100 上面定义了100个字节,其初值为1,2,100。本例好象不能用重复操作符DUP来说明字节存储单元。,