收藏 分销(赏)

四川大学计算机学院-汇编语言ch9.ppt

上传人:精**** 文档编号:10297690 上传时间:2025-05-19 格式:PPT 页数:43 大小:390.54KB
下载 相关 举报
四川大学计算机学院-汇编语言ch9.ppt_第1页
第1页 / 共43页
四川大学计算机学院-汇编语言ch9.ppt_第2页
第2页 / 共43页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,第九章 高级宏汇编语言,学习目的:通过这一章的学习,掌握结构、记录等复杂数据类型的定义和使用方法;,掌握汇编语言中“宏”的概念,能够在程序设计中正确使用宏指令;,掌握条件汇编和重复汇编的概念,并且能够在程序设计中正确使用。,宏指令,在程序设计中,遇到功能独立、又经常使用的功能模块,可以选择做成子程序的形式,也可以选择做成宏指令的形式。,宏指令的概念和子程序有相似之处,但是也有较大的差别。,宏指令的使用必须经过三个过程:宏定义、宏调用、宏展开。,(1)宏定义,格式1(不带入口参数的宏定义),宏指令名称MACRO,;指令和伪指令序列,称为宏体,ENDM,格式2(带入口参数的宏定义),宏指令名称MACRO形参1,形参2,,;宏体,ENDM,宏定义的意义:把一组具有独立功能的一段程序组织为一个功能模块,使用一个宏指令名称来代表这段程序。在定义之后,引用这个宏指令名称,就相当于引用这段程序。,宏定义的特征:,宏定义允许嵌套,在一个宏定义中可以引用另一个宏。,如果宏定义是带参数的,那么在引用该宏指令时必须给出相应的实参。,例子:P202,注意,宏定义是由程序员在源程序中完成的。,(2)宏调用,在宏指令定义之后,就可以在源程序中调用已定义的宏指令,调用格式很简单,直接给出宏指令名称就行,如果该宏定义时是带形参的,那么调用时一定按照定义时的顺序给出各个实参。,格式:,宏指令名称,宏指令名称实参1,实参2,,例子:P203,宏调用这个过程也是由程序员在源程序中实现的。,例如:,宏定义:,TESTMACROOP,AD&OPAX,BX,ENDM,宏调用:,TESTD,TESTC,宏展开:,ADDAX,BX,ADCAX,BX,如果这里不使用&操作符,这种类型实参调用就无法实现。,(2)文本操作符,如果实参由比较复杂的字符串组成,包含逗号、空格等分隔字符,那么就需要使用文本操作符把它括起来,避免汇编程序把一个复杂的实参解释为多个实参。一般在宏调用时使用。,例如:,宏定义:,STRINGMACROSTR,DB&STR&,ENDM,注意,不能写成 STR,如果这样写,它将被解释为普通的字符串,不会被解释为对STR形参的 引用。,宏调用:,STRING,宏展开:,DBHello,World!,如果宏调用时不使用文本操作符,实参会被解释成两个,而不是一个。,关于&操作符和操作符的使用,还可以参见教材P205,(3)表达式操作符%,%操作符把后面的文本解释为表达式,它的功能是取表达式的最终的值。使用这个操作符可以把表达式的值作为实参引用,而不是引用表达式文本本身。一般在宏调用时使用。,例如:,宏定义:,TESTMACRO NUM,PROMPT&NUMDBWARNING&NUM&,ENDM,宏调用:,CONT=0,TEST%CONT,TEST%CONT+1,宏展开:,PROMPT0DBWARNING0,PROMPT1DBWARNING1,如果不使用%操作符,那么宏展开后:,PROMTCONTDBWARNINGCONT,PROMTCONT+1DBWARNINGCONT+1,(4)字符操作符!,用于把紧跟其后的宏操作符解释为普通字符。,例如:,宏定义:,STRINGMACROSTR,PROMPTDB&STR&,ENDM,宏调用:,STRING1:,宏展开:,PROMPTDBINPUT NUMBER1:,如果大于符号前面不使用!操作符,那么它将被解释为文本操作符的后半部分。,9.2.3 局部符号伪指令,先看一个例子:,宏定义:,ERRORMACRO,CMPAX,BX,JAL1,MOVAX,0,JMPL2,L1:MOVAX,0FFH,L2:LABELNEAR,ENDM,这个宏体中使用了标号,那么在多次进行宏调用以后,会出现重复定义的标号L1和L2,从而导致语法错误。,对于这种情况,一种解决方法是把标号设置为形参,在宏调用时指定实际的标号,这种方法比较麻烦。因为用户本身没有通过实参指定标号的需求。,另一种方法是把标号作为局部符号,在宏展开时所有局部符号都会自动取和上一次展开不同的值。,宏展开时局部符号的自动生成格式为:?XXXX。其中XXXX是四位整数组成的字符串。,例子:P206,9.2.4 宏库的制作,宏库就是把多个常用的宏指令定义在一个以.LIB为后缀名的文件中。这个文件就称为宏库文件。,在源程序中使用INCLUDE伪指令装入指定的宏库文件以后,就可以在源程序中调用宏库中定义的宏指令。多使用已有的宏指令,可以提高编程效率。,INCLUDE伪指令的格式:,INCLUDE库文件名,一般在源程序最开始使用。例子:P207,9.2.5 宏指令和子程序的区别与联系,子程序的特征:,1)子程序编制完成后,通过在主程序中使用CALL指令来调用,不需要重复编制。,2)子程序的调用、返回、执行现场的保护与恢复、参数的传递都是在程序执行过程中完成的,需要花费一定的CPU时间,调用次数越多,累积花费时间越多。,3)子程序占用的空间大小很明确,就是子程序本身所占用的空间,没有更多的额外空间被占用。,宏指令特征:,1)宏指令定义完毕以后,在源程序中使用宏指令名称对其进行调用,不需要重新编制。,2)宏指令的展开过程是由汇编程序在汇编过程中自动完成的,在程序执行过程中没有调用、返回、参数传递等等过程,程序执行时,花费CPU时间相对较少。,3)宏指令所占用的空间由调用次数决定,调用一次就要重新把对应代码展开一次,如果宏指令对应的代码片段比较长,调用次数又比较多,那么将耗费大量的内存空间。,相对而言,子程序在程序执行阶段会花费较多的CPU时间,但是它会很节约内存空间。,宏指令在程序执行阶段花费较少的CPU时间,因为它相对子程序省去了一些过程,但是它可能很花费内存空间。,二者有一个共同点:不需要重复编制对应功能模块的代码。,仔细分析:,子程序的弱点在于程序执行阶段花费CPU时间较多,主要有这几个过程需要额外的花费CPU时间:子程序调用、子程序返回、现场保护、参数传递过程。,前面两个过程几乎是每个子程序共有的特征,不能改变;第三个特征也是必须的,不可能有太大的变动。,第四个过程在不同的子程序之间可能差别较大,实际上花费时间最多的也是这个过程。,既然如此,考虑把参数传递较少的功能模块组织为子程序的形式是合适的。,子程序的优点在于节约空间,调用时不会再分配空间,那么子程序越长,优势越大。,综合上面的分析:参数较少,代码较长的功能模块适合于组织成子程序的形式。,宏指令的优点在于程序执行阶段没有调用、返回、参数传递的过程,不需要花费额外的CPU时间。,缺点在于每次调用都要重新分配代码空间。,综合分析的结果:参数较多,且代码较短的功能模块适合组织为宏指令的形式。,上面的判断标准都是相对的标准,不是绝对的,具体程序设计时应当如何取舍,由程序员根据实际情况决定。,9.3 重复汇编,重复汇编是指在汇编过程中,对指定的语句序列进行反复的汇编。,注意,这里的重复是指汇编过程中的重复操作,不是指程序执行阶段所用到的循环结构。,重复汇编是通过重复汇编伪指令来实现的。,(1)定重复汇编伪指令REPT/ENDM,格式:,REPT表达式,;语句序列,ENDM,功能:重复汇编REPT和ENDM之间的语句序列,表达式的值决定了重复汇编的次数。,例子:见教材P209 例9.3.1 和 例9.3.2,例:,使用无条件跳转指令实现跳转表,原来的方法在P107,现在使用重复汇编来实现。,JMPTABLEMACRONUM,JMPBRAN&NUM,ENDM,NUMBER=0,REPT10,JMPTABLENUMBER,NUMBER=NUMBER+1,ENDM,(2)不定重复汇编伪指令IRP/ENDM,格式:,IRP形参,,;语句序列,ENDM,把IRP和ENDM之间的语句重复汇编,每一次重复都取一个新的实参取代语句中的形参,重复汇编的次数由实参个数决定。,例子:P210,(3)不定字符重复汇编IRPC/ENDM,格式:,IRPC形参,字符串,;语句序列,ENDM,不定字符重复汇编和前面讲到的不定重复汇编很相似,所不同的是它可以结合&操作符使用。,例子:P210,9.4 条件汇编,条件汇编是指有选择的对程序片段进行汇编,条件满足时才对程序片段进行汇编,否则不汇编。,这里所说的条件是汇编过程中所使用的条件判断,不是程序执行阶段所使用的分支结构。,条件汇编是通过条件汇编伪指令实现的。,条件汇编格式1:,IFXX表达式,;语句序列1,ELSE,;语句序列2,ENDIF,其中XX表示某种判断类型,表达式是具体需要判断的对象。,如果条件成立,则对语句序列1进行汇编,否则,汇编语句序列2。,条件汇编格式2:,IFXX表达式,;语句序列,ENDIF,如果条件成立,对其中的语句序列进行汇编,否则不汇编。,IFXX中的XX为具体的判断类型,可以参见教材P212 表9-1。,条件汇编和重复汇编可以在源程序中直接使用,也可以在宏定义中使用。,例子:P211 例9.4.1 和 P212 例9.4.2,9.5 汇编过程,这里简要说明一下汇编程序解释源程序的大致过程。,和人阅读文章的过程相似,汇编程序要完全理解一个源程序,需要阅读源程序三次,也就是说,对源程序实行三次扫描,最后才能生成正确的目标代码。,(1)第一次扫描,汇编程序第一次扫描源程序主要完成的工作是建立若干线性表,对进一步解释源程序作准备。,所建立的线性表主要有如下这些:,1)段表,每个表项的字段组成如下:,段名,段基值,段类型,源程序中所有关于定义段的信息都统计在这个表格中。,2)变量表,每个表项的字段组成如下:,变量名,所在段名,偏移量,类型,数组长度,初始值。,源程序中所有关于定义变量的信息都统计在这个表中。,3)标号表,每个表项的字段组成:,标号名,所在段名,偏移量、类型,源程序中所有关于定义标号的信息都统计在这个表中。,4)不可重定义替换表,每个表项的字段组成:,替换文本,原始文本,源程序中所有用EQU伪指令定义的常量都统计在这个表中。,5)可重定义替换表,每个表项字段组成如下:,替换文本,原始文本,所有用“=”定义的常量都统计在这个表格中,由于可以重新定义,在以后的源程序扫描中,这个表可能被修改。,注意,除了这个表在后面的扫描过程中可以修改以外,其他的表在第一次扫描以后就确定下来,以后的扫描过程只能进行查表的操作,不能再修改这些表。,第一次扫描过程实际上是在统计源程序中所有用户定义的标识符,并且分类别给它们建立线性表,为后面的扫描过程做准备。,所有有关符号定义的语法错误都是在第一次扫描中被发现的。,(2)第二次扫描,汇编程序进行第二次扫描所要完成的工作是常量替换,计算表达式。,1)常量替换,查找第一次扫描中建立的不可重复替换表、可重复替换表,把常量标识符替换为它对应的原始文本(现在还不会解释文本的具体含义);同时根据“=”提供的重新定义,可能会修改可重复替换表中的相关内容。,2)计算表达式,在替换常量的同时,汇编程序会识别源程序中的所有表达式,计算它们的最终运算结果,并用运算结果替换原来的表达式文本。,如果在表达式中出现变量名称或者段名称,那么这个过程可能需要查找由第一次扫描生成的变量表和段表。,第二次扫描主要完成常量和表达式的替换,需要查找第一次扫描建立的表格。,(3)第三次扫描,汇编程序第三次扫描扫描源程序要完成如下工作:按照段表中的定义,生成数据段、堆栈段、代码段;把变量引用替换为相应的位移量;确定指令的寻址方式;计算转移指令中使用的位移量;生成指令的机器代码。,这个过程中会反复的、经常的查找第一次扫描建立的段表、变量表、标号表。,所有变量、标号引用错误都是在这个阶段发现的。,汇编过程经过三次源程序扫描以后完成,最后生成OBJ文件。,在连接过程中,OBJ文件中的段信息会被加入到EXE文件的PSP(程序段前缀)中保存。,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服