大工13春《汇编语言序设计》辅导资料十三
大工13春《汇编语言序设计》辅导资料十三主 题:第七章宏汇编(第1-2节)
学习时间:2013年6月24日-2013年6月30日
内 容:
第七章第1-2节 概述
上一章我们已经学习了子程序结构并了解了其优点,可以节省存储空间和程序设计耗费的时间,而且模块化设计也给程序调试及修改带来了便利;但是子程序本身反复调用需要增加程序的执行时间,这是程序设计时子程序无法避免的问题。这周我们学习高级汇编语言技术,宏汇编,在子程序较短或者需要传递的参数较多的情况下使用宏汇编会带来便利。
第1节宏汇编
1)宏的概念:在其他高级语言中也有宏的概念,但是只是简单的应用,在汇编语言中,宏是源程序中的一段有独立功能的程序代码,只需要在源程序中定义一次就可以多次调用。
2)宏定义:宏定义有一组伪操作来实现,标准格式是:
MACRONAME MACRO
…
ENDM
说明:MACRO NAME是宏指令名,调用时就可以使用宏指令名来调用宏定义,MACRO和ENDM一对伪操作中间就是宏定义体,是一组有独立功能的程序代码,DUMMY PARAMETER LIST称为哑元表,给出宏定义中所用到的形式参数,每个虚参数之间用逗号隔开。
3)宏调用:经宏定义定义后的指令就可以在源程序中调用,这种对宏指令的调用称为宏调用,其标准格式是:
MARCO NAME
说明:(ACTUAL PARAMETAR LIST)是实元表,实元之间也用逗号隔开。另外需要注意的是,宏定义必须出现在宏调用之前。
4)宏展开:当源程序被汇编时,汇编程序将对每个宏调用作宏展开。宏展开就是用宏定义体取代源程序中的宏指令名,并且用实元取代宏定义中的哑元,对应关系是一一对应。实元个数与哑元个数可以不相等,多余的实元或哑元个数按可以作不予处理或空处理。
5)下面是一个具体的宏调用:
MULTIPLAY MACRO OPR1 OPR2 RESULT
PUSH DX
PUSH AX
MOV AX,OPR1
IMUL OPR2 宏定义
MOV RESULT,AX
…
ENDM
…..
MULTIPLY CX,VAR,XYZ 宏调用
…
PUSH DX
PUSH AX
MOV AX,CX 宏展开
IMUL VAR
MOV XYZ,AX
…
可以看出,宏调用就是对宏定义按参数表作替换,这实际上就相当于子程序的参数传递过程,这就是宏展开,另外还要注意,实元可以是常数,寄存器,存储单元名,以及用寻址方式能找到的地址或表达式等,因此宏展开对不同实元做归纳处理了,这种方式要优于子程序参数传递过程。
6)宏调用和子程序调用工作方式的对比:
说明:两种调用方式可以看出,子程序调用过程中,它只占用自身空间大小,而宏汇编在调用后,都要作一次宏展开,因此会实际占用空间会随着宏调用次数增加而增加。在时间上宏汇编优于子程序,但在空间上子程序优于宏汇编,在实际设计程序时,需要充分考虑到两种方式下工作特点,而优化设计。
7)宏定义中的参数:宏定义中的参数出现情况有几种比较特殊的情况
宏定义中可以无变元(参数)
变元可以是操作码,比如:
FOO MACRO P1,P2,P3
MOVAX,P1 宏定义
P2,P3
ENDM
;**************************
FOO WORD_VAR,INC,AX 宏调用
;***************************
MOV AX,WORD_VAR 宏展开
INC AX
可见,参数可以是操作码自增指令INC,上例可见对特殊变元的宏展开只需要对其做普通变元对待即可。
变元可以是操作码的一部分,但在宏定义体中必须用&作分隔符,比如: LEAP MACROCOND,LAB
J&COND LAB
ENDM
:**********************
LEAPZ,THERE
…
LEAONZ,HERE
…
;**********************
JZTHERE
… 宏展开
JNZ HERE
…
说明:“&”是一个操作符,它在宏定义体中可以作哑元前缀,展开时可以把&前后两个符号合并成一个符号,这个符号可以是操作码,操作数或是一个字符串。
8)LOCAL伪操作:宏定义体内允许使用标号,但是如果只引入标号,在多次调用宏定义的时候,就会对标号作多重定义,这是不允许的,因为标号就是一个符号地址,不能被多重解释。为此我们引入了LOCAL伪操作,局部标号伪操作,其标准格式如下:
LOCAL LIST OF LOCAL LABELS
说明:LIST OF LOCAL LABELS局部标号表内的各标号间用逗号隔开。系统对LOCAL伪操作作的局部标号表中的每一个局部标号建立唯一的符号代替在展开中存在的局部标号。需要注意的是,LOCAL伪操作只能在宏定义内部使用,而且它必须是MACRO伪操作后的第一个语句。举例如下:
ABSOL MACRO OPER
LOCAL NEXT
CMP OPER,0
JGE NEXT 宏定义
NEG OPER
NEXT:
ENDM
;****************************
ABSOLVAR
…
ABSOLBX
…
;****************************
CMPVAR,0
JGE??0000
NEGVAR
??0000:
… 宏展开
CMP BX,O
JGE ??0001
NEG BX
??0000:
…
以上例子中,就是对局部标号作“??0000到??FFFF”符号处理的;在宏定义内出现多个标号时,可以把他们列在LOCAL伪操作后面,逗号隔开。
9)宏定义内使用宏:宏定义内允许使用宏调用,但是必须是先定义后调用,宏定义内还可以使用宏定义。
10)宏库的建立与调用:有时在程序中定义了较多宏,或者可以把自己编程中常用的宏定义建立成一个独立的文件,这个文件就可以称为宏库,文件扩展名为MAC或者INC。
第2节 重复汇编
1)重复汇编概念:有时汇编语言需要连续地重复完成相同或几乎完全相同的一组代码,这时候就需要重复汇编,这有些类似于C语言中的条件编译。
2)重复伪操作:重复伪操作的标准格式如下:
REPT EXPRESSION
…
ENDM
说明:REPT 和ENDM是一对伪操作,表达式EXPRESSION的值用来确定重复块的重复次数,表达式中如包含外部或未定义的项则汇编指示出错,重复伪操作也不一定要用在宏定义内部,举例如下:
X=0
REPT3
X=X+1
DB X
ENDM
;******************
DB 1
DB 2 编译后
DB 3
本周要求掌握的内容如下:
基本概念:宏的概念、宏定义、宏调用、宏展开、宏调用与子程序调用的工作过程对比、宏展开的过程、重复汇编的概念、重复汇编的使用方法
基本理论:理解宏定义、宏展开、宏调用的概念和操作过程,理解宏调用的优缺点,会用宏调用做宏展开,理解重复汇编的作用,会使用重复汇编
习题:
1、宏定义标准伪操作是:
(A)NAMEMACRO[哑元] (B)NAMEMACRO [哑元表]
… …
ENDP ENDS
(C) NAMEMACRO[哑元表] (D) NAMEMACRO [哑元表]
… …
END ENDM
2、在宏定义和宏调用的过程中,要求实元与哑元个数相同。
(错)
3、一般在什么情况下使用宏调用而不是使用子程序调用:
(A)重复调用的代码较短的情况 (B)重复调用的代码较长的情况
(C)传递的参数较少的情况 (D)传递的参数较多的情况
页:
[1]