高级汇编技术课件_第1页
高级汇编技术课件_第2页
高级汇编技术课件_第3页
高级汇编技术课件_第4页
高级汇编技术课件_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

什么是宏?宏(或宏指令)是源程序中一段有独立功能的程序代码,只需定义一次,可以多次调用。

为什么使用宏汇编?在编制汇编语言程序过程中,有些功能程序段需要多次重复使用,所不同的只是参与操作的操作数。

为了减少编程的工作量,通常采用两种方法:

①将程序段编写为独立的子程序

②将程序段定义成宏高级汇编技术18.1宏汇编

8.1.1宏定义、宏调用和宏展开

8.1.2形参和实参

8.1.3伪指令PURGE返回

8.1.4伪指令LOCAL

退出28.1.1宏定义、宏调用和宏展开

1.宏定义用伪指令MACRO/ENDM实现,其语句格式是:宏指令名

MACRO[形参1,形参2,…,形参n]┇

宏体

ENDM

例如,BCD码和ASCII码之间的转换,可将AL中的内容左移或右移定义成宏指令。3说明

宏指令名是该宏定义的名称。调用时使用宏指令名对该宏定义进行调用。宏指令符合标识符规定。宏指令名不能重复,但可以和源程序中的其他变量、标号、指令、伪指令名相同,在这种情况下宏指令的优先级最高。

MACRO必须与ENDM成对出现。MACRO标识宏定义的开始。形式参数(即形参,也称哑元、虚参)是可选项,宏可以不带参数;带参数时,多个形参间用逗号分隔。形参的规定与对标识符的规定是一致的。48.1.1宏定义、宏调用和宏展开

假设左移4位:SHIFTMACRO MOVCL,4SALAL,CLENDM2.宏调用宏调用的格式为:宏指令名[实参1,实参2,…,实参n]

58.1.1宏定义、宏调用和宏展开对于上例的宏定义,编程时宏调用语句为

SHIFT

┇宏展开

宏展开将宏指令语句用宏定义中宏体的程序段目标代码替换。汇编源程序时,宏汇编程序将对每条宏指令语句进行宏展开,用实参替代相应的形参,对宏体目标代码作相应改变。

68.1.1宏定义、宏调用和宏展开例8.1将两个用压缩的BCD码表示的4位十进制数相加,结果存入RESULT单元中。;对两数相加功能进行宏定义

BCDADDMACROVARX,VARY,RESULTMOVAL,VARXADDAL,VARY

DAA;低位相加、调整

MOVRESULT,ALMOVAL,VARX+1ADCAL,VARY+1DAA;高位相加、调整

MOVRESULT+1,AL

78.1.1宏定义、宏调用和宏展开ENDMDATASEGMENTA1DB30H,11HA2DB79H,47HA3DB2DUP(?)

B1DB32H,23HB2DB71H,62HB3DB2DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:PUSHDS

MOVAX,0PUSHAX88.1.1宏定义、宏调用和宏展开MOVAX,DATAMOVDS,AXBCDADDA1,A2,A3

;宏调用

BCDADDB1,B2,B3

;再次宏调用

RETCODEENDSENDSTART经宏展开后:

PUSHDSMOVAX,0

PUSHAXMOVAX,DATAMOVDS,AX+

MOVAL,A198.1.1宏定义、宏调用和宏展开+

ADDAL,A2+

DAA;低位相加、调整+

MOVA3,AL+

MOVAL,A1+1+

ADCAL,A2+1+

DAA;高位相加、调整+

MOVA3+1,AL+

;对两数相加功能进行宏定义+

MOVAL,B1+

ADDAL,B2+

DAA;低位相加、调整+

MOVB3,AL+

MOVAL,B1+1+

ADCAL,B2+1108.1.1宏定义、宏调用和宏展开+

DAA;高位相加、调整+

MOVB3+1,AL

宏汇编程序在所展开的指令前标识以‘+’号以示区别。宏定义允许嵌套。在宏定义中可以使用宏调用,但必须先定义这个宏调用。例8.3有宏定义如下:DIFMLMACROOPRAND,OPRATOPRANDMACROX,Y,ZPUSHAXMOVAX,XOPRATAX,YMOVZ,AXPOPAX118.1.1宏定义、宏调用和宏展开ENDMENDM对宏定义DIFML进行宏调用:

DIFMLADDITION,ADD经宏展开:+ADDITIONMACROX,Y,ZPUSHAXMOVAX,XADDAX,YMOVZ,AX

POPAX

ENDM为实现对ADDITION的调用,需要连续两条宏调用语句:

DIFMLADDITION,ADDADDITIONN1,N2,N3128.1.2形参和实参宏定义中可以不带任何形参,宏调用时不需提供实参(即使有实参,也会不予处理),宏展开后宏体中的所有指令不作修改原样插入到宏调用的宏指令处。如例8.4。形参可以是操作码或操作数的一部分,但在宏定义体中必须使用分隔符&,即&是操作符,在宏定义中可作为形参的前缀,展开时把&前后的两个符号连接起来,形成操作码、操作数或字符串。&只能出现在宏定义中。如例8.6。

138.1.2形参和实参在宏定义中,形参可以出现在宏体的任何位置,可以是操作码或操作数。如例8.3中OPRAT。伪操作%不能出现在形参的前面,通常用在宏调用中,将跟在它后面的表达式的值转换成以当前基数下的数,在宏展开时,用转换后的值代替形参。如例8.8。

在宏调用中的实参如果自身是带有间隔符(如逗号、空格),必须使用文本操作符〈〉将它括起来,作为单一的完整的实参。如例8.9。148.1.2形参和实参例8.4将寄存器内容移位的操作定义为宏指令,并宏调用。设一个参数时,移位次数为参数CN:

SHIFTMACROCNMOVCL,CNSHLAX,CLENDM

宏调用时提供相应的实参数值:

SHIFTCONST

设两个参数时,参数为寄存器和移位次数:

SHIFTMACROCN,RMOVCL,CNSHLR,CLENDM

宏调用提供移位次数和寄存器:SHIFTCONST,REG158.1.2形参和实参例8.6宏定义:SHIFTMARCOX,Y,ZMOVCL,XS&ZY,CLENDM形参Z是操作码的一部分。宏汇编中规定,若宏定义体中的形参没有适当的分隔符,就不被当作形参,调用时也不会被实参代替。上例被调用时:

SHIFT4,AL,CLSHIFT6,BX,AR则宏展开时的目标代码:+

MOVCL,4

SALAL,CL

MOVCL,6

SARBX,CL168.1.2形参和实参例8.8宏定义:MAKERMACROCOUNT,STRMAKER&COUNTDBSTRENDMERRMAMACROTEXTCNTR=CNTR+1MAKER%CNTR,TEXTENDM经宏调用:

178.1.2形参和实参

CNTR=0ERRMA‘SYNTAXERROR’┇ERRMA‘INVALIDOPERAND’┇宏展开:

MAKER1DB‘SYNTAXERROR’

MAKER2DB‘INVALIDOPERAND’

┇188.1.2形参和实参例8.9在程序设计中,对堆栈段的定义语句基本相同,只是堆栈段的长度和初值不同。所以可以先定义一个宏(放在宏库中),供随时取用,为编程带来很大方便。宏定义如下:MSTACKMACROXYZSTACKSEGMENTSTACKDBXYZSTACKENDSENDM宏调用时:

MSTACK〈100DUP(?)〉宏展开为:+

STACKSEGMENTSTACK

DB100

DUP(?)+

STACKENDS198.1.3伪指令PURGE

宏指令名可以和源程序中的其他变量名、标号、指令助记符、伪操作名相同,此时宏指令的优先级别最高,使其他同名的指令或伪操作无效。为了使这些指令或伪指令恢复功能,服从机器指令的定义,宏汇编程序提供了伪操作PURGE,用来在适当的时候取消宏定义。

PURGE伪指令的一般格式是:

PURGE宏定义名[,…]方括号表示PURGE可以取消多个宏定义,宏名之间用逗号隔开。如宏定义:

SUBMACROVARX,VARY,RESULT

ENDM宏调用:SUBX,Y,ZPURGESUB“PURGESUB”语句后的SUB恢复减法功能。

208.1.4伪指令LOCAL

宏定义体内可以使用标号。对于使用了标号的宏定义,若多次调用,势必产生标号的多重定义,汇编时出错。解决这一问题可使用伪指令LOCAL,其一般格式为:

LOCAL局部标号1,局部标号2,…

宏汇编程序将为标号分别生成格式为“??XXXX”的唯一的符号以代替各局部标号。XXXX代表四位十六进制数0000~FFFF。这样,在汇编源程序中,避免了多次宏调用时生成的标号重复。注意:LOCAL伪操作只能用在宏定义体内,而且必须是MACRO伪操作后的第一个语句,在MACRO与LOCAL不能出现注释和分号标志。

218.1.4伪指令LOCAL例8.10定义取绝对值的宏指令如下:

ABSMACROOPSLOCALPLUSCMPOPS,0JGEPLUSNEGOPSPLUS:MOVAX,OPSENDM宏调用:

ABSCXMOVBX,AXABSDX228.1.4伪指令LOCAL宏展开后的指令为:+

CMPCX,0+

JGE??0000+

NEGCX+??0000:MOVAX,CXMOVBX,AX+

CMPDX,0+

JGE??0001+

NEGDX+??0001:

MOVAX,DX

238.2重复汇编

8.2.1定重复伪指令REPT8.2.2不定重复伪指令IRP

8.2.3不定重复字符伪指令IRPC

退出返回248.2.1定重复伪指令REPT

其一般格式为:

REPT表达式

┇(重复块)

ENDM

其中,REPT和ENDM必须成对出现,两者间的重复块是要重复汇编的部分。表达式的值用来表示重复块的重复汇编次数。定重复伪操作不一定要用在宏定义体内。

258.2.1定重复伪指令REPT例8.11有下列语句:

NUM=0REPT10NUM=NUM+1DBNUMENDM

汇编后,将数据1,2,3,…,10分配给十个连续的字节单元:+

DB1+

DB2+

DB3┇+

DB10268.2.2不定重复伪指令IRP

其一般格式为:

IRP形参,〈参数1,参数2,…〉

(重复块)

ENDM

此伪指令重复执行重复块中所包含的语句,重复的次数由参数表中的参数个数决定。重复汇编时,依次用参数表中的参数取代形

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论