收藏 分享(赏)

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

上传人:yjrm16270 文档编号:8107671 上传时间:2019-06-08 格式:PPT 页数:34 大小:163.50KB
下载 相关 举报
宏汇编 汇编语言第5章.ppt_第1页
第1页 / 共34页
宏汇编 汇编语言第5章.ppt_第2页
第2页 / 共34页
宏汇编 汇编语言第5章.ppt_第3页
第3页 / 共34页
宏汇编 汇编语言第5章.ppt_第4页
第4页 / 共34页
宏汇编 汇编语言第5章.ppt_第5页
第5页 / 共34页
点击查看更多>>
资源描述

1、第章 结构化程序设计,教学要求: 理解宏汇编的概念和作用。 掌握宏汇编的编程技术。,教学要求: 理解宏汇编的概念和作用。 掌握宏汇编的编程技术。,教学要求: 理解宏汇编的概念和作用。 掌握宏汇编的编程技术。,教学要求: 理解宏汇编的概念和作用。 掌握宏汇编的编程技术。,教学要求: 理解宏汇编的概念和作用。 掌握宏汇编的编程技术。,5.1 子程序的概念 5.2 子程序的定义、调用和返回 * 5.3 子程序的现场保护与参数传递* 5.4 子程序设计 * 5.5 子程序的嵌套与递归调用 5.6 宏汇编程序设计,教学基本内容,什么是宏?,宏是源程序中一段有独立功能的程序代码。它只需在源程序中定义一次就

2、可以多次调用它,调用时,只需要用一个宏指令语句就可以了 宏(Macro)是汇编语言的一个特点,它是与子程序类似又独具特色的另一种简化源程序的方法,5.6 宏结构程序设计,宏汇编 重复汇编 条件汇编,宏结构,一、宏汇编,内容 宏定义 宏调用 宏展开,、宏定义,宏名 macro 形参表 ;宏指令体(宏体) endm,()宏名(宏指令名) :给出该宏定义的名称(第一个符号必须是字母) 。 ()macro/ endm 系统提供的定义宏的伪指令。 ()形参表 :给出宏定义中所用到的形式参数,参数可以没 有,或带有一个或是多个,当是多个参数时,每个形参之间需用逗号隔开。具体参数可以是常数、变量、指令或它们

3、的一部分,也可以是表达式。 ()宏指令体 :一组有独立功能的汇编程序代码。其中可以包括指令、伪指令及宏指令等。,1、宏定义(续),fillseg macro Dsegname ;带有形参Dsegnamemov ax, Dsegname ;宏定义中使用参数mov ds,axendm ;宏定义结束,举例:,思考: 此处的形参Dsegname是什么?,Dsegname是数据段的段名,2、宏调用,宏名 实参表 ;调用时,只需使用宏指令名来调用该宏定义,例如:对上面的宏定义的调用形式为: FILLSEG DATA ; DATA为数据段的段名 说明:()汇编时,汇编程序对每个宏调用作宏展开 用宏定义体取代

4、源程序中的宏指令名,用实参代替宏定义中的形参。取代时,实参和形参是一一对应的。 若实参个数形参个数,则多余实参不考虑 , 若实参个数 形参个数,则多余形参作“空” 处理。()取代后,所得到的语句应该是有效的,否则汇编程序将会指示出错。 ()每调用一次就把宏定义体展开一次,因而它占有的存储空间与调用次数有关。,、宏展开,宏调用的实质是在汇编过程中进行宏展开宏展开的具体过程是:当汇编程序扫描源程序遇到已有定义的宏调用时,即用相应的宏定义体取代源程序的宏指令,同时用位置匹配的实参对形参进行取代。,1 MOV AX,DATA 1 MOV DS,AX,例如:上面的宏调用,其展开形式为:,宏汇编应用举例

5、例,data segment buf1 db 0dh,0ah,what are your name?$ buf2 db 0dh,0ah,my name is liyang!$ data endscode segmentassume ds:data,cs:code start: mov ax,datamov ds,ax,disp macro mlea dx,mmov ah,9int 21hendmdisp buf1disp buf2mov ah,4chint 21h code endsend start,宏汇编应用举例 例17 P148,multiply macro opr1,opr2,resu

6、lt ; 定义宏push dxpush axmov al,opr1imul opr2mov result,axpop axpop dxendm data segment a db 3 b dw ? data ends stack segment stackdb 200 dup(0) stack ends,code segmentassume ds:data,cs:code,ss:stack start: mov ax,datamov ds,axmov cl,2mov bx,0multiply cl,a,bbx ; 宏调用mov dx,bbxadd dl,30hmov ah,2int 21hmo

7、v ah,4chint 21h code endsend start,宏具有宏名的一段汇编语句序列 宏定义时书写 宏指令这段汇编语句序列的缩写 宏调用时书写 宏展开宏指令处用这段宏代替的过程 宏汇编时实现 宏的参数功能强大,颇具特色,思考:,在汇编语言程序设计过程中,可以将具有一定功能,需多次重复使用,且比较短的程序段定义成一条宏指令。使用宏指令语句可以减少程序书写错误,缩短源程序长度,使源程序编写像高级语言一样清晰、简洁。特别是使用宏库后,可以提高编程效率。,在什么情况下使用宏?为什么要使用宏?,比较,仅是源程序级的简化:宏调用在汇编时进行程序语句的展开,不需要返回;不减小目标程序,执行速度

8、没有改变通过形参、实参结合实现参数传递,简捷直观、灵活多变,还是目标程序级的简化:子程序调用在执行时由CALL指令转向、RET指令返回;形成的目标代码较短,执行速度减慢需要利用寄存器、存储单元或堆栈等传递参数,宏,子程序,比较 结论,宏,子程序,相同点:简化源程序的设计和结构不同点: 对目标程序的长度影响不同。 对目标程序执行速度的影响不同。 传递参数的方式不同;传递参数过程中如出现错误,错误的性质不同。(宏:语法;子程序:逻辑)宏与子程序具有各自的特点,程序员应该根据具体问题选择使用那种方法通常,当程序段较短或要求较快执行时,应选用宏;当程序段较长或为减小目标代码时,要选用子程序,4、宏调用

9、中的参数(宏运算),宏的参数形式灵活多变,可以是常数、变量、存储单元、指令操作码或它们的一部分,也可以是表达式,使用灵活多变的参数,同一个宏定义甚至可以执行不同的操作。 几个宏操作符的使用%:表达式操作符:将其后面跟的表达式的值作为实参,而不是将表达式本身作为参数,用在实参中。 :替换操作符:用于将参数与其他字符分开。用在宏体中。如果参数紧跟在其他字符之前或之后, 或者参数出现在带引号的字符串中,就必须使用该伪操作符。,表达符操作%示例。 DA MACRO A, B, C, D DW A, B, CDB D DUP(0)ENDM 如果宏调用为: X=10 Y=20 DA %X+2, 5,%X+

10、Y, %Y-5 DA X+2, 5, X+Y, Y-5,则相应的宏展开为: DW 12, 5, 30 DB 15 DUP(0) DW X+2, 5, X+Y DB Y-5 DUP (0),表达符操作%示例,dat1 macro a,b,c,d dw a,b,cdb d dup(0)endm data segment x=10 y=20 dat1 %x+2, 5,%x+y, %y-5 dat1 x+2, 5, x+y, y-5 data ends,code segmentassume ds:data,cs:code start: mov ax,datamov ds,axmov ah,4chint

11、 21h code endsend start,表达符操作%示例,表达符操作示例。 DA MACRO SSDB Exam:&ss,0ah,0dh,$ENDM 如果宏调用为: DA book,则相应的宏展开为: 1 DB Exam:book,0ah,0dh,$,演示P152 例,二、重复汇编,在编写源程序时,有时会出现连续相同或相似的语句(组)。当出现这种情况时,可利用重复汇编伪指令来重复语句(组),从而达到简化程序的目的。 重复汇编伪指令所定义的重复块是宏的一种特殊形式: (1)由伪指令ENDM来结束重复块; (2)重复块可带有参数,并在汇编过程中参数被实参代替,重复块不会被命名,不能在程序的

12、其它地方引用; (3)重复汇编伪指令与宏指令的不同之处在于不必预先进行定义,常在宏体内使用,但也可以在宏体外使用; (4)重复汇编没有名字,不能被调用。重复汇编伪指令有3条(REPT、IRP、IRPC),3条伪指令区别在于如何规定重复次数。,、按参数值重复伪指令 REPT,REPT 数值表达式 ;重复次数重复的语句组ENDM,例1:定义100个初值为32的字节单元,该存储单元的起始符号地址为Table。,方法1:用伪指令REPT来实现 Table LABEL byterept 100db 32endm,汇编结果为: Table LABEL bytedb 32db 32,上述字节定义重复100次

13、,方法2:用DUP来实现: Table DB 100 DUP(32),本例用伪指令REPT重复定义的存储单元可以用重复操作符DUP来代替,但前者的功能更灵活、更强大。,重复次数确定,格式:,【例2】 将AZ这26个字母数据填入数组CHAR中。CHAR LABEL BYTECHR=AREPT 26DB CHRCHR=CHR+1ENDM,汇编后产生: 1 DB 41H 1 DB 42H DB 5AH ,例3:计算1+2+ +100,并把其值存入寄存器AX 。,方法1:用伪指令REPT来实现xor AX, axCOUNT = 1REPT 100ADc AX, COUNTCOUNT = COUNT+1

14、ENDM,汇编结果与下面程序段相一致:xor AX, 0 ADc AX, 1 ADc AX, 2 ADc AX, 100 ,比较:右边语句的执行能完成所指定的功能,但是用100条加法指令来直接计算,这无疑会大大增加目标代码的长度。,方法2:用循环指令LOOP来实现xor ax,axmov cx, 100 again: adc ax, cxloop again,方法与方法的比较,不难看出:伪指令REPT与循环指令起作用的时期和方式是截然不同的。它们之间的主要差异如下表所列,操作演示,伪指令REPT与循环指令LOOP之间的主要差异,、伪指令IRP,重复次数不确定,格式:,IRP 形参,;重复的语句

15、ENDM,其中, 实参数必须写在尖括号内,可以有多个,参数之间用逗号分隔开。 重复时,第一次重复将用第一个实参数替换语句块中的形参所在位置,第二次重复用第二个实参数,依此类推。如果没有实参数,那么这个块只处理一次,并且被一个空参数所替换。,例5: 把8个16位通用寄存器之值相加,并把结果存入寄存器AX中。 解答:由于16位通用寄存器名是一些不同的符号,不能用计数的方法来依次访问它们,所以,我们需要用伪指令IRP来实现。,IRP REG, ADD AX, REGENDM,【例4】 产生将AX、BX、CX和DX压 入堆栈的指令。TABEL LABEL NEARIRP REG, PUSH REGEN

16、DM,扩展后为TABEL LABEL NEAR PUSH AX PUSH BX PUSH CX PUSH DX,条件汇编允许用户在编制汇编语言程序时根据某些条件是否成立(为真)来决定是否汇编某一段语句。条件汇编指令提供有10个,分为互补的对,分别用来测试表达式扫描遍数、符号定义、参数和两个字符串是否相同等。条件汇编伪指令的一般格式是:IF 表达式或参数语句1 ;成立时汇编这一段语句ELSE语句2 ;条件不成立时汇编这一段语句(称为反 条件语句块)ENDIF ;条件汇编结束命令,三、条 件 汇 编,其中,条件伪指令IF中的”可以是1、2、E、DEF、NDEF、B、NB、IDN和DIF等,用来规定

17、条件,表达式或参数指明被测试的条件表达式或参数。当被测试的表达式或参数符合条件(成立)时,IF和ELSE之间的条件语句块才被汇编。ELSE是一个可选择的子句,它表示条件为假时,ELSE和ENDIF之间的反条件语句块才被汇编。,1. IF和IFE 格式: IF 表达式IFE 表达式IF表示如果表达式的值不为零()则为真,而IFE表示当表达式的值为零时则为真。注意:表达式只能有一个,表达式中的项不能是变量且不能提前引用。,条件汇编语句是不会生成目标代码的。因此IF语句除在汇编时选择条件块语句或反条件块语句外,不影响标志寄存器的状态。此外,IF语句中的LT表示小于的关系运算符,当关系成立时为真,否则

18、为假。类似地也可使用关系符 EQ、NE、LE、GT和GE等。,例7:定义一个元素个数不超过100个的数组。PDATA MACRO NUMIF NUM LT 100DB NUM DUP(?)ELSEDB 100 DUP(?)ENDIFENDM,使用条件汇编伪指令的主要目的: 同一个源程序能根据不同的汇编条件生成不同功能的目标程序,增强宏定义的使用范围。条件汇编伪指令与高级语言(如:C/C +)的条件编译语句在书写形式上相似,在所起作用方面是完全一致的。,作业,定义100个初值分别为1,2,100的字节单元,该存储单元的起始符号地址为Table。,作业,定义100个初值分别为1,2,100的字节单元,该存储单元的起始符号地址为Table。 Table LABEL byte 汇编结果相当于: COUNT = 1 Table LABEL TYPE REPT 100 DB 1 DB COUNT DB 2 COUNT = COUNT 1 ENDM DB 100 上面定义了100个字节,其初值为1,2,100。本例好象不能用重复操作符DUP来说明字节存储单元。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报