《汇编语言课件和实验指导第七章》由会员分享,可在线阅读,更多相关《汇编语言课件和实验指导第七章(27页珍藏版)》请在金锄头文库上搜索。
1、 宏宏汇编汇编 重复汇编重复汇编 条件汇编条件汇编第七章第七章 高级汇编语言技术高级汇编语言技术11. 宏汇编宏汇编 宏宏:源程序中一段有独立功能的程序代码。源程序中一段有独立功能的程序代码。宏指令宏指令:用户自定义的指令。在编程时,将多次用户自定义的指令。在编程时,将多次 使用的功能用一条宏指令来代替。使用的功能用一条宏指令来代替。 汇编语言程序汇编语言程序指令指令伪指令(伪操作)伪指令(伪操作)宏指令宏指令2优:优:模块化模块化 省内存省内存缺:缺:开销大开销大宏定义:宏定义:Q macro x,yendm主程序:主程序:Q a, bQ c, dQ e, f目标程序:目标程序:优:优:参数
2、传送参数传送简单,执简单,执行效率高行效率高缺:缺:占用内存占用内存空间大空间大主程序:主程序:CALL -CALL -CALL -子程序:子程序: RET3宏展开:宏展开:汇编程序把汇编程序把宏调用宏调用展开展开 宏定义体宏定义体 复制到宏指令位置复制到宏指令位置, ,实参代虚参实参代虚参 LOCAL LOCAL中的标号中的标号 ?0000 ?0000?ffff?ffff宏定义:宏定义:macro_name macro_name MACROMACRO 哑元表哑元表 ;形参/虚参 LOCAL LOCAL 标号表标号表 ;宏定义体 ENDMENDM宏调用:宏调用: (必须先定义后调用)(必须先定
3、义后调用)macro_name macro_name 实元表实元表 ;实参4例:保存寄存器例:保存寄存器宏展开:宏展开:1 push ax1 push ax1 push bx1 push bx1 push cx1 push cx1 push dx1 push dx1 push si1 push si1 push di1 push di宏定义:宏定义:saveregsavereg MACROMACRO push ax push ax push bx push bx push cx push cx push dx push dx push si push si push di push di EN
4、DMENDM宏调用:宏调用: saveregsavereg5例:两个字相乘例:两个字相乘宏定义:宏定义: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 xyzbx,ax1 pop ax1 pop dx6例:求绝对值例:求绝对值宏定义:宏定义:absol MACRO oper LO
5、CAL nextLOCAL next cmp oper,0 jge nextnext neg opernext:next: ENDM宏调用:宏调用:absol varabsol bx宏展开:宏展开:1 cmp var,01 jge ?00001 neg var1 ?0000: 1 cmp bx,01 jge ?00011 neg bx1 ?0001: 7宏汇编操作符:宏汇编操作符: & ; %符号符号1 & 符号符号2 宏展开时宏展开时, ,合并前后两个符号形成一个符号。合并前后两个符号形成一个符号。; 注释注释 宏展开时,宏展开时,;后面的注释不予展开。后面的注释不予展开。 % 表达式表达式
6、 汇编程序将汇编程序将%后面的表达式转换为数字,并在后面的表达式转换为数字,并在展开期间用这个数取代哑元。展开期间用这个数取代哑元。8leap macro cond,lab j&cond lab endm宏定义:宏定义:宏调用:宏调用:leap z, thereleap nz, here宏展开:宏展开:1 jz there 1 jnz here9宏定义:宏定义:msg macro lab,num,xyz lab&num db HELLO MR.&xyz endm宏调用:宏调用:msg ary,1,wangmsg ary,2,zhang 宏展开:宏展开:1 ary1 db HELLO MR.wa
7、ng 1 ary2 db HELLO MR.zhang 10例:定义宏指令例:定义宏指令STRG,实现存储字符串的功能,实现存储字符串的功能宏定义:宏定义:STRG MACRO STRING DB &STRING& ENDM宏调用宏调用:STRG 251 STRG % 25 1宏展开:宏展开: 1 DB 251 1 DB 2411宏定义:宏定义:msg macro count,string msg&count db string endmerrmsg macro text cntr = cntr+1 msg %cntr,text endm宏调用:宏调用:cntr=0errmsg SYNTAX
8、ERRORerrmsg INVALID OPERAND 宏展开:宏展开:1 cntr = cntr+11 msg %cntr,SYNTAX ERROR2 msg1 db SYNTAX ERROR 1 cntr = cntr+11 msg %cntr,INVALID OPERAND2 msg2 db INVALID OPERAND 12列表伪操作:列表伪操作:.LALL :在在LST清单中列出宏展开后的全部清单中列出宏展开后的全部 语句语句( (包括注释包括注释) )。.SALL :在在LST清单中不列出任何宏展开后的清单中不列出任何宏展开后的 语句。语句。.XALL :缺省的列表方式,只列出宏
9、体中产生缺省的列表方式,只列出宏体中产生 目标代码的语句。目标代码的语句。13startermacrocsname,dsnameassumecs:csname,ds:dsname,es:dsnamepushdssub ax,axpushaxmov ax,dsnamemov ds,axmov es,axendm宏调用:.xallstartercode,data1pushds1subax,ax1pushax1movax,data1movds,ax1moves,ax14建立宏库:建立宏库:macro1 MACRO哑元表 ENDM macro2 MACRO哑元表 ENDM macroN MACRO哑元
10、表 ENDMEDIT EXP.ASMEDIT EXP.ASMinclude include MACRO.MACMACRO.MACmacro1 实元表macro2 实元表macroN 实元表purge macroNEDIT MACRO . MAC调用宏库:调用宏库:15重复伪操作重复伪操作 REPTREPTREPTREPT 表达式表达式 ;重复块ENDMENDM2. 重复汇编重复汇编用于连续产生完全相同或基本相同的一组代码。用于连续产生完全相同或基本相同的一组代码。不定不定重复伪操作重复伪操作 IRPIRP/ /IRPCIRPCIRPIRP 哑元,哑元, ;重复块ENDMENDMIRPCIRPC
11、 哑元,字符串哑元,字符串 ;重复块ENDMENDM16例:例:把字符把字符AA到到ZZ的的ASCIIASCII码填入数组码填入数组TABLETABLECHAR = ACHAR = ATABLE LABEL BYTETABLE LABEL BYTE REPTREPT 26 26 DB CHAR DB CHARCHAR = CHAR+1CHAR = CHAR+1 ENDMENDM1 DB 41H1 DB 41H1 DB 42H1 DB 42H1 DB 43H1 DB 43H 1 DB 5AH1 DB 5AH汇编后:汇编后:17例:产生一组指令,将字数组例:产生一组指令,将字数组TABTAB的内容
12、入栈保存的内容入栈保存; 宏定义PUSH_TAB PUSH_TAB MACROMACRO K K PUSH TAB+k PUSH TAB+k ENDMENDM; 宏调用I=0I=0 REPTREPT 5 5 PUSH_TAB %I PUSH_TAB %II=I+2I=I+2 ENDMENDM; 宏展开2 PUSH TAB+02 PUSH TAB+02 PUSH TAB+22 PUSH TAB+22 PUSH TAB+42 PUSH TAB+42 PUSH TAB+62 PUSH TAB+62 PUSH TAB+82 PUSH TAB+818例:建立例:建立ARRAYARRAY数组数组.lall
13、.lallARRAY LABEL WORDARRAY LABEL WORD REPTREPT 7 7 DW $+2 DW $+2 ENDMENDM DW ARRAYDW ARRAYARRAY LABEL WORDARRAY LABEL WORD1 DW $+21 DW $+21 DW $+21 DW $+21 DW $+21 DW $+21 DW $+21 DW $+21 DW $+21 DW $+21 DW $+21 DW $+21 DW $+21 DW $+2 DW ARRAY DW ARRAY汇编后:汇编后:19IRPIRP REG, REG, PUSH REG PUSH REGENDM
14、ENDM1 PUSH AX1 PUSH AX1 PUSH BX1 PUSH BX1 PUSH CX1 PUSH CX1 PUSH DX1 PUSH DX汇编后:汇编后:例:例:生成一组入栈指令生成一组入栈指令汇编后:汇编后:array label bytearray label byteIRPCIRPC K, 12345 K, 12345db NO.&Kdb NO.&KENDMENDM1 db NO.11 db NO.11 db NO.21 db NO.21 db NO.31 db NO.31 db NO.41 db NO.41 db NO.51 db NO.5例:生成存储字符串的汇编语句例:
15、生成存储字符串的汇编语句203. 条件汇编条件汇编 根据根据条件条件把一段源程序包括在汇编语言程序内把一段源程序包括在汇编语言程序内或者排除在外。或者排除在外。IFIF 自变量自变量 ; 为条件 ; 自变量满足条件则汇编此块 ELSEELSE ; 自变量不满足条件则汇编此块ENDIFENDIF一般一般格式:格式:21IF IF 表达式表达式 ;表达式表达式0,则汇编IFE IFE 表达式表达式 ;表达式0,则汇编IF1IF1 ;在第一遍扫视期间满足条件IF2IF2 ;在第二遍扫视期间满足条件IFDEF IFDEF 符号符号 ;符号已定义,则汇编IFNDEF IFNDEF 符号符号 ;符号未定义
16、,则汇编IFB IFB ;自变量为空,则汇编IFNB IFNB ;自变量不为空,则汇编IFIDN IFIDN ,2 ;串1与串2相同IFDIF IFDIF ,2 ;串1与串2不同22例:求最大值放入例:求最大值放入AX宏定义宏定义:MAX MAX MACROMACRO K,A,B,C K,A,B,C LOCAL NEXT,OUT LOCAL NEXT,OUT MOV AX, A MOV AX, A IFIF K-1 K-1 IFIF K-2 K-2 CMP C, AX CMP C, AX JLE NEXT JLE NEXT MOV AX, C MOV AX, C ENDIFENDIFNEXT:
17、 CMP B, AXNEXT: CMP B, AX JLE OUT JLE OUT MOV AX, B MOV AX, B ENDIFENDIFOUT:OUT: ENDMENDM1 MOV AX, P1 MOV AX, P1 ?0002: CMP Q, AX1 ?0002: CMP Q, AX1 JLE ?00031 JLE ?00031 MOV AX, Q1 MOV AX, Q1 ?0003:1 ?0003:宏展开宏展开:1 MOV AX, P1 MOV AX, P1 ?0001: 1 ?0001: 1 MOV AX, P1 MOV AX, P1 CMP R, AX1 CMP R, AX1
18、JLE ?00041 JLE ?00041 MOV AX, R1 MOV AX, R1 ?0004: CMP Q, AX1 ?0004: CMP Q, AX1 JLE ?00051 JLE ?00051 MOV AX, Q1 MOV AX, Q1 ?0005:1 ?0005:宏调用宏调用:MAX 1, PMAX 1, PMAX 2, P, QMAX 2, P, QMAX 3, P, Q, RMAX 3, P, Q, R23; 宏展开1 SAL AX, 11 SAL AX, 12 SAL AX, 12 SAL AX, 13 SAL AX, 13 SAL AX, 1例:宏定义的递归调用例:宏定义的
19、递归调用: : POWERPOWER实现实现 ( X * 2 ( X * 2N N ) ); 宏定义POWERPOWER MACROMACRO X, N X, N SAL X, 1 SAL X, 1CNT=CNT+1CNT=CNT+1 IF CNT-N IF CNT-N POWERPOWER X, N X, N ENDIF ENDIF ENDMENDM; 宏调用CNT=0CNT=0 POWERPOWER AX, 3 AX, 324 mov ax, dividend mov bx, divisor sub cx, cxcomp: cmp ax, bx jb out sub ax, bx inc
20、cx jmp compout: mov quotient, cx endmdivide macro dividend,divisor,quotient local comp, out cnt=0 ifndef dividend cnt=1 endif ifndef divisor cnt=1 endif ifndef quotient cnt=1 endif if cnt exitm endif 例:例:25movif macro tag ifidn , rep movsb exitm endif ifidn , rep movsw exitm endif ifb rep movsb endif endm例:例:宏定义 movif b movif w movif movif a宏调用:26第七章作业第七章作业Page 278 7.1 7.3 7.5 7.7 7.9 7.14 7.16 7.17 27