版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第九章高级宏汇编语言学习目的:通过这一章的学习,掌握结构、记录等复杂数据类型的定义和使用方法;掌握汇编语言中“宏”的概念,能够在程序设计中正确使用宏指令;掌握条件汇编和重复汇编的概念,并且能够在程序设计中正确使用。宏指令在程序设计中,遇到功能独立、又经常使用的功能模块,可以选择做成子程序的形式,也可以选择做成宏指令的形式。宏指令的概念和子程序有相似之处,但是也有较大的差别。宏指令的使用必须经过三个过程:宏定义、宏调用、宏展开。(1)宏定义格式1(不带入口参数的宏定义)宏指令名称 MACRO …… ;指令和伪指令序列,称为宏体 ENDM宏定义的特征:宏定义允许嵌套,在一个宏定义中可以引用另一个宏。如果宏定义是带参数的,那么在引用该宏指令时必须给出相应的实参。例子:P202注意,宏定义是由程序员在源程序中完成的。(2)宏调用在宏指令定义之后,就可以在源程序中调用已定义的宏指令,调用格式很简单,直接给出宏指令名称就行,如果该宏定义时是带形参的,那么调用时一定按照定义时的顺序给出各个实参。格式:宏指令名称宏指令名称 实参1,实参2,……例子:P203宏调用这个过程也是由程序员在源程序中实现的。(3)宏展开在汇编过程中,源程序中的宏指令会被替换为它所代表的程序片段,使用的形参会被替换为调用时指定的实参。宏展开这一个过程是由汇编程序完成的,宏展开的具体情况可以参见教材P203。9.2.2宏操作符宏操作符主要用于宏展开时对实参的灵活解释。(1)连接操作符&用于把实参和其他字符串连接成一个整体,进而表达新的含义,一般在宏定义时使用。(2)文本操作符<>如果实参由比较复杂的字符串组成,包含逗号、空格等分隔字符,那么就需要使用文本操作符把它括起来,避免汇编程序把一个复杂的实参解释为多个实参。一般在宏调用时使用。例如:宏定义:STRING MACRO STR DB ‘&STR&’ ENDM注意,不能写成’STR’,如果这样写,它将被解释为普通的字符串,不会被解释为对STR形参的引用。(3)表达式操作符%%操作符把后面的文本解释为表达式,它的功能是取表达式的最终的值。使用这个操作符可以把表达式的值作为实参引用,而不是引用表达式文本本身。一般在宏调用时使用。例如:宏定义:TEST MACRO NUMPROMPT&NUM DB ’WARNING&NUM&’ ENDM(4)字符操作符!用于把紧跟其后的宏操作符解释为普通字符。例如:宏定义:STRING MACRO STR PROMPT DB ‘&STR&’ ENDM宏调用:STRING <INPUTNUMBER!>1:>宏展开:PROMPT DB ‘INPUTNUMBER>1:’如果大于符号前面不使用!操作符,那么它将被解释为文本操作符<>的后半部分。9.2.3局部符号伪指令先看一个例子:宏定义:ERROR MACRO CMP AX,BX JA L1 MOV AX,0 JMP L2 L1: MOV AX,0FFH L2: LABEL NEAR ENDM这个宏体中使用了标号,那么在多次进行宏调用以后,会出现重复定义的标号L1和L2,从而导致语法错误。对于这种情况,一种解决方法是把标号设置为形参,在宏调用时指定实际的标号,这种方法比较麻烦。因为用户本身没有通过实参指定标号的需求。另一种方法是把标号作为局部符号,在宏展开时所有局部符号都会自动取和上一次展开不同的值。宏展开时局部符号的自动生成格式为:??XXXX。其中XXXX是四位整数组成的字符串。例子:P2069.2.4宏库的制作宏库就是把多个常用的宏指令定义在一个以.LIB为后缀名的文件中。这个文件就称为宏库文件。在源程序中使用INCLUDE伪指令装入指定的宏库文件以后,就可以在源程序中调用宏库中定义的宏指令。多使用已有的宏指令,可以提高编程效率。INCLUDE伪指令的格式:INCLUDE 库文件名一般在源程序最开始使用。例子:P207宏指令特征:1)宏指令定义完毕以后,在源程序中使用宏指令名称对其进行调用,不需要重新编制。2)宏指令的展开过程是由汇编程序在汇编过程中自动完成的,在程序执行过程中没有调用、返回、参数传递等等过程,程序执行时,花费CPU时间相对较少。3)宏指令所占用的空间由调用次数决定,调用一次就要重新把对应代码展开一次,如果宏指令对应的代码片段比较长,调用次数又比较多,那么将耗费大量的内存空间。相对而言,子程序在程序执行阶段会花费较多的CPU时间,但是它会很节约内存空间。宏指令在程序执行阶段花费较少的CPU时间,因为它相对子程序省去了一些过程,但是它可能很花费内存空间。二者有一个共同点:不需要重复编制对应功能模块的代码。子程序的优点在于节约空间,调用时不会再分配空间,那么子程序越长,优势越大。综合上面的分析:参数较少,代码较长的功能模块适合于组织成子程序的形式。宏指令的优点在于程序执行阶段没有调用、返回、参数传递的过程,不需要花费额外的CPU时间。缺点在于每次调用都要重新分配代码空间。综合分析的结果:参数较多,且代码较短的功能模块适合组织为宏指令的形式。上面的判断标准都是相对的标准,不是绝对的,具体程序设计时应当如何取舍,由程序员根据实际情况决定。(1)定重复汇编伪指令REPT/ENDM格式:REPT 表达式…… ;语句序列ENDM功能:重复汇编REPT和ENDM之间的语句序列,表达式的值决定了重复汇编的次数。例子:见教材P209例9.3.1和例9.3.2例:使用无条件跳转指令实现跳转表,原来的方法在P107,现在使用重复汇编来实现。JMPTABLE MACRO NUM JMP BRAN&NUM ENDMNUMBER=0REPT 10JMPTABLE NUMBERNUMBER=NUMBER+1ENDM (2)不定重复汇编伪指令IRP/ENDM格式:IRP 形参,<实参1,实参2,…>…… ;语句序列ENDM把IRP和ENDM之间的语句重复汇编,每一次重复都取一个新的实参取代语句中的形参,重复汇编的次数由实参个数决定。9.4条件汇编条件汇编是指有选择的对程序片段进行汇编,条件满足时才对程序片段进行汇编,否则不汇编。这里所说的条件是汇编过程中所使用的条件判断,不是程序执行阶段所使用的分支结构。条件汇编是通过条件汇编伪指令实现的。条件汇编格式1:IFXX 表达式…… ;语句序列1ELSE…… ;语句序列2ENDIF其中XX表示某种判断类型,表达式是具体需要判断的对象。如果条件成立,则对语句序列1进行汇编,否则,汇编语句序列2。条件汇编格式2:IFXX 表达式…… ;语句序列ENDIF如果条件成立,对其中的语句序列进行汇编,否则不汇编。IFXX中的XX为具体的判断类型,可以参见教材P212表9-1。条件汇编和重复汇编可以在源程序中直接使用,也可以在宏定义中使用。例子:P211例9.4.1和P212例9.4.29.5汇编过程这里简要说明一下汇编程序解释源程序的大致过程。和人阅读文章的过程相似,汇编程序要完全理解一个源程序,需要阅读源程序三次,也就是说,对源程序实行三次扫描,最后才能生成正确的目标代码。(1)第一次扫描汇编程序第一次扫描源程序主要完成的工作是建立若干线性表,对进一步解释源程序作准备。所建立的线性表主要有如下这些:1)段表每个表项的字段组成如下:段名,段基值,段类型源程序中所有关于定义段的信息都统计在这个表格中。2)变量表每个表项的字段组成如下:变量名,所在段名,偏移量,类型,数组长度,初始值。源程序中所有关于定义变量的信息都统计在这个表中。3)标号表每个表项的字段组成:标号名,所在段名,偏移量、类型源程序中所有关于定义标号的信息都统计在这个表中。4)不可重定义替换表每个表项的字段组成:替换文本,原始文本源程序中所有用EQU伪指令定义的常量都统计在这个表中。5)可重定义替换表每个表项字段组成如下:替换文本,原始文本所有用“=”定义的常量都统计在这个表格中,由于可以重新定义,在以后的源程序扫描中,这个表可能被修改。注意,除了这个表在后面的扫描过程中可以修改以外,其他的表在第一次扫描以后就确定下来,以后的扫描过程只能进行查表的操作,不能再修改这些表。第一次扫描过程实际上是在统计源程序中所有用户定义的标识符,并且分类别给它们建立线性表,为后面的扫描过程做准备。所有有关符号定义的语法错误都是在第一次扫描中被发现的。(2)第二次扫描汇编程序进行第二次扫描所要完成的工作是常量替换,计算表达式。1)常量替换查找第一次扫描中建立的不可重复替换表、可重复替换表,把常量标识符替换为它对应的原始文本(现在还不会解释文本的具体含义);同时根据“=”提供的重新定义,可能会修改可重复替换表中的相关内容。2)计算表达式在替换常量的同时,汇编程序会识别源程序中的所有表达式,计算它们的最终运算结果,并用运算结果替换原来的表达式文本。如果在表达式中出现变量名称或者段名称,那么这个过程可能需要查找由第一次扫描生成的变量表和段表。第二次扫描主要完成常量和表达式的替换,需要查找第一次扫描建立的表格。(3)第三次扫描汇编程序第三次扫描扫描源
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论