欢迎来到天天文库
浏览记录
ID:42853858
大小:326.51 KB
页数:58页
时间:2019-09-24
《高级汇编语言技术(2)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第7章高级汇编语言技术7.1宏汇编为什么使用宏汇编?在编制汇编语言程序过程中,有些功能程序段需要多次重复使用,所不同的只是参与操作的操作数。为了减少编程的工作量,通常采用两种方法:①将程序段编写为独立的子程序②将程序段定义成宏大家想一下子程序有什么优缺点?什么是宏?宏(或宏指令)是源程序中一段有独立功能的程序代码,只需定义一次,可以多次调用。1.宏定义用伪指令MACRO/ENDM实现,其语句格式是:宏指令名MACRO[形参1,形参2,…,形参n]┇宏定义体ENDM7.1.1宏定义、宏调用和宏展开说明宏指令名
2、是该宏定义的名称。调用时使用宏指令名对该宏定义进行调用。宏指令符合标识符规定。宏指令名不能重复,并且指令的第一个字符必须是字母。但可以和源程序中的其他变量、标号、指令、伪指令名相同,在这种情况下宏指令的优先级最高。MACRO必须与ENDM成对出现。MACRO标识宏定义的开始。形式参数(即形参,也称哑元、虚参)是可选项,宏可以不带参数;带参数时,多个形参间用逗号分隔。2.宏调用宏调用的格式为:宏指令名[实参1,实参2,…,实参n]宏展开宏展开就是宏定义体取代源程序中的宏指令名,而且用实元取代哑元。汇编源程序时
3、,宏汇编程序将对每条宏指令语句进行宏展开,用实参替代相应的形参,对宏体目标代码作相应改变。说明:实参可以是常数、寄存器、存储单元、地址表达式、指令的操作码或者是操作码的一部分。CallQCallQCallQQ:RET子程序QQA,BQC,DQE,FQMACROX,YENDM主程序主程序主程序展开子程序调用和宏调用的工作方式用一个例子来说明宏定义、宏调用和宏展开的情况例:将两个16位数相加,结果存入16位RESULT单元中。;对两数相加功能进行宏定义BCDADDMACROVARX,VARY,RESULTMOV
4、AL,VARXADDAL,VARYMOVRESULT,ALMOVAL,VARX+1ADCAL,VARY+1MOVRESULT+1,ALENDMDATASEGMENTA1DW1234HA2DW5678HA3DW?B1DW1357HB2DW2468HB3DW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXBCDADDA1,A2,A3;宏调用BCDADDB1,B2,B3;再次宏调用RETCODE
5、ENDSENDSTART经宏展开后:PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXMOVAL,A11ADDAL,A21MOVA3,AL1MOVAL,A1+11ADCAL,A2+1MOVA3+1,AL1MOVAL,B11ADDAL,B21MOVB3,AL1MOVAL,B1+1ADCAL,B2+1MOVB3+1,AL宏汇编程序在所展开的指令前标识以‘1’号以示区别。较早的版本用‘+’7.1.2宏定义中的参数:1宏定义可以无参数saveregmacropushaxpushbxpushc
6、xpushsiendm2参数可以是操作码amacrop1,p2,p3movax,p1p2p3endm调用:aword_var,inc,ax展开:movax,word_var1incax3参数可以是操作码或操作数的一部分,但在宏定义体中必须使用分隔符&,即&是操作符,在宏定义中可作为形参的前缀,展开时把&前后的两个符号连接起来,形成操作码、操作数或字符串。&只能出现在宏定义中。例宏定义:SHIFTMARCOX,Y,ZMOVCL,XS&ZY,CLENDM形参Z是操作码的一部分。宏汇编中规定,若宏定义体中的形参没
7、有适当的分隔符,就不被当作形参,调用时也不会被实参代替。上例被调用时:SHIFT4,CL,ALSHIFT6,BX,AR则宏展开时的目标代码:1MOVCL,41SALAL,CL1MOVCL,61SARBX,CL例fomacrop1jmpta&p1endm宏调用:foword_var宏展开:1Jmptaword_var如果这样:fomacrop1jmptap1endm宏调用:foword_var宏展开:1Jmp?4伪操作%不能出现在形参的前面,通常用在宏调用中,将跟在它后面的表达式的值转换成以当前基数下的数,在
8、宏展开时,用转换后的值代替形参。例宏定义:MAKERMACROCOUNT,STRMAKER&COUNTDBSTRENDMERRMAMACROTEXTCNTR=CNTR+1MAKER%CNTR,TEXTENDM经宏调用:CNTR=0ERRMA‘SYNTAXERROR’┇ERRMA‘INVALIDOPERAND’┇宏展开:┇2MAKER1DB‘SYNTAXERROR’┇2MAKER2DB‘INVALIDOPERAND
此文档下载收益归作者所有