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

付费下载

下载本文档

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

文档简介

1、第7章高级汇编语言技术7.1宏汇编7.2重复汇编7.3条件汇编1. 宏汇编宏:源程序中一段有独立功能的程序代码。在源程序中定义一次,就可以多次调用它,调用时只需要一个宏指令语句。宏指令:用户自定义的指令。在编程时,将多次 使用的功能用一条宏指令来代替。 汇编语言程序指令伪指令(伪操作)宏指令7.1.1宏定义、宏调用和宏展开2、宏定义: macro_name MACRO 哑元表 ; 形参/虚参 LOCAL 标号表 ; 宏定义体 ENDM宏定义名的第一个符号必须是字母,其后可以跟字母、数字或下划线字符。 哑元表给出了宏定义中所用到的形式参数(或称虚参),每个哑元之间用逗号隔开。4、宏展开:汇编程序

2、把宏调用展开宏展开就是用宏定义体取代源程序中的宏指令,而且用实元取代宏定义中的哑元。取代时实元和哑元应该一一对应,即第一个实元取代第一个哑元,第二个实元取代第二个哑元依次类推 。一般说来,实元的个数和哑元的个数相等,但汇编程序并不要求它们必须相等。若实元个数大于哑元个数,则多余的实元不予考虑;若实元个数小于哑元个数,则多余的哑元作“空”处理。注意:宏展开后,即用实元取代哑元后,所得到的语句应该是有效的,即汇编语法应是正确的,否则汇编程序将会指示出错。 3、宏调用: (必须先定义后调用) macro_name 实元表 ; 实参实元表中的每一项为实元,相互之间用逗号隔开。 优:模块化 省内存缺:开

3、销大宏定义:Q macro x,y endm主程序:Q a, bQ c, dQ e, f目标程序:优:参数传送简单,执行效率高缺:占用内存空间大主程序:CALL -CALL -CALL -子程序: RET5. 宏与子程序的区别例:两个字相乘宏定义:multiply MACRO opr1,opr2,result push dx push ax mov ax,opr1 imul opr2 mov result,ax pop ax pop dx ENDM宏调用:multiply cx,var,xyzbx宏展开:1 push dx1 push ax1 mov ax,cx1 imul var1 mov

4、xyzbx,ax1 pop ax1 pop dx例:保存寄存器宏展开:1 push ax1 push bx1 push cx1 push dx1 push si1 push di宏定义:savereg MACRO push ax push bx push cx push dx push si push di ENDM宏调用:savereg6、宏定义中的参数(1)宏定义中可以无变元(2)变元可以是操作码例:宏定义:FOOMACRO P1,P2,P3MOV AX,P1P2P3ENDM宏调用:FOO WORD_VAR,INC,AX宏展开:1MOV AX,WORD_VAR1INC AX(3)变元可以是

5、操作码的一部分,但在宏定义体中必须用&作为分隔符。例:宏定义:LEAPMACRO COND,LABJ&COND LABENDM宏调用:LEAP Z,THERELEAP NZ,HERE宏展开:1JZ THERE1JNZ HERE(3)变元可以是操作码的一部分,但在宏定义体中必须用&作为分隔符。例:宏定义:LEAPMACRO COND,LABJ&COND LABENDM宏调用:LEAP Z,THERELEAP NZ,HERE宏展开:1JZ THERE1JNZ HERE 说明:&是一个操作符,它在宏定义中可以作为哑元素的前缀,展开时可以把&前后两个符号合并而形成一个符号,这个符号可以是操作码、操作数

6、或是一个字符串。例:FOMACROP1JMPTA&P1ENDM宏调用:FOWORD_VAR宏展开:1JMPTAWORD_VAR如果宏定义为:FOMACROP1JMPTAP1ENDM 则在展开时,汇编程序把TAP1看做是一个独立的标号,并不把TAP1中的P1作为哑元看待。例:变元是ASCII串宏定义:MSGGENMACRO LAB,NUM,XYZLAB&NUMDBHELLO MR.&XZYENDM宏调用:MSGGENMSG,1,TAYLOR宏展开:1MSG1DB HELLO MR.TAYLOR(4)变元中使用%操作符的情况,格式为 %expression。汇编程序把跟在%之后的表达式的值转换成当

7、前基数下的数,在展开时,用这个数来取代哑元。宏定义:MSGMACRO COUNT,STRINGMSG&COUNTDB STRINGENDMERRMSGMACROTEXTCNTR=CNTR+1MSG%CNTR,TEXTENDM宏调用: CNTR=0 ERRMSGSYNTAX ERROR ERRMSG INVALID OPERAND宏展开:2MSG1DB SYNTAX ERROR 2 MSG2DB INVALID OPERAND实际展开分两层:CNTR=0CNTR=CNTR+11MSG%CNTR,SYNTAX ERROR 2MSG1DB SYNTAX ERROR 1CNTR=CNTR+11MSG%

8、CNTR,INVALID OPERAND2MSG2DBINVALID OPERAND(5)LOCAL伪操作:宏定义:ABSOLMACROOPERCMPOPER,0JGENEXTNEGOPERNEXT:ENDM如果程序中多次调用该宏时,则展开后会出现标号的多重定义,这是不能允许,这时可以使用LOCAL伪操作。其格式为:LOCAL list of local labels:其中局部标号表内的各标号之间用逗号隔开。汇编程序对LOCAL伪操作的局部标号表中的每一个局部标号建立唯一的符号。(用?0000?FFFF)代替在展开中存在的每个局部标号。注意:LOCAL伪操作只能用在宏定义体内,而且它必须是MA

9、CRO伪操作后的第一个语句,在MACRO和LOCAL伪操作之间还不允许有注释和分号标志。ABSOLMACROOPERLOCAL NEXTCMPOPER,0JGENEXTNEGOPERNEXT:ENDM因此上例可以改为如下:ABSOLMACROOPERLOCAL NEXTCMPOPER,0JGENEXTNEGOPERNEXT:ENDM宏调用:ABSOL VARABSOL BX则宏展开后为:则宏展开后为:1CMPVAR,01JGE?00001NEGVAR1 ?0000:1CMP BX,01JGE ?00011NEG BX1 ?0001:如果宏定义体内的标号数多于一个,则可以把他们列在LOCAL伪操

10、作之后,如LOCAL NEXT,OUT,EXIT宏展开时用?0000取代NEXT,?0001取代OUT, ?0002取代EXIT。第二次调用用?0003取代NEXT,?0004取代OUT, ?0005取代EXIT。(6)在宏定义内使用宏:宏定义内允许使用宏调用,其限制条件是:必须先定义后调用。宏定义:DIFMACROX,YMOVAX,XSUBAX,YENDMDIFSQRMACROOPER1,OPER2,RESULTPUSH DXPUSH AXDIF OPER1,OPER2IMUL AXMOV RESULT,AXPOP AXPOP DXENDM宏调用:DIFSQRVAR1,VAR2,VAR3宏展

11、开:1PUSH DX1PUSH AX2MOVAX,VAR12SUBAX,VAR21IMUL AX1MOV VAR3,AX1POP AX1POP DX例宏定义:INT21MACROFUNCTNMOVAH,FUNCTNINT 21HENDMDISPMACROCHARMOV DL,CHARINT2102HENDM宏调用:DISP ?宏展开:1 MOV DL,?2 MOVAH,02h2 INT 21H(6)在宏定义内包含宏定义:宏定义:DEFMACMACROMACNAM,OPERATORMACNAMMACRO X,Y,ZPUSH AXMOV AX,XOPERATOR AX,YMOV Z,AXPOP A

12、XENDMENDM其中MACNAM是内层的宏定义名,又是外层宏定义的哑元。因此调用DEFMAC时,就形成一个宏定义。宏调用:DEFMACADDITION,ADD形成加法宏定义:ADDITION MACRO X,Y,ZPUSH AXMOV AX,XADD AX,YMOV Z,AXPOP AXENDM同样,宏调用DEFMACSUBTRACT,SUB可形成减法宏定义。DEFMAC LOGOR,OR可形成逻辑或宏定义。(7)宏库的建立:当程序中定义多个宏或自己程序中常用的宏定义建立一个独立的文件,这个只包含若干个宏定义的文件可称为宏库通常的扩展名为MAC或INC来表示。在应用程序中需要用到宏库中的宏定

13、义时,只需要在程序的开始用下列语句,INCLUDE C:MACRO.MAC你们汇编程序将把宏库中的所有的宏定义都包含在应用程序中。7.2重复汇编用于连续产生完全相同或基本相同的一组代码。1、重复伪操作 REPTREPT 表达式 ;重复块ENDM其中表达式的值用来确定重复的次数,表达式如果包含外部或未定义的项则汇编出错。例:X=0REPT 10X=X+1DBXENDM则汇编后产生1DB 11DB 21DB 10例:把字符A到Z的ASCII码填入数组TABLE。CHAR=ATABLELABLE BYTEREPT 26DBCHARCHAR=CHAR+1ENDM经汇编产生:1DB 41H1DB 42H

14、1DB 5AH例:用宏定义及重复伪操作把TAB,TAB+2,TAB+4,TAB+8的内容存入堆栈。宏定义:PUSH_TABMACRO KPUSH TAB+KENDM宏调用:I=0REPT5PUSH_TAB %II=I+2ENDM宏展开宏展开2PUSH TAB+02PUSH TAB+22PUSH TAB+42PUSH TAB+62PUSH TAB+8例:要求建立一个8字的数组,其中每个字的内容是下一字的地址,而最后一个字的内容是第一个字的地址。ARRAYLABLE WORDREPT 7DW $+2ENDMDWARRAY经汇编后得:1DW$+21DW$+21DW$+2DW ARRAY2、不定重复伪

15、操作:(1)IRP格式:IRP 哑元, ;重复块ENDM说明:汇编程序把重复块的代码重复几次,每次重复把重复块中的哑元用自变量表中的一项来取代,下一次取代下一项,重复次数由自变量表中的自变量个数确定。自变量表必须用尖括号括起来,它可以是常数、符号和字符串。例:IRP X,DBXENDM汇编后得:则汇编后产生1DB 11DB 21DB 10IRP REG, PUSH REGENDM汇编后:1 PUSH AX1 PUSH BX1 PUSH CX1 PUSH DX(2)IRPC伪操作IRPC 哑元,字符串 ;重复块ENDMIRPC自变量必须是字符串。重复次数由字符串中的字符个数确定,每次重复用字符串

16、中的下一个字符取代重复块中的哑元。例:array label byteIRPC K, 12345db NO.&KENDM1 db NO.11 db NO.21 db NO.31 db NO.41 db NO.5例:IRPC X, 01234567db X+1ENDM1 db 11 db 21 db 31 db 41 db 5例:IRPC K, ABCDPUSH K&XENDM1 PUSH AX1 PUSH BX1 PUSH CX1 PUSH DX7.3条件汇编根据条件把一段源程序包括在汇编语言程序内或者排除在外。一般格式:IF ; 为条件 ; 自变量满足条件则汇编此块ELSE ; 自变量不满足

17、条件则汇编此块ENDIFIF 表达式 ;表达式0,则汇编IFE 表达式 ;表达式0,则汇编IF1 ;在第一遍扫视期间满足条件IF2 ;在第二遍扫视期间满足条件IFDEF 符号 ;符号已定义,则汇编IFNDEF 符号 ;符号未定义,则汇编IFB ;自变量为空,则汇编IFNB ;自变量不为空,则汇编IFIDN , ;串1与串2相同IFDIF , ;串1与串2不同例:求最大值放入AX宏定义:MAX MACRO K,A,B,C LOCAL NEXT,OUT MOV AX, A IF K-1 IF K-2 CMP C, AX JLE NEXT MOV AX, C ENDIFNEXT: CMP B, AX

18、 JLE OUT MOV AX, B ENDIFOUT: ENDM1 MOV AX, P1 ?0002: CMP Q, AX1 JLE ?00031 MOV AX, Q1 ?0003:宏展开:1 MOV AX, P1 ?0001: 1 MOV AX, P1 CMP R, AX1 JLE ?00041 MOV AX, R1 ?0004: CMP Q, AX1 JLE ?00051 MOV AX, Q1 ?0005:宏调用:MAX 1, PMAX 2, P, QMAX 3, P, Q, R例:宏指令BRANCH产生一条转向X的转移指令。当它相对于X的距离小于128字节时产生JMP SHORT X;

19、否则产生JMP NEAR PTR X(X必须位于该转移指令后)BRANCHMACRO XIF ($-X) LT 128JMP SHORT XELSEJMP NEAR PTR XENDIFENDM宏调用:BRANCH AA宏展开:1JMP SHORT AA否则产生1JMPNEAR NEAR PTR AA(1) 宏定义的递归调用例:POWER实现 ( X * 2N ); 宏展开1 SAL AX, 12 SAL AX, 13 SAL AX, 1 宏定义POWER MACRO X, N SAL X, 1CNT=CNT+1 IF CNT-N POWER X, N ENDIF ENDM; 宏调用CNT=0 POWER AX, 3(1) IFNDEF的使用 mov ax, dividend mov bx, divisor sub cx, cxcomp: cmp ax, bx jb out sub ax, bx inc cx jmp compout: mov quotient, cx endmdivide macro dividend,divisor,quotient local comp, out cnt=0 ifndef divid

温馨提示

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

最新文档

评论

0/150

提交评论