第13章 高级宏汇编语言技术_第1页
第13章 高级宏汇编语言技术_第2页
第13章 高级宏汇编语言技术_第3页
第13章 高级宏汇编语言技术_第4页
第13章 高级宏汇编语言技术_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

第13章高级宏汇编语言技术

13.1结构

13.2记录13.3宏汇编13.4重复汇编11.5条件汇编

13.1结构

MASM支持结构,其直接引用高级语言的结构数据概念。

13.1.1结构的定义结构名STRUC<数据定义语句序列>结构名ENDS【例】定义一个与时间有关的结构。TIMERSSTRUCYEAR_STRDB'CURRENTDATE:','$'YEARDW?MONTHDB?DAYDB?TIME_STRDB'CURRENTTIME:','$'HOURDB?MINUTEDB?SECDB?TIMERSENDS13.1.2结构的预置与存储单元的分配结构变量预置语句的格式:结构变量名结构名<字段值表>

【例】TIMERS结构进行引用。STR1TIMERS<>STR2TIMERS<‘ABCD’,2012>所有字段都不修改。修改前两个字段。注意:只有简单结构字段(用DB、DW、DD定义的单项变量)和字符串字段的初值可以修改。13.1.3结构变量使用举例

【例】写一个程序,获取系统日期和时间,并显示。TIMERSSTRUCDATE_STRDB'Thecurrentdateis:','$'YEARDW?MONTHDB?DAYDB?TIME_STRDB'Thecurrenttimeis','$'HOURDB?MINUTEDB?SECDB?TIMERSENDSINCLUDEUSER.MACDISP_TMACROX;以十进制输出字节内容DISP_CHAR':'MOVAL,XMOVAH,0MOVBX,10CALLNUM_DECENDMDATASEGMENTTIMESTIMERS<>DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXCALLGET_DATE;获取系统日期CALLDISP_DATE;显示系统日期CRLF;回车换行CALLGET_TIME;获取系统时间CALLDISP_TIME;显示系统时间MOVAX,4C00HINT21HGET_DATEPROCNEAR;取系统日期MOVAH,2AHINT21HMOVTIMES.YEAR,CX;年信息MOVTIMES.MONTH,DH;月MOVTIMES.DAY,DL;日RETGET_DATEENDPGET_TIMEPROCNEAR;取系统时间MOVAH,2CHINT21HMOVTIMES.HOUR,CHMOVTIMES.MINUTE,CLMOVTIMES.SEC,DHRETGET_TIMEENDP

DISP_DATEPROCNEAR;显示系统日期DISP_STRTIMES.DATE_STRMOVAX,TIMES.YEARMOVBX,10CALLNUM_DEC;输出年份DISP_TTIMES.MONTH;输出月DISP_TTIMES.DAY;输出日RETDISP_DATEENDPDISP_TIMEPROCNEAR;显示系统时间DISP_STRTIMES.TIME_STRDISP_TTIMES.HOURDISP_TTIMES.MINUTEDISP_TTIMES.SECRETDISP_TIMEENDPINCLUDENUM_DEC.ASMCODEENDS宏汇编的意义:避免了重复编写,使源程序更加简洁、易读。

13.3.1宏功能的使用过程1.宏定义宏指令:将在源程序中多次使用到同一个程序段定义成一个“指令”格式不带参数

宏名MACRO┇}宏体ENDM带参数

宏名MACRO形参1,形参2,.....┇}宏体ENDM不可缺省,且名字唯一语句序列【例】对两个存储单元(字节/字)的内容相互交换的程序段进行宏定义: EXCHANGEMACROMEM1,MEM2,REG MOVREG,MEM1 XCHGREG,MEM2 MOVMEM1,REG

ENDM

形参13.3宏汇编2.宏调用含义:用宏指令名来代替原来的程序段

格式不带参数

宏名带参数

宏名实参1,实参2,.....数字,符号名等。3.宏展开含义:宏汇编程序在汇编源程序时自动用宏指令的内容代替宏指令

注意:宏指令的使用不会减少程序的目标代码长度

【例】宏指令使用的过程:;宏定义PUSH4 MACRO PUSHAXPUSHBX PUSHCX PUSHDX

ENDMEXCHANGEMACROMEM1,MEM2,REG MOVREG,MEM1 XCHGREG,MEM2 MOVMEM1,REG

ENDM;设置数据段DATA SEGMENT DA_W01 DW1234H DA_W02 DW5678H DATA ENDS ;设置堆栈段 STACK1SEGMENTPARASTACK DW20HDUP(?) STACK1 ENDS;设置代码段COSEGSEGMENTASSUMECS:COSEG,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AX ┇

PUSH4

;宏指令语句+PUSHAX+PUSHBX+PUSHCX+PUSHDX┇

EXCHANGEDA_W01,DA_W02,CX;宏指令语句+MOVCX,DA_W01+XCHGCX,DA_W02+MOVDA_W01,CX┇COSEGENDSENDSTART

1.连接操作符&13.3.2宏操作符含义:宏展开时,对应形参的实参就与它前后的符号连接在一起用途:修改某些符号【例】连接符&的使用:SHIFT_VARMARCOR_M,DIRECT,COUNTMOVCL,COUNTS&DIRECTR_M,CLENDMSHIFT_VARAX,HL,2的宏展开为:+MOVCL,2+SHLAX,CL

SHIFT_VARBX,HR,3的宏展开为:+ MOVCL,3+ SHRBX,CL

2.表达式操作符%含义:告诉宏汇编程序获取表达式的值,而不是获取表达式文本本身格式:%表达式

注意:这个操作符一般是出现在宏调用中,不允许出现在形参的前面。

【例】表达式%的使用:;宏定义SHIF0MACROCNTMOVCL,CNT

ENDMSHIF1MACROREG,DIRECT,NUMCOUNT=NUMSHIF0%COUNTS&DIRECTREG,CL

ENDM

;宏调用SHIF1AX,HL,2SHIF1BL,AR,3;宏展开SHIF1AX,HL,2+MOVCL,2+SHLAX,CLSHIF1BL,AR,3+MOVCL,3+SARBL,CL3.文本操作符<>含义:把一个完整的实参括起来,作为一个单一的实参。【例】:EXCHANGE<BYTEPTRDA_WORD1>,<BYTEPTRDA_WORD2>,AL宏展开时,替换的三条指令是:MOVAL,BYTEPTRDA_WORD1XCHGAL,BYTEPTRDA_WORD2MOVBYTEPTRWORD1,AL

注意:文本操作符还可以用来处理某些特殊字符:如“;”和“&”。

【例】:<;>就表示一个分号“;”的实参,而不是注释符。

4.字符操作符!

含义:“!”后的字符不作特别的操作符使用,而是以字符本身的意义进行处理。如:“!&”表示&不作连接操作符用,只作符号&使用。“!%”表示%不作表达式操作符使用,只作百分号用。【例】字符操作符!的使用:;宏定义:PROMPTMACRONUM,TEXTPROMP&NUMDB'&TEXT&'ENDM宏调用:PROMPT23,<Expression!>255>宏展开:PROMP23DB'Expression>255'5.宏注解符;;

含义:说明后面的文本是注解。13.3.3LOCAL伪指令意义:在宏定义中使用变量名和标号,为了避免在宏展开时产生多个相同的变量名或标号。

格式:LOCAL<符号表>

在宏定义中定义的变量名和标号,多个符号之间用逗号间隔

注意:宏展开时,LOCAL伪指令指定的变量、标号自动生成格式为“??ⅩⅩⅩⅩ”的符号,其中后四位顺序使用0000~FFFF的十六进制数字。

【例】用连续相加的办法实现无符号数乘法运算,编制宏定义MULTIPMULTIPMACROMULT1,MULT2,MULT3

LOCALLOP,EXIT0MOVDX,MULT1;乘数1MOVCX,MULT2;乘数2XORBX,BXXORAX,AXJCXZEXIT0

LOP:ADDBX,DXADCAX,0LOOPLOPEXIT0:MOVMULT3,BXMOVMULT3+2,AXENDM设某数据段有如下定义的变量:DA1DW1234H,5678HDA2DW120H,210HDA3DW4DUP(?)在代码段中:如有两次宏调用,则两次的宏展开如下: ┇

MULTIPDA1,DA2,DA3 +MOVDX,DA1 +MOVCX,DA2 +XORBX,BX +XORAX,AX +JCXZ??0001+??0000:ADDBX,DX +ADCAX,0 +LOOP??0000+??0001:MOVDA3,BX +MOVDA3+2,AX ┇

MULTIPDA1+2,DA2+2,DA3+4 +MOVDX,DA1+2 +MOVCX,DA2+2 +XORBX,BX +XORAX,AX +JCXA??0003+??0002:ADDBX,DXADCAX,0 LOOP??0002+??0003:MOVDA3+4,BX +MOVDA3+6,AX ┇13.3.4宏嵌套1.宏定义嵌套含义:一个宏定义中包含另一个宏定义

【例】嵌套的宏定义:JUMP MACROCOND;外层宏定义J&COND&SMACRODEST;内层宏定义 LOCALNEXT,EXITJ&CONDNEXT JMPEXITNEXT:JMPDESTEXITENDMENDM应用:常常用这种宏定义嵌套来产生一些新的宏定义

例如外层宏调用为:JUMPEJUMPNEJUMPGJUMPGE分别形成内层宏定义的宏名:JES,JNES,JGS,JGES。

如有两个条件转移的目标地址分别是SUB1和SUB2,这时内层宏调用为:┇JESSUB1;等于0转移┇JGESSUB2;大于或等于0转移┇当宏汇编程序对内层宏展开后,得如下结果:JE??0000JMP??0001??0000:JMPSUB1??0001:┇JGE??0002JMP??0003??0002:JMPSUB2??0003:┇

2.宏定义内嵌套宏调用

含义:在一个宏定义的宏体内有宏调用注意:被调用的宏指令必须是已定义的

【例】SHIFT是对32位数左移一位的宏定义,其中NUM1是高16位数,NUM2是低16位数。MULT12是对一个32位数乘以12的宏定义,其中M_R1是存放高16位数的存储单元或寄存器,M_R2是存放低16位数的存储单元或寄存器。在乘法的过程中,要使用寄存器暂存32位数,REG1和REG2就是指定用来暂存数据的两个寄存器。在MULT12的宏定义中,当需要对32位数进行左移时,就调用SHIFT的宏定义。现有两个宏定义:SHIFTMACRONUM1,NUM2SALNUM2,1RCLNUM1,1 ENDMMULT12MACROM_R1,M_R2,REG1,REG2PUSHFPUSHREG1PUSHREG2SHIFTM_R1,M_R2某数据段已定义变量:DA_WORDDW123H,456H程序中可以编写宏指令语句:┇MULT12DA_WORD+2,DA_WORD,AX,BX┇MULT12AX,BX,CX,DX┇SHIFTM_R1,M_R2MOVREG1,M_R1MOVREG2,M_R2SHIFTM_R1,M_R2ADDM_R2,REG2ADCM_R1,REG1POPREG2POPREG1POPFENDM13.3.5宏程序库含义:若干个宏定义以文件的形式组成一个宏库,供其他源程序使用。

调用:在新编制的源程序中使用INCLUDE伪指令

宏指令与子程序的区别

相同点:(1)简化源程序的书写。(2)节省编程工作量。不同点:(1)宏指令并不节省目标程序,子程序节省目标代码和存储空间(2)宏指令的功能灵活,执行速度快;子程序的灵活性差些,执行速度也不如宏指令快【例12-10】用IRP重复汇编伪指令定义一个保存寄存器信息的宏定义:

PUSHREGMACROTEXTIRPREG,<TEXT>PUSHREGENDMENDM【例】用重复汇编可以在9*9个字节存储单元中存放一个乘法九九表的数值:N=0REPT9N=N+1M=0REPT9M=M+1DBN*MENDMENDM

13.4重复汇编类型REPT伪指令

格式:REPT表达式┇┇ENDM重复语句序列

含义:将重复语句序列重复汇编,表达式的值为重复汇编的次数。重复汇编语句序列等效:DB1,2,3,4,5,6,7,8,9DB2,4,6,8,10,12,14,16,18DB3,6,9,12,15,18,21,24,27DB4,8,12,16,20,24,28,32,36DB5,10,15,20,25,30,35,40,45DB6,12,18,24,30,36,42,48,54DB7,14,21,28,35,42,49,56,63DB8,16,24,32,40,48,56,64,72DB9,18,27,36,45,54,63,72,81IRP伪指令

格式:

IRP形参,<实参1,实参2,……>┇┇

ENDM

含义:将重复语句序列重复汇编,次数由实参个数所决定。

重复语句序列IRPC伪指令

格式:

IRPC形参,字符串┇┇ENDM

含义:将重复语句序列重复汇编,次数由字符串中字符个数决定重复语句序列对上述宏定义的宏调用:PUSHREG<AX,BX,CX,DX>在汇编源程序时,宏展开可得:+PUSHAX+PUSHBX+PUSHCX+PUSHDX对上述宏定义的宏调用:POPREGDCBA在汇编期间,宏展开可得:+POPDX+POPCX+POPBX+POPAX例:编制一个用IRPC伪指令从堆栈中恢复寄存器内容的宏定义:

POPREGMACROSTRINGIRPCREG,STRINGPOPREG&XENDMENDM

13.5条件汇编含义:汇编程序根据条件的不同汇编不同的程序段。

格式:IF××表达式

温馨提示

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

评论

0/150

提交评论