版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七章高级汇编语言技术1、宏汇编2、重复汇编3、条件汇编如果在一个程序中多次使用同一组指令时,为了避免每次都要重写,该如何解决?方法1:把这组指令写成一个子程序,每次需要执行时调用这个子程序就可以了。方法2:当这组指令较短或不适合把它写成一个子程序时,可以把它定义成一个宏,每次需要执行时就去调用这个宏。宏汇编为用户提供更加容易、更加灵活、更加向高级语言靠拢的汇编工具。宏:源程序中一段有独立功能的程序代码。宏指令:用户自定义的指令。在编程时,将多次使用的功能用一条宏指令来代替。宏定义
macro_name
MACRO[哑元表];形参/虚参
……(宏定义体)……
ENDMmacro_name
宏指令名(宏名),调用时用。
[哑元表]形参表,哑元之间用逗号隔开一段有独立功能的程序代码宏调用格式:
macro_name[实元表];实参实元表中的实元与哑元表中的哑元在位置上一一对应;若实元数大于哑元数,则多余的实元无效;若实元数小于哑元数,则多余的哑元作“空(NUL)”处理;对宏指令的调用必须先定义后调用。注意:宏展开后,即用实参取代形式参数之后,所得到的语句应该是有效的,否则汇编时会出错。例1:用宏指令定义两个字操作数相乘,得到一个16位的第三个操作数作为结果。宏定义:MULTIPLYMACROOPR1,OPR2,RESULT PUSHDX PUSHAX MOVAX,OPR1 IMULOPR2 MOVRESULT,AX POPAX POPDX ENDM宏调用:MULTIPLYCX,VAR,XYZ[BX]MULTIPLY240,BX,SAVE宏展开源程序被汇编时,汇编程序把宏调用展开,也就是用宏定义体取代源程序中的宏指令名,同时用实元取代哑元,所展开的指令前加上1表示这些宏指令是由宏展开而得到的较早的版本用+符号表示宏展开:1PUSHDX1 PUSHAX1 MOVAX,CX1 IMULVAR1 MOVXYZ[BX],AX1 POPAX1POPDX1PUSHDX1 PUSHAX1 MOVAX,2401 IMULBX1 MOVSAVE,AX1 POPAX1 POPDX宏调用与子程序调用的区别子程序:在程序执行期间被调用,只占用自身大小的一段空间。主程序……CALLsub1……CALLsub1……CALLsub1……子程序sub1
………………ret宏调用:在汇编期间被展开,每调用一次就把宏定义体展开一次。宏定义宏调用宏展开Qmacrox,y
endm
……
QA,B
QC,D……
QE,F……
……
……
………………子程序与宏调用工作方式的差异1、子程序调用是在程序执行期间进行的,主程序通过CALL指令转入于程序的入口地址去执行子程序,子程序执行完后RET指令返回到主程序的调用处(断点处);而宏调用是通过宏指令名和实在参数(如果有要传递的参数的话)进行调用的,而且是在汇编期间展开宏定义体的。2、子程序中的这组指令的机器码在存储器中只需要存放一次;而宏调用则不同,每调用一次就把宏定义体展开一次,因而它占有的存储空间与调用次数有关,调用次数越多则占有的存储空间就越大3、子程序调用时需要用堆栈,调用子程序和返回主程序都要开销必要的时间;而宏调用其宏定义体展开是插入在调用程序中,因此避免了调用时跳到宏和由宏返回所开销的时间。如何选择用子程序还是用宏调用呢?一般来说,由于宏汇编可能占用较大的空间,所以代码较长的功能段往往使用子程序而不用宏汇编;而那些较短的且变元较多的功能段,则使用宏汇编比较合理。宏定义中的参数
1、可以无变元
2、可以是操作码
3、可以是操作码的一部分,但在宏定义体中必须用
&来分隔。
4、变元是ASCII串
5、%操作符宏定义可以无变元SAVEREGMACROPUSHAXPUSHBX PUSHCX PUSHDX PUSHSI PUSHDI ENDM变元可以是操作码FOOMACROP1,P2,P3MOVAX,P1P2P3 ENDM宏调用:FOOWORD_VAR,INC,AX宏展开:1MOVAX,WORD_VAR1INCAX变元是操作码的一部分变元可以是操作码的一部分,但在宏定义体中必须用&作为分隔符。LEAPMACROCOND,LABJ&CONDLAB ENDM宏调用:LEAPZ,THERELEAPNZ,HERE宏展开:1JZTHERE1JNZHERE&是一个操作符,它在宏定义体中可以作为哑元的前缀,展开时可以把&前后两个符号合并而形成一个符号,这个符号可以是操作码、操作数或是一个字符串。例:FOMACROP1JMPTA&P1 ENDM宏调用:FOWORD_VAR宏展开:1JMPTAWORD_VAR如果宏定义写为:FOMACROP1JMPTAP1 ENDM则在展开时,汇编程序把TAP1看作是一个独立的标号,并不把TAP1中的P1作为哑元看待,这样就不能达到预期的结果。变元是ASCII串MSGGENMACROLAB,NUM,XYZLAB&NUMDB‘HELLOMR.&XYZ’ ENDM宏调用:MSGGENMSG,1,TAYLOR宏展开:1MSG1DB‘HELLOMR.TAYLOR’变元中使用%的情况其格式为%expression汇编程序把跟在%之后的表达式的值转换成当前基数下的数,在展开期间,用这个数来取代哑元。MSGMACROCOUNT,STRINGMSG&COUNTDBSTRING ENDMERRMSGMACROTEXTCNTR=CNTR+1 MSG%CNTR,TEXT ENDM宏调用:CNTR=0ERRMSG‘SYNTAXERROR’ERRMSG‘INVALIDOPERAND’宏展开:2MSG1DB‘SYNTAXERROR’2MSG2DB‘INVALIDOPERAND’注意:2表示它是第二层展开的结果。一般在LST清单中,使用隐含的.XALL伪操作,即不产生代码的语句在清单中并不列出。为了能看到宏展开后的所有语句,可以在源程序中增加.LALL语句。实际上,本例的展开可以分为如下两层:CNTR=0CNTR=CNTR+11MSG%CNTR,’SYNTAXERROR’2MSG1DB‘SYNTAXERROR’1CNTR=CNTR+11MSG%CNTR,’INVALIDOPERAND’2MSG2DB‘INVALIDOPERAND’LOCAL伪操作在宏定义中允许使用标号。如果在程序中多次使用该宏定义时。展开后会出现标号的多重定义,这是不允许的。但是可以用伪指令LOCAL指定局部标号。[格式]LOCAL局部标号表
[说明]其中,局部标号表中的各标号之间用逗号分隔。汇编程序在汇编时对局部中标号表中的各标号建立唯一的符号(??0000一??FFFF)以取代展开后的各局部标号。该伪指令必须是宏定义体中的第一个语句,而且在MACRO和LOCAL之间还不允许有注释和分号标志。宏定义体内允许使用标号,如ABSOLMACROOPERCMPOPER,0 JGENEXT NEGOPERNEXT: ENDM在宏定义中允许使用标号。如果在程序中多次使用该宏定义时。展开后会出现标号的多重定义,这是不允许的。但是可以用伪指令LOCAL指定局部标号。本例中的ABSOL宏定义在考虑到有多次调用可能性的情况下,应定义为:ABSOLMACROOPER LOCALNEXTCMPOPER,0 JGENEXT NEGOPERNEXT: ENDM宏调用:
ABSOLVAR ABSOLBX宏展开:1CMPOPER,01 JGE??00001 NEGOPER1??0000:…1CMPOPER,01 JGE??00011 NEGOPER1??0001:以上例子中,宏定义体内只用了一个标号,如果宏定义体内的标号数多于一个,则可以把它们列在LOCAL伪操作之后,如LOCALNEXT,OUT,EXIT在宏展开时,汇编程序对第一次宏调用使用??0000取代NEXT,用??0001取代OUT,用??0002取代EXIT。对第二次宏调用将用??0003取代NEXT,用??0004取代OUT,用??0005取代EXIT。在宏定义体内使用宏限制条件:必须先定义后调用在宏定义体内不仅可以使用宏,也可以可以包含宏定义(也就是说,宏定义允许嵌套)例:
DIFMACROX,Y MOVAX,XSUBAX,Y ENDMDIFSQRMACROOPR1,OPR2,RESULT PUSHDX PUSHAX DIFOPR1,OPR2 IMULAX MOVRESULT,AX POPAX POPDXENDM宏调用:DIFSQRVAR1,VAR2,VAR3宏展开:1 PUSHDX1 PUSHAX2MOVAX,VAR12SUBAX,VAR21 IMULAX1 MOVVAR3,AX1 POPAX1 POPDXINT21MACROFUNCTN MOVAH,FUNCTN INT21H ENDMDISP MACROCHAR MOVDL,CHAR INT2102HENDM宏调用:
DISP’?’宏展开:1MOVDL,’?’2MOVAH,02H2INT21H宏定义体内不仅可以使用宏调用,也可以包含宏定义。DEFMACMACROMACNAM,OPERATOR MACNAMMACROX,Y,Z PUSHAX MOVAX,X OPERATORAX,Y MOVZ,AX POPAX ENDM ENDM其中MACNAM是内层的宏定义名,但又是外层宏定义的哑元。宏调用:DEFMACADDITION,ADD形成加法宏定义:
ADDITIONMACROX,Y,Z PUSHAX MOVAX,X ADDAX,Y MOVZ,AX POPAX ENDM同样,宏调用:DEFMACSUBTRACT,SUB可以形成减法宏定义。DEFMACLOGOR,OR可以形成逻辑或宏定义。宏调用:ADDITIONVAR1,VAR2,VAR3展开成:1 PUSHAX1 MOVAX,VAR11 ADDAX,VAR21 MOVVAR3,AX1 POPAX列表伪操作功能:控制汇编清单中宏展开的列出情况源程序(ASM文件)经汇编程序汇编,主要输出是OBJ文件和LST文件(列表文件)。LST文件同时列出源程序和机器语言程序清单,并给出符号表。.XALL默认值,只列出产生目标码的宏展开.LALL列出包括注释在内的所有宏展开.SALL不列出任何展开信息;;注释;宏展开时,;;后面的注释不予展开。例:源程序;definingandusingmacro-ex7_12_1Initzmacro;definemacroMov
ax,@data;initializesegmentMov
ds,ax;registerMov
es,axEndm;endmacroPromptmacromessge;definemacro;thismacrodisplaysanymessage;;generatescodethatlinkstodosMovah,09hLeadx,messge;promptInt21hEndm;endmacroFinishmacro;definemacroMovax,4c00hInt21hEndm;endmacro.modelsmall.386.stack200h;definestacksegment.data;definedatasegmentMessg1db‘customername?’,13,10,’$’Messg2db‘customeraddress?’,13,10,’$’.code;definecodesegmentBeginprocfar.sallInitz.xallPromptmessg1.lallPromptmessg2.xallFinishBeginendpEndbegin宏库的建立与调用宏库:只包含若干宏定义的文件,扩展名为MAC或LIB宏库的调用:在程序的开始用INCLUDE语句说明,例如
INCLUDEC:\MACRO.MAC注:INCLUDE语句可以不放在程序的最前面,但必须放在所有的宏调用之前为上例建立的宏库MACRO.MAC;alibraryofmacrosequencesmacro.macInitzmacro;definemacroMov
ax,@data;initializesegmentMov
ds,ax;registerMov
es,axEndm;endmacroPromptmacromessge;definemacro;thismacrodisplaysanymessage;;generatescodethatlinkstodosMovah,09hLeadx,messge;promptInt21hEndm;endmacroFinishmacro;definemacroMovax,4c00hInt21hEndm;endmacro使用宏库情况下的例7.12程序实现Includemacro.mac.modelsmall.386.stack200h;definestacksegment.data;definedatasegmentMessg1db‘customername?’,13,10,’$’Messg2db‘customeraddress?’,13,10,’$’.code;definecodesegmentBeginprocfarInitzPromptmessg1Promptmessg2FinishBeginendpEndbeginPURGE伪操作宏指令名可与指令助记符和伪指令名同名,但这时宏指令的优先级最高,而同名的指令和伪操作便失效。伪指令PURGE可取消宏定义,恢复指令的原来功效。格式:PURGE宏指令名[,宏指令名,…]PURGE可取消多个宏定义,而各宏指令名之间应以逗号分隔。功能:取消宏定义,使该宏定义为空。习题1:编写一条宏指令CLRB,完成用空格符将一字符区中的字符取代的工作。字符区首地址及其长度为变元。CLRBMACRON,ARRAYCLD;设置方向标志DF=0MOVCX,N;N为字符区长度MOVAL,20H;空格送AL寄存器LEADI,ARRAY;ARRAY为字符区首地址REPSTOSBENDM把AL的内容存入由目的变址寄存器指向的附加段的某单元中,并根据DF的值及数据类型修改目的变址寄存器的内容。当它与REP联用时,可把AL的内容存入一个长度为COUNT的缓冲区中。2:某工厂计算周工资的方法是每小时的工资率RATE乘以工作时间HOUR,另外每工作满十小时加奖金3元,工资总数存放在WAG中,请将月工资的计算编写成一条宏指令WAGES,并展开宏调用:WAGESR1,42WAGESMACRORATE,HOURMOVAL,HOURMOVBL,RATEMULBLMOVCX,AXMOVAX,HOURMOVBL,10DIVBLANDAX,00FFHMOVBL,3MULBLADDCX,AXMOVWAG,CXENDM重复汇编在编写汇编语言程序中,有时需要进行连续地重复完成相同的或几乎完全相同的操作,这时可以使用重复汇编,使书写的程序变得相当简洁。重复汇编有两种格式重复伪操作不定重复伪操作重复伪操作格式 :REPT表达式
…. ENDM其中,REPT和ENDM为伪指令,它们必须成对出现,中间是要重复的指令体,重复的次数由表达式的值来决定,表达式中如包含外部或未定义的项则汇编指示出错。重复伪操作并不一定要用在宏定义体内。例:7.13 X=0REPT10 X=X+1DBXENDM
汇编后产生
1DB1 1DB2 1DB3. 1DB10不定重复伪操作IRP伪操作格式: IRP形式参数,<参数表>
…(指令体) ENDM其中,IRP和ENDM伪指令必须成对出现,其间是要重复的指令体。重复的次数由参数表中参数的个数所决定,而且每重复一次,依次用参数表中的参数来代替形式参数。参数表必须用尖括号括起来,参数间用逗号分隔。例题:IRPX,<1,2,3,4,5,6,7,8,9,10>DBXENDM汇编后
1DB1 1DB2 . . 1DB10例题:IRPREG,<AX,BX,CX,DX>PUSH REGENDM汇编后
1 PUSH AX 1PUSH BX 1 PUSH CX 1 PUSH DXIRPC伪操作[格式] IRPC形式参数,字符串(或<字符串>) …(指令体) ENDM[说明]其中,伪指令IRPC和ENDM必须成对出现,其间是重复的指令体,重复的次数取决于字符串中字符的个数,在每次重复时,依次用字符串的字符代替形式参数。例题:IRPCX,01234567DB X+1ENDM汇编后
1 DB1 1 DB2 . . 1 DB8例题:IRPCK,ABCDPUSH K&XENDM汇编后
1 PUSH AX 1PUSH BX 1 PUSH CX 1 PUSH DX条件汇编[格式] IFxxxx[<表达式>] …条件为真汇编此块
[ELSE] …条件为假汇编此块
ENDIF[说明]其中,IFxxxx表示条件伪操作命令,它必须与ENDIF相配对。汇编程序对于条件伪操作命令中给定的条件进行检测,若条件成立(真),则汇编整个块。如果其中有ELSE命令,当条件成立时则只汇编从IFxxxx到ELSE之间的那一块;当条件不成立(假)时则只汇编从ELSE到ENDIF之间的那一块。例:宏指令MAX把三个变元中的最大值放在AX中,而且使变元数不同时产生不同的程序段
MAXMARCOK,A,B,CLOCALNEXT,OUTMOVAX,AIFK-1IFK-2CMPC,AXJLENEXTMOVAX,CENDIFNEXT:CMPB,AXJLEOUTMOVAX,BENDIFOUT:ENDM宏调用:
MAX1,P MAX2,P,Q MAX3,P,Q,R宏展开:
MAX1,P 1MOVAX,P 1??0001: MAX2,P,Q 1MOVAX,P 1 ??0002: 1 CMPQ,AX 1 JLE??0003 1 MOVAX,Q 1 ??0003:MAX3,P,Q,R 1 MOV AX,P 1 CMP R,AX 1 JLE ??0004 1 MOV AX,R 1 ??0004: 1 CMP Q,AX 1 JLE ??0005 1 MOV AX,Q 1 ??0005:例: 宏指令BRANCH产生一条转向X的转移指令。当它相对于X的距离小于128字节时产生JMPSHORTX;否则产生JMPNEARPTRX(X必须位于该转移指令之后,即低地址区)。
BRANCHMARCOXIF($-X)LT128JMPSHORTXELSEJMPNEARPTRXENDIF ENDM宏调用:BRANCHAA宏展开:1JMPSHORTAA否则产生
1JMP
NEARPTRAA
例:宏定义的递归调用,条件伪操作可以用来结束宏递归。宏指令POWER可以用来实现X和2N相乘,这只需对X左移N次即可实现,可以设COUNT为递归次数的计数值,当该数与N相等时就可以结束递归调用。宏定义:
POWERMARCOX,NSALX,1 COUNT=COUNT+1IFCOUNT-NPOWERX,NENDIFENDM宏调用:
COUNT=0 POWERAX,3宏展开:1 SALX,12 SALX,13 SALX,1条件伪操作IF1
条件伪操作IF1使用举例例:仍使用“例7.12使用宏库情况下的程序实现”,但在INCLUDE语句前加上IF1,其含义是使INCLUDE语句只在汇编的第一遍扫视期间出现,这样宏库的拷贝将不在汇编清单中出现,以便节省空间If1Includemacro.macEndif.modelsmall.386.stack200h;definestacksegment.data;definedatasegmentMessg1db‘customername?’,13,10,’$’Messg2db‘customeraddress?’,13,10,’$’.code;definecodesegmentBeginprocfarInitzPromptmessg1Promptmessg2FinishBeginendpEndbegin条件伪操作IFNDEF使用举例DIVIDE是一个用相继的减法来实现除法的程序,在进入该程序主体之前,使用IFNDEF来检查该宏定义的三个参数是否已在程序中得到定义,如其中任一参数未经定义则将用CNTR加以记录,最
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2030年全球及中国合成刹车油行业销售现状及营销趋势预测报告
- 2024年政府公共厕所改造装修施工合同
- 2024-2030年全球及中国二氯异氰尿酸钠行业产销状况及未来前景预测报告
- 2024-2030年全球及中国3,3,4,4联苯四羧酸二酐行业供需现状及投资趋势预测报告
- 2024-2030年传统餐桌行业市场现状供需分析及重点企业投资评估规划分析研究报告
- 2024-2030年中国魔芋胶行业销售策略与营销前景预测报告
- 2024-2030年中国高带宽相干驱动器调制器市场现状规模与前景趋势预测报告
- 2024-2030年中国驴肉行业销售模式及投资盈利预测报告版
- 2024-2030年中国饮用蒸馏水行业市场销售渠道及未来发展趋势分析报告
- 2024-2030年中国食品温度计行业竞争力分析及发展策略研究报告版
- 【初中化学】二氧化碳的实验室制取课件-2024-2025学年九年级化学人教版上册
- 2024年湖北省公务员考试《行测》真题及答案解析
- 第4章《一元一次方程》-2024-2025学年七年级数学上册单元测试卷(苏科版2024新教材)
- DB3502T 148-2024中小型水库生产运行标准化管理规程
- 公司组织机构管理制度
- 预习-21《蝉》导学案
- 四年级数学上册 第4章《运算律》单元测评必刷卷(北师大版)
- GB/T 44672-2024体外诊断医疗器械建立校准品和人体样品赋值计量溯源性的国际一致化方案的要求
- 新人教版七年级上册生物全册知识点(期末复习用)
- 2023乌鲁木齐法院书记员真题
- 金属切削原理与刀具夏云才课后参考答案
评论
0/150
提交评论