第7章 宏指令_第1页
第7章 宏指令_第2页
第7章 宏指令_第3页
第7章 宏指令_第4页
第7章 宏指令_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

1、1宏汇编宏汇编 重复汇编重复汇编 条件汇编条件汇编 为用户提供更加容易、更加灵活、更加向高级语言靠拢的为用户提供更加容易、更加灵活、更加向高级语言靠拢的汇编工具。汇编工具。汇编语言程序汇编语言程序指令指令伪指令(伪操作)伪指令(伪操作)宏指令宏指令第七章第七章 高级汇编语言技术高级汇编语言技术2宏的基本概念宏的基本概念 n宏宏:源程序中一段有独立功能的程序:源程序中一段有独立功能的程序代码。代码。n宏指令宏指令:用户自定义的指令。在编程:用户自定义的指令。在编程时,将多次使用的功能用一条宏指令时,将多次使用的功能用一条宏指令来代替。来代替。3宏定义宏定义 macro_name MACRO 哑元

2、表哑元表 ; 形参形参/虚参虚参 LOCAL 标号表标号表 (宏定义体)(宏定义体) ENDM * 如果宏定义体内有一个或多个语句标号,则如果宏定义体内有一个或多个语句标号,则必须用必须用LOCAL伪操作列出所有的语句标号。伪操作列出所有的语句标号。4宏调用宏调用macro_name 实元表实元表 ; 实参实参* 实元表中的实元与哑元表中的哑元在位置上实元表中的实元与哑元表中的哑元在位置上一一对应一一对应;* 若实元数若实元数哑元数,则多余的实元无效哑元数,则多余的实元无效;* 若实元数若实元数哑元数,则多余的哑元作哑元数,则多余的哑元作“空空(NUL)”处理处理;* 对宏指令的调用必须先定义

3、后调用。宏定义对宏指令的调用必须先定义后调用。宏定义独立于逻辑段。独立于逻辑段。5宏展开宏展开n把宏定义体复制到调用宏指令的位置上,同时用把宏定义体复制到调用宏指令的位置上,同时用实元取代哑元,由实元取代哑元,由LOCAL定义的标号也定义的标号也由由?0000?FFFF替代。替代。例例7.1 保存寄存器保存寄存器宏定义:宏定义: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 ENDMENDM宏调用:宏

4、调用: savereg宏展开:宏展开: + push ax+ push ax + push bx + push bx + push cx + push cx + push dx + push dx + push si + push si + push di + push di6例例7.2 两个字相乘两个字相乘宏定义:宏定义:multiplymultiply MACROMACRO opr1opr1, ,opr2opr2, ,resultresult push dx push dx push ax push ax mov ax, mov ax, opr1opr1 imul imul opr2opr

5、2 mov mov resultresult, ax, ax pop ax pop ax pop dx pop dx ENDMENDM宏调用:宏调用: multiplymultiply cxcx, , varvar, , xyzbxxyzbx宏展开宏展开(无语法错误无语法错误):+ push dx+ push dx+ push ax+ push ax+ mov ax, + mov ax, cxcx+ imul + imul varvar+ mov + mov xyzbxxyzbx, ax, ax+ pop ax+ pop ax+ pop dx+ pop dx7例例7.3 显示字符显示字符宏定义

6、:宏定义:Display macro char mov dl,char mov ah,02h int 21hendm宏调用宏调用Display aDisplay 0dh宏展开宏展开+mov dl, a+mov ah,02h+int 21h8例例7.4 如果宏指令名与指令助记符或伪操作名相如果宏指令名与指令助记符或伪操作名相同,宏指令的优先级最高。同,宏指令的优先级最高。宏定义:宏定义:addadd MACROMACRO opr1, opr2, result opr1, opr2, result SUB opr1 SUB opr1,opr2opr2 mov result mov result,o

7、pr1opr1 ENDMENDM宏调用:宏调用:addadd ax, bx, cx ax, bx, cxpurge purge add add ; ; 取消宏定义取消宏定义add ax, bxadd ax, bx9例例7.5 求绝对值求绝对值(使用使用LOCAL伪操作伪操作)宏定义:宏定义:absol MACRO operabsol MACRO oper LOCAL LOCAL nextnext cmp oper, 0 cmp oper, 0 jge next jge next neg oper neg opernextnext: : ENDM ENDM宏调用:宏调用:absol varabs

8、ol varabsol bxabsol bx宏展开:宏展开: + cmp var, 0+ jge ?0000+ neg var+ ?0000: + cmp bx, 0+ jge ?0001+ neg bx+ ?0001: 10宏汇编操作符宏汇编操作符 &符号符号1 & 符号符号2 ; 宏展开时宏展开时, ,合并前后两个符号形成一个符号。合并前后两个符号形成一个符号。leap leap macromacro cond, lab cond, lab j j& &cond labcond lab endmendm宏定义:宏定义:宏调用:宏调用:leap z, ther

9、eleap z, thereleap nz, hereleap nz, here宏展开:宏展开:+ jz there+ jz there + jnz here+ jnz here例例7.57.511Msggen Msggen macromacro lab, num,xyz lab, num,xyz lab lab& &num db hello num db hello & &xyzxyz endmendm宏定义:宏定义:宏调用:宏调用:Msggen msg,1,world宏展开:宏展开:+ msg1 db hello world+ msg1 db hello w

10、orld例例7.67.612dif macro x, ydif macro x, y mov al mov al,x x sub al sub al,y y endm endmDifsqr macro opr1Difsqr macro opr1,opr2opr2,resultresult dif opr1dif opr1,opr2opr2 imul al imul al mov result mov result,axax endm endm例例7.7 7.7 宏定义:宏定义:宏调用:宏调用:Difsqr cl,dl,var宏展开:宏展开:+ mov al+ mov al,clcl+ sub

11、al+ sub al,dldl+ imul al+ imul al+ mov var+ mov var,axax宏定义中可以使用宏调用,但必须先定义。宏定义中可以使用宏调用,但必须先定义。13宏汇编操作符宏汇编操作符 %表达式表达式 ; 宏展开时,宏展开时,计算表达式的值,代替对应的哑元。计算表达式的值,代替对应的哑元。msg macro count, stringmsg macro count, string msg&count db string msg&count db string endm endmErrmsg macro textErrmsg macro text

12、cntr=cntr+1 cntr=cntr+1 msgmsg % % cntr, textcntr, text endm endm宏定义:宏定义:宏调用:宏调用:Cntr=0Cntr=0Ermsg Syntax errorErmsg Syntax errorErrmsg Errmsg Stack overflow 宏展开:宏展开:+msg1 db Syntax error+msg1 db Syntax error+ m s g 2 d b + m s g 2 d b S t a c k overflow 例例7.87.814宏调用时,实元少于哑元的处理方法:宏调用时,实元少于哑元的处理方法:1

13、、缺少的实元用作源操作数定义:Msg macro opr3, opr2, opr1 mov dx, opr1 add dx, opr2 mov opr3, dx endm调用:msg ax, bx 展开: + mov dx, 0 + add dx, bx + mov ax, dx15宏调用时,实元少于哑元的处理方法:宏调用时,实元少于哑元的处理方法:2、缺少的实元用作目的操作数定义:Msg macro opr1, opr2, opr3 mov dx, opr1 add dx, opr2 mov opr3, dx endm调用:msg ax, bx 展开: + mov dx, ax + add

14、dx, bx + mov bp+0, dx16宏调用时,实元少于哑元的处理方法:宏调用时,实元少于哑元的处理方法:3。缺少的实元用作指令码定义:Msg macro opr1, opr2, opr3 mov dx, opr1 add dx, opr2 opr3 ax, bx endm调用:msg ax, bx 源程序编译时将报告出错。17宏调用与子程序调用的区别:宏调用与子程序调用的区别:子程序:在程序执行期间被调用,只占用自身大小的一段空间。子程序:在程序执行期间被调用,只占用自身大小的一段空间。主程序主程序call call sub1sub1call call sub1sub1call ca

15、ll sub1sub1子程序子程序 sub1sub1 ret ret18 宏调用:在汇编期间被展开宏调用:在汇编期间被展开,每调用一次就把宏定义体展开一次每调用一次就把宏定义体展开一次。宏定义宏定义宏调用宏调用宏展开宏展开Q macro x,yQ macro x,y endmendm Q a,b Q a,b Q c,d Q c,d Q e,f Q e,f 子程序子程序:优点:模块化,节省内存,可被多次调用,编程效率高。优点:模块化,节省内存,可被多次调用,编程效率高。缺点:额外开销(保存返回地址,计算转向地址,传递参缺点:额外开销(保存返回地址,计算转向地址,传递参 数等)大,增加了执行时间。

16、适用于子功能代码较数等)大,增加了执行时间。适用于子功能代码较 长、调用比较频繁的情况。长、调用比较频繁的情况。宏调用宏调用:优点:参数传送简单,执行效率高。优点:参数传送简单,执行效率高。缺点:不节省空间,适用于子功能代码较短、传参较多的缺点:不节省空间,适用于子功能代码较短、传参较多的 情况。情况。20子程序与宏指令举例子程序与宏指令举例要求:求成绩数组中某个成绩的名次。要求:求成绩数组中某个成绩的名次。1、编写子程序求名次并调用;、编写子程序求名次并调用;2、编写宏指令求名次并调用。、编写宏指令求名次并调用。211、编写子程序并调用、编写子程序并调用DATA SEGMENT SCORE

17、DB ,98, LEN EQU $-SCORE RANK DB LEN DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART: MOV AX, DATA MOV DS, AX MOV AL, SCORE2 LEA SI, SCORE MOV CX, LEN CALL MINGCI MOV RANK2, AH MOV AX, 4C00H INT 21H 22子程序实现部分子程序实现部分;说明文档说明文档MINGCI PROC NEAR MOV AH, 1NEXT:CMP AL, SI JAE CON ADD AH, 1 CON:INC

18、SI LOOP NEXT RETMINGCI ENDPCODE ENDS END START232、编写宏指令并调用、编写宏指令并调用;宏定义,位于源程序开头,先定义后调用宏定义,位于源程序开头,先定义后调用MINGCI MACRO ARRAY, NUMBER, SCORE, ORDER LOCAL AGA, CON PUSH SI PUSH CX MOV ORDER,1 LEA SI, ARRAY MOV CX, NUMBER AGA:CMP SCORE, SI JAE CON ADD ORDER, 1 CON:INC SI LOOP AGA POP CX POP SI ENDM24调用宏指

19、令调用宏指令DATA SEGMENT SCORE DB ,98, LEN EQU $-SCORE RANK DB LEN DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART: MOV AX, DATA MOV DS, AX MOV AL, SCORE2 MINGCI SCORE, LEN, AL, AH ;宏展开后再进行汇编宏展开后再进行汇编 MOV RANK2, AH MOV AX, 4C00H INT 21HCODE ENDS END START25宏调用后的反汇编结果:宏调用后的反汇编结果:267.2 7.2 重复汇编重复汇编

20、 用于连续产生完全相同或基本相同的一组代码。用于连续产生完全相同或基本相同的一组代码。 重复伪操作重复伪操作 REPT 格式:格式: REPT 表达式表达式 ; ; 重复块重复块 ENDM例例7.97.9X=0X=0 REPTREPT 10 10X=X+1X=X+1 DB X DB X ENDMENDM+ DB 1+ DB 1+ DB 2+ DB 2+ DB 3+ DB 3 + DB 10+ DB 10汇编后:汇编后:27不定不定重复伪操作:重复伪操作: IRP IRP格式:格式: IRP 哑元,哑元, ; ; 重复块重复块 ENDM每次重复用自变量表中的一项取代哑元,重复次数由自变量的个数决

21、定。每次重复用自变量表中的一项取代哑元,重复次数由自变量的个数决定。例例7.107.10 Data segment array label byte irp irp k, k, db k db k endm endmData endsData ends28不定不定重复伪操作重复伪操作IRPC: IRPC 哑元,字符串哑元,字符串 ; ; 重复块重复块 ENDM 每次重复用字符串中的一个字符取代哑元,重复次数等于字符串中的每次重复用字符串中的一个字符取代哑元,重复次数等于字符串中的字符数。字符数。例例7.117.11: data segmentdata segment array label bytearray label byte IRPC IRPC K, 12345 K, 12345 db NO.&K db NO.&

温馨提示

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

评论

0/150

提交评论