高级汇编.docx

上传人:b****5 文档编号:6105122 上传时间:2023-01-03 格式:DOCX 页数:15 大小:18.89KB
下载 相关 举报
高级汇编.docx_第1页
第1页 / 共15页
高级汇编.docx_第2页
第2页 / 共15页
高级汇编.docx_第3页
第3页 / 共15页
高级汇编.docx_第4页
第4页 / 共15页
高级汇编.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

高级汇编.docx

《高级汇编.docx》由会员分享,可在线阅读,更多相关《高级汇编.docx(15页珍藏版)》请在冰豆网上搜索。

高级汇编.docx

高级汇编

高级汇编语言技术

一、宏汇编

宏定义是用一组伪操作来实现的。

其格式是:

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

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

当前位置:首页 > 高等教育 > 院校资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1