汇编语言课件:a07-高级汇编语言技术_第1页
汇编语言课件:a07-高级汇编语言技术_第2页
汇编语言课件:a07-高级汇编语言技术_第3页
汇编语言课件:a07-高级汇编语言技术_第4页
汇编语言课件:a07-高级汇编语言技术_第5页
已阅读5页,还剩22页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

第七章

高级汇编语言技术17.1宏汇编什么是宏宏(或宏指令)是源程序中一段有独立功能的程序代码,只需定义一次,可以多次调用为什么使用宏汇编?在编制汇编语言程序过程中,有些功能程序段需要多次重复使用,所不同的只是参与操作的操作数。为了减少编程的工作量,通常采用两种方法:①将程序段编写为独立的子程序②将程序段定义成宏27.1宏汇编

7.1.1宏定义、宏调用和宏展开宏定义用伪指令MACRO/ENDM实现,其语句格式是:宏指令名

MACRO[形参1,形参2,…,形参n] ┇宏定义体

ENDM37.1宏汇编

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

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

7.1.1宏定义、宏调用和宏展开宏调用宏调用的格式为:宏指令名[实参1,实参2,…,实参n]说明:实参可以是常数、寄存器、存储单元、地址表达式、指令的操作码或者是操作码的一部分宏展开宏展开就是宏定义体取代源程序中的宏指令名,而且用实元取代哑元。汇编源程序时,宏汇编程序将对每条宏指令语句进行宏展开,用实参替代相应的形参,对宏体目标代码作相应改变57.1宏汇编

7.1.1宏定义、宏调用和宏展开子程序调用和宏调用的工作方式CallQCallQCallQQ:RET子程序Q主程序QE,FQC,DQA,BENDMQMACROX,Y主程序主程序展开67.1宏汇编

7.1.1宏定义、宏调用和宏展开用一个例子来说明宏定义、宏调用和宏展开的情况例:将两个16位数相加,结果存入16位RESULT单元中对两数相加功能进行宏定义7BCDADDMACROVARX,VARY,RESULT

MOVAL,VARXADDAL,VARYMOVRESULT,ALMOVAL,VARX+1ADCAL,VARY+1MOVRESULT+1,AL

ENDMDATASEGMENTA1DW1234HA2DW5678HA3DW?

B1DW1357HB2DW2468HB3DW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:PUSHDSMOVAX,0PUSHAX8

MOVAX,DATAMOVDS,AX

BCDADDA1,A2,A3;宏调用

BCDADDB1,B2,B3

;再次宏调用

RETCODEENDSENDSTART经宏展开后:

PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AX

MOVAL,A11ADDAL,A21MOVA3,AL1MOVAL,A1+11ADCAL,A2+11MOVA3+1,AL1MOVAL,B11ADDAL,B21MOVB3,AL1MOVAL,B1+11ADCAL,B2+11MOVB3+1,AL

宏汇编程序在所展开的指令前标识以‘1’号以示区别。较早的版本用‘+’97.1宏汇编

7.1.2宏定义中的参数宏定义可以没有参数savereg

macropushaxpushbxpushcxpushsi

endm107.1宏汇编

7.1.2宏定义中的参数参数可以是操作码amacro p1,p2,p3

mov ax,p1p2 p3endm调用:

aword_var,inc,ax

展开:1mov

ax,word_var1inc ax117.1宏汇编

7.1.2宏定义中的参数参数可以是操作码或操作数的一部分,但在宏定义体中必须使用分隔符&,即&是操作符,在宏定义中可作为形参的前缀,展开时把&前后的两个符号连接起来,形成操作码、操作数或字符串。&只能出现在宏定义中12SHIFTMARCOX,Y,ZMOVCL,XS&ZY,CLENDM形参Z是操作码的一部分。宏汇编中规定,若宏定义体中的形参没有适当的分隔符,就不被当作形参,调用时也不会被实参代替。上例被调用时:

SHIFT4,CL,AL

SHIFT6,BX,AR则宏展开时的目标代码:

1MOVCL,4 1SALAL,CL

1MOVCL,61SARBX,CL13例

fomacrop1

jmp

ta&p1

endm

宏调用:fo

word_var宏展开:1Jmp

taword_var如果这样:

fomacrop1

jmptap1

endm

宏调用:fo

word_var宏展开:1Jmp

?147.1宏汇编

7.1.2宏定义中的参数伪操作%能出现在形参的前面,通常用在宏调用中,将跟在它后面的表达式的值转换成以当前基数下的数,在宏展开时,用转换后的值代替形参15例宏定义:MAKERMACROCOUNT,STRMAKER&COUNTDBSTR

ENDMERRMAMACROTEXTCNTR=CNTR+1

MAKER%CNTR,TEXT

ENDM经宏调用:CNTR=0ERRMA‘SYNTAXERROR’┇ERRMA‘INVALIDOPERAND’┇宏展开:┇

2MAKER1DB‘SYNTAXERROR’┇2MAKER2DB‘INVALIDOPERAND’┇167.1宏汇编

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

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

ABSMACROOPS

LOCALPLUSCMPOPS,0JGEPLUSNEGOPSPLUS:MOVAX,OPS

ENDM宏调用:

ABSCXMOVBX,AX

ABSDX宏展开后的指令为:1

CMPCX,01JGE

??00001NEGCX1??0000:

MOVAX,CXMOVBX,AX1CMPDX,01JGE

??00011NEGDX1??0001:MOVAX,DX

187.2重复汇编

7.2.1定重复伪指令REPT有时汇编语言程序要连续地重复完成相同或者几乎完全相同的一组代码,这时可用重复汇编定义重复伪指令REPT其一般格式为:

REPT表达式

┇(重复块)

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

NUM=0REPT10

NUM=NUM+1DBNUMENDM

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

207.2重复汇编

7.2.1不定重复伪指令IRP其一般格式为:

IRP形参,〈参数1,参数2,…〉┇(重复块)

ENDM

此伪指令重复执行重复块中所包含的语句,重复的次数由参数表中的参数个数决定。重复汇编时,依次用参数表中的参数取代形参,直到表中的参数用完为止。参数表中的参数必须用两个三角号括起来,参数可以是常数、符号、字符串等,各参数间用逗号隔开217.2重复汇编

7.2.1不定重复伪指令IRP例多次将AX、BX、CX、DX寄存器内容压栈,宏定义如下:PUSHRMACROIRPREG,〈AX,BX,CX,DX〉PUSHREGENDMENDM汇编后:1PUSHAX1PUSHBX1PUSHCX1PUSHDX227.2重复汇编

7.2.3不定重复字符伪指令IRPC其语句格式为:

IRPC形参,字符串(或〈字符串〉)┇(重复块)

ENDM此伪指令重复执行重复块中的语句,重复汇编的次数等于字符串中字符的个数。每次重复执行时,依次用字符串中的一个字符取代形参,直到字符串结束。可见IRPC伪指令与IRP伪指令类似,只是IRPC用字符串(其三角括号可以有也可以无)代替了IRP伪指令中的参数表23例:Irpcx,01234567Dbx+1Endm汇编后:1Db11Db2┇1Db8再如:可用IRPC实现:PUSHRMACROIRPCREG,ABCD

PUSHREG&XENDMENDM同样,汇编后也可得到:1PUSHAX1PUSHBX1PUSHCX1PUSHDX247.3条件汇编汇编程序能根据条件把一段源程序包括在汇编语言程序内的或排除在外,这里就用到条件伪操作。条件伪操作的一般格式是:Ifxxargument┇;自变量满足条件汇编此块[ELSE]┇;自变量不满足条件汇编此块ENDIF说明:汇编程序在对源程序汇编时,要对源程序扫描二遍。第一遍建立符号表,第二遍才把汇编语言指令翻译成机器语言指令。那么自变量必须在汇编程序第一遍扫视后就成为确定的数值257.3条件汇编IFexpression;汇编程序求出表达式的值,如此值不为0,

温馨提示

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

评论

0/150

提交评论