高级汇编.docx
- 文档编号:6105122
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:15
- 大小:18.89KB
高级汇编.docx
《高级汇编.docx》由会员分享,可在线阅读,更多相关《高级汇编.docx(15页珍藏版)》请在冰豆网上搜索。
高级汇编
高级汇编语言技术
一、宏汇编
宏定义是用一组伪操作来实现的。
其格式是:
macro_nameMACRO[dumny_parameter_list]
...(宏定义体)
ENDM
其中MACRO和ENDM是一对伪操作.这对伪操作之间是宏定义体--是一组独立功能的程序代码.宏指令名(macro_name)给出该宏定义的名称,调用时就使用宏指令名来调用该宏定义.其中哑元表(dumny_parameter_list)给出了该宏定义中所用到的形式参数(或称虚参),每个哑元之间用逗号隔开.
经宏定义后的宏指令就可以在源程序中调用.这种对宏指令的调用称为宏调用,宏调用的格式是:
macro_name[actual_parameter_list]
实元表(actual_parameter_list)中的每一项为实元,相互之间用逗号隔开.
1.宏定义可以无变元
宏定义:
SAVEREGMACRO
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHSI
PUSHDI
ENDM
宏调用:
SAVEREG
2.变元可以是操作码
宏定义:
FOOMACROP1,P2,P3
MOVAX,P1
P2P3
ENDM
宏调用:
FOOWORD_VAR,INC,AX
宏展开:
+MOVAX,WORD_VAR
+INCAX
3.变元可以是操作码的一部分,但在宏定义体中必须用&作为分隔符.
宏定义:
LEAPMACROCOND,LAB
J&CONDLAB
ENDM
宏调用:
...
LEAPZ,THERE
...
LEAPNZ,HERE
...
宏展开:
...
+JZTHERE
...
+JNZHERE
...
4.&是一个操作符,它在宏定义体中可以作为哑元的前缀,展开时可以把&前后个符号合并而形成一个符号,这个符号可以是操作码,操作数或是一个字符串
宏定义:
POMACROP1
JMPTA&P1
ENDM
宏调用:
FOWORD_VAR
宏展开:
+JMPTAWORD_VAR
5.实元是ASCII串的情况
宏定义:
MSGGENMACROLAB,NUM,XYZ
LAB&NUMDB'HELLOMR.&XYZ'
ENDM
宏调用:
MSGGENMSG,1,TAYLOR
宏展开:
+MSG1DB'HELLOMR.TAYLOR'
6.宏指令名可以与指令助记符或伪操作名相同,在这种情况下,宏指令的优先级最高,而同名的指令或伪操作就失效了.伪操作PURGE可以用来在适当的时候取消宏定义,以便恢复指令的原始含义.
宏定义:
ADDMACROOPR1,OPR2,RESULT
...
ENDM
宏调用:
...
ADDXX,YY,ZZ
PURGEADD
...
在宏调用后,用PURGE伪操作取消定义,以便恢复ADD指令的原始含义,在PURGEADD后面所用的ADD指令,则服从机器指令的定义.
PURGE伪操作可同时取消多个宏操作,此时各宏指令之间用逗号隔开.
7.LOCAL伪操作的使用.宏定义体内允许使用标号,如:
宏定义:
ABSOLMACROOPER
CMPOPER,O
JGENEXT
NEGOPER
NEXT:
ENDM
如果程序中多次调用该宏定义时,展开后会出现标号的多重定义.为此系统提供了LOCAL伪操作,其格式是
LOCALlistoflocallabels
其中局部标号表内的各标号之间用逗号隔开.汇编程序对LOCAL伪操作的局部标号表中的每一个局部标号建立唯一的符号(用?
?
0000~?
?
FFFF)以代替在展开中存在的每个局部标号.必须注意,LOCAL伪操作只能用在宏定义体内,而且它必须是MACRO伪操作后的第一个语句,在MACRO和LOCAL伪操作之间还不允许有注释和分号标志.
本例中的ABSOL宏定义在考虑有多次调用可能性的情况下,应定义为:
ABSOLMACROOPER
LOCALNEXT
CMPOPER,0
JGENEXT
NEGOPER
NEXT:
ENDM
宏调用:
...
ABSOLVAR
...
ABSOLBX
...
宏展开:
...
+CMPVAR,0
+JGE?
?
0000
+NEGVAR
+?
?
0000:
...
+CMPBX,0
+JGE?
?
0001
+NEGBX
+?
?
0001:
...
8.宏定义中允许使用宏调用,其限制条件是:
必须先定义后调用
宏定义:
DIFMACROX,Y
MOVAX,X
SUBAX,Y
ENDM
DIFSQRMACROOPR1,OPR2,RESULT
PUSHDX
PUSHAX
DIFOPR1,OPR2
IMULAX
MOVRESULT,AX
POPAX
POPDX
ENDM
宏调用:
DIFSQRVAR1,VAR2,VAR3
9.宏定义体内不仅可以使用宏调用,也可以包含宏定义.
宏定义:
DEFMACMACROMACNAM,OPERATOR
MACNAMMACROX,Y,Z
PUSHAX
MOVAX,X
OPERATORAX,Y
MOVZ,AX
POPAX
ENDM
ENDM
其中MACNAM是内层的宏定义名,但又是外层宏定义的哑元,所以调用DEFMAC时,就形成一个宏定义.
宏调用:
DEFMACADDITION,ADD
宏展开:
+ADDITIONMACROX,Y,Z
PUSHAX
MOVAX,X
ADDAX,Y
MOVZ,AX
POPAX
ENDM
形成加法宏定义ADDITION.同样,宏调用
DEFMACSUBTRACT,SUB
形成减法的宏定义.当然在形成这些宏定义后,就可以使用宏调用
ADDITIONVAR1,VAR2,VAR3
而展开成:
+PUSHAX
+MOVAX,VAR1
+ADDAX,VAR2
+MOVVAR3,AX
+POPAX
10.这里再介绍一个宏定义的变元中使用的伪操作%,它的格式是:
%expression
汇编程序把跟在%之后的表达式的值转换成当前基数下的数,在展开期间,用这个数来取代哑元.
宏定义:
MSGMACROCOUNT,STRING
MSG&COUNTDBSTRING
ENDM
ERRMSGMACROTEXT
CNTR=CNTR+1
MSG%CNTR,TEXT
ENDM
宏调用:
...
CNTR=0
ERRMSG'SYNTAXERROR'
...
ERRMSG'INVALIDOPERAND'
...
宏展开:
...
+MSG1DB'SYNTAXERROR'
...
+MSG2DB'INVALIDOPERAND'
...
二、重复汇编
有时汇编语言程序需要连续地重复完全相同的或者几乎完全相同的一组代码,这时可使用重复汇编。
1.重复伪操作
格式为:
REPTexpression
...(重复块)
ENDM
其中表达式的值用来确定重复块的重复次数,表达式中如包含外部或未定义的项则汇编指示出错.
重复伪操作并不一定要在宏定义体内,例如:
X=0
REPT10
X=X+1
DBX
ENDM
则汇编后产生
+DB1
+DB2
+DB3
...
+DB10
把字符A到Z的ASCII码填入数组TABLE
CHAR='A'
TABLELABELBYTE
REPT26
DBCHAR
CHAR=CHAR+1
ENDM
用宏定义及重复伪操作把TAB,TAB+1,TAB+2,...,TAB+16的内容存入堆栈.
宏定义:
PUSH_TABMACROK
PUSHTAB+K
ENDM
宏调用:
I=0
REPT17
PUSH_TAB%I
I=I+1
ENDM
要求建立一个100D字的数组,其中每个字的内容是下一个字的地址,而最后一个字的内容是第一个字的地址.
ARRAYLABELWORD
REPT99
DW$+2
ENDM
DWARRAY
2.不定重复伪操作
(1)IRP伪操作
格式是:
IRPdummy,
...(重复块)
ENDM
汇编程序把重复块的代码重复几次,每次重复把重复块中的哑元用自变量表中的一项来取代,下一次取代下一项,重复次数由自变量表中的自变量个数来确定.自变量表必须用尖括号括起,它可以是常数,符号,字符串等.
例1:
IRPX,<1,2,3,4,5,6,7,8,9,10>
DBX
ENDM
汇编后得:
+DB1
+DB2
...
+DB10
例2:
IRPREG,
PUSHREG
ENDM
汇编后得:
+PUSHAX
+PUSHBX
+PUSHCX
+PUSHDX
(2)IRPC伪操作
格式是:
IRPCdummy,string(或
...(重复块)
ENDM
IRPC和IRP类似,但自变量表必须是字符串.重复次数由字符串中的字符个数确定,每次重复用字符串中的下一个字符取代重复块中的哑元.例:
例1:
IRPCX,01234567
DBX+1
ENDM
汇编后得:
+DB1
+DB2
...
+DB8
例2:
IRPCK,ABCD
PUSHK&X
汇编后展开形成:
+PUSHAX
+PUSHBX
+PUSHCX
+PUSHDX
三、条件汇编
汇编程序能根据条件把一段源程序包括在汇编语言程序内或者把它排除在外,这里就用到条件伪操作.条件伪操作的一般格式是:
IFXXargument
...}自变量满足给定条件汇编此块
[ELSE]
...}自变量不满足给定条件汇编此块
ENDIF
自变量必须在汇编程序第一启遍扫视后就成为确定的数值.条件伪操作中的XX表示条件如下:
IFexpression汇编程序求出表达式的值,如此值不为0则满足条件.
IFEexpression如求出表达式的值为0则满足条件.
IFDEFsymbol如符号已在程序中定义,或者已用EXTRN伪操作说明该符号是在外部定义的,则满足条件.
IFNDEFsymbol如符号未定义或未通过EXTRN说明为外部符号则满足条件.
IFB
IFNB
IFIDN
IFDIF
条件伪操作可以用在宏定义体内,也可以用在宏定义体外,也允许嵌套任意次.
例1:
宏指令MAX把三个变元中的最大值放在AX中,而且使变元数不同时产生不同的程序段.
宏定义:
MAXMACROK,A,B,C
LOCALNEXT,OUT
MOVAX,A
IFK-1
IFK-2
CMPC,AX
JLENEXT
MOVAX,C
ENDIF
NEXT:
CMPB,AX
JLEOUT
MOVAX,B
ENDIF
OUT:
ENDM
宏调用:
MAX1,P
MAX2,P,Q
MAX3,P,Q,R
宏展开:
MAX1,P
+MOVAX,P
+?
?
0001:
MAX2,P,Q
+MOVAX,P
+?
?
0002:
CMPQ,AX
+JLE?
?
0003
+MOVAX,Q
+?
?
0003:
MAX3,P,Q,R
+MOVAX,P
+CMPR,AX
+JLE?
?
0004
+MOVAX,R
+?
?
0004:
CMPQ,AX
+JLE?
?
0005
+MOVAX,Q
+?
?
0005:
例2.宏指令GOTOL,X,REL,Y(其中REL可以是Z,NZ,L,NL等)可以根据不同情况产生无条件转移指令或比较和条件转移指令.
宏定义:
GOTOMACROL,X,REL,Y
JFB
JMPL
ELSE
MOVAX,X
CMPAX,Y
J&RELL
ENDIF
ENDM
宏调用:
...
GOTOLOOP,SUM,NZ,15
...
GOTOEXIT
...
宏展开:
...
+MOVAX,SUM
+CMPAX,15
+JNZLOOP
...
+JMPEXIT
例3.宏定义可允许递归调用,此时条件伪操作可用来结束宏递归
宏指令POWER可以用来实现X和2N相乘.这只需对X左移N次可实现,可以设COUNT为递归次数的计数值,当该数与N相等时即可结束递归调用.
宏定义:
POWERMACROX,N
SALX,1
COUTN=COUT+1
IFCOUNT-N
POWERX,N
ENDIF
ENDM
宏调用:
COUTN=0
POWERAX,3
宏展开:
+SALAX,1
+SALAX,1
+SALAX,1
例4.宏指令BRANCH产生一条转向X的转移指令.当它相对于X的距离小于128字节时产生JMPSHORTX;否则产生JMPNEARPTRX(X必须位于该转移指令之后,即低地址区).
宏定义:
BRANCHMACROX
IF($-X)LT128
JMPSHORTX
ELSE
JMPNEARPTRX
ENDIF
ENDM
宏调用:
BRANCHX
宏展开:
如X与BRANCH指令间的距离小于128时产生
+JMPSHORTX
否则产生:
+JMPNEARPTRX
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高级 汇编