高级汇编语言技术(书).ppt_第1页
高级汇编语言技术(书).ppt_第2页
高级汇编语言技术(书).ppt_第3页
高级汇编语言技术(书).ppt_第4页
高级汇编语言技术(书).ppt_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

第七章 高级汇编语言技术 n第一节 宏汇编 n第二节 重复汇编 n第三节 条件汇编 第一节 宏汇编 n 子程序优点: n 子程序:节省存储空间及设计程序所花的时间,提供模块化程序设计 的条件,便于程序的调试和修改。 n n 1、宏定义和宏调用. n 宏是原程序中一段有独立功能的程序代码。 n 它只需要在原程序中定义一次,就可以多次调用它,调用时只需要用一 个宏指令语句就可以了,宏定义是用一组伪操作来实现的,其格式是: n宏指令名称 MACRO (,,) n n ENDM n其中MACRO和ENDM是一对伪操作, n宏指令名:给出该宏定义的名称,调用时就使用宏指令名来调用该宏定义, 名的第一个符号必须是字母,其后可以跟字母,数字或下划线字符。 n(1)带参宏定义 n宏指令名 MACRO 形参1,形参2, n 宏体 n ENDM n(2)无参宏定义 n宏指令 MACRO n宏体 nENDM 宏定义体:是一组有独立功能的程序代码。 参数: 宏中的形参(虚参),每个哑元之间用“,”隔开,经宏定义 后的宏指令就可以在原程序中调用,这种对宏指令的调用称 为宏调用 ; 格式: 宏指令名 (,,) 参数:实在参数,实元表,每一项用“,”隔开。 当源程序被汇编时,汇编程序将对每个宏调用做宏展开,宏 展开就是用宏定义取代源程序中的宏指令名,而且用实元取 代宏定义中的哑元; 在取代时,实元和哑元是一一对应的,第一个实元 取代第一个哑元; 实元的个数应该和哑元的个数相等; 若实元个数大于哑元个数,则多余的实元不予考虑; 若实元个数小于哑元个数,则多余哑元作“空”处理 。 例1:用宏指令定义两个字操作数相乘,得到一个16位的第三个操作数,作为 结果。 宏定义: mult macro opr1,opr2,result push dx ;cx var xyzbx push ax ;240 bx save mov ax, opr1 imul opr2 mov result,ax pop ax pop dx endm 宏调用: mult cx , var ,xyzbx mult 240, bx ,save 宏展开: 1 push dx 1 push ax 1 mov ax ,cx 1 imul var 1 mov xyzbx,ax 1 pop ax 1 pop dx Mult macro opr1,opr2,result push dx push ax mov ax, opr1 imul opr2 mov result,ax pop ax pop dx endm mult 240, bx ,save 1 push dx 1 push ax 1 mov ax ,240 1 imul bx 1 mov save ,ax 1 pop ax 1 pop dx Mult macro opr1,opr2,result push dx push ax mov ax, opr1 imul opr2 mov result,ax pop ax pop dx endm 汇编程序在所展开的指令前加上“1”号以示区别。 从上面的例子可以看出:由于宏指令可以带哑 元,调用时可以用实元取代,这就避免了子程序因 变量传送带来的麻烦,使宏汇编的使用增加了灵活 性。 实元:常数、寄存器、存储单元名以及用寻址 方式能找到地址或表达式等。 还可为指令的操作码或操作码的一部分。 “子”工作方式与“宏”不同: 子程序是在程序执行期间由主程序调用的 ,它只占有它自身大小的一个空间; 宏调用则是在汇编期间展开的,每调用一 次就把宏定义体展开一次,因而它占有的存储空 间与调用次数有关,调用次数越多则占有的存储 空间就越大。 所以宏汇编可以免去执行时间上的额外开销 ,但如果宏调用次数较多的话,则其空间上的开 销也是应该考虑的因素。 一般的说,由于宏汇编可能占用较大的空 间,所以代码较长的功能段往往使用子程序而不 用宏汇编;但那些较短的且变元较多的功能段则 使用宏汇编就更加合理。 2、宏指令举例. (1)宏定义可无变元 例2、savereg macro push ax push bx push cx push dx push si push di endm 宏调用: savereg 宏展开则将定义体的内容全部列出。 (2)变元可以是操作码 例3、f00 macro p1,p2,p3 mov ax ,p1 p2 p3 endm 宏调用:foo wordvar ,inc ,ax 宏展开:1 mov ax, wordvar 1 inc ax (3)变元可以是操作码的一部分,但在宏定义体中必须用&作分 隔符。 &是一个操作符,它把&前后两个符号合并而形成一个符 号,这个符号可以是操作码、操作数或是一个字符串。 例4、 宏定义: leap macro cond ,lab j&cond lab endm 宏调用: leap z, there 宏展开: 1 jz therre 宏调用: leap nz, here 宏展开: 1 jnz here 例5、 宏定义:fo macro p1 jmp ta&p1 endm 宏调用:fo wordvar 宏展开:1 jmp tawordvar (4)变元是ASCII串的情况. 例6: 宏定义: msggen macro lab ,num,xyz lab&num db hello mr. &xyz endm 宏调用: msggen msg ,1 , taylor 宏展开: 1 msg1 db hello mr. taylor (5) 宏指令名可以与指令助记符或伪操作名相同,在这种情况 下,宏指令的优先级最高,而同名的指令或伪操作失效。 伪操作PURGE可以用来在适当的时候取消宏定义, 以便恢复指令的原始含义。 例7、 宏定义:ADD MACRO OPR1 ,OPR2 ,RESULT ENDM 宏调用: add xx , yy , zz . purge add 在宏调用后,用PURGE伪操作取消宏定义,以便恢复 ADD指令的原始含义,在PURGE ADD后面所用的ADD指令 ,则服从机器指令的定义。 PURGE伪操作可同时取消多个宏定义,宏指令名词以“, ”分隔。 (6)LOCAL伪操作的使用. 在程序中多次调用该宏定义时,展开后会出现标号的多重定义,为 此,系统提供了LOCAL伪操作, 格式: LOCAL 局部标号表 (list of local labels) 其中局部标号表内的各标号之间用“,”隔开。 汇编程序对LOCAL伪操作的局部标号表中为每一个局部标 号建立唯一的符号(用?0000?fff)以代替在展开中存在 的每个局部标号。 注意: LOCAL只能用在宏定义体内,而且是MACRO后第一个语 句且在MACRO和LOACL 间不允许有注释,分号。 例8、 宏定义: absd macro oper local next cmp oper,0 jge next neg oper next: endm 宏调用: absd var absd bx 宏展开: 1 cmp var, 0 1 jge ?0000 1 neg var 1?0000: 1 cmp bx ,0 1 jge ?0001 1 neg bx 1 ?0001: 宏定义: absd macro oper local next cmp oper, 0 jge next neg oper next: endm (7)宏定义允许嵌套,但必须先定义后调用。 宏定义: dif macro x ,y 宏调用: difsqr var1,var2,var3 mov ax ,x 宏展开:1 push dx sub ax ,y 1 push ax endm 1 dif var1,var2 difsqr macro opr1 ,opr2 ,result 2 mov ax ,var1 push dx 2 sub ax ,var2 push ax 1 imul ax dif opr1 ,opr2 1 mov var3 ,ax imul ax mov result,ax 1 pop ax pop ax 1 pop dx pop dx 在LIST清单中可看到宏展开结果 endm (8)宏定义体内可以包含宏定义. 宏定义: defmac macro macnam , operator macnam macro x,y,z push ax mov ax,x operator ax,y mov z ,ax pop ax endm 宏调用: defmac addition , add 宏展开: 1 addition macro x ,y ,z push ax mov ax,x add ax ,y mov z ,ax pop ax endm 形成加法宏定义。其中MACNAM是内层宏定义名,但又是外层宏定义的哑元, 所以当调用DEFMAC时,就形成一个宏定义。 (9)宏定义中的变元可以使用伪操作%,格式:% expression. 汇编程序把跟在%之后的表达式的值转换成当前基数下的数, 在展开期间,用这个数来取代哑元。 宏定义: msg macro count , string msg & count db string endm 宏调用: cntr=0 text.msg macro count ,string errmsg syntax error errmsg invalid operand 宏展开: 1 msg1 db syntax error 1 msg2 db invalid operand ontr=111=2 在lst清单中,不产生代码的语句不列出。 为了能看到宏展开后所有的语句,可在源程序中增加LALL语句。 展开第一层: 第二层: cntr=0 cntr=0 1 cntr=cntr+1 1 cntr=cntr+1 1 msg % cntr ,syntax error 1 msg1 db ,syntax error 1 cntr=cntr+1 1 cntr=cntr+1 1 msg % cntr,mvalid operand 1 msg2 db,mvalid operand 伪操作:;语句 双分号 前面用双分号的注释,在宏展开时将不予展开; sall (xall) 汇编清单中将不列出任何展开后的信息, (lst中) 例 、将某字符串在屏幕上显示出来。 宏: init2 macro csname,dsname,ssname assume cs:csname,ds:dsname,ss:ssname,es:esname push ds sub ax,ax push ax mov ax,dsname mov ds,ax mov es,ax endm 宏: prompt macro message mov ah,9 lea dx,message int 21h endm 程序: stack segment para stackstack dw 32 dup(?) stack ends data segment paradata message1 db customer name?,13,10,$ message2 db customer address?,13,10,$ data ends 汇编清单中,宏展开列出的情况 xall 清单中只列出产生目标码的宏展开 lall 列出包括注释在内 sall 不列出任何展开信息 cseg segment para code begin proc far sall init2 cseg ,data,stack prompt message1 lall prompt message2 ret begin endp cseg ends end begin lst 代码段 cseg segment para code begin proc far sall init2 cseg ,data,stack prompt message1 lall Prompt message2 1 mov ah,9 1 Lea dx, message2 1 int 21h Ret Begin endp cseg ends End begin 第二节 重复汇编 连续重复完成相同的或几乎完全相同的一组代码,可用重复汇编。 1、重复伪操作. 格式: rept expression 重复块 endm 其中表达式的值用来确定重复块的重复次数。 例1、在数据区中定义字节类型的1、2、3、10。 X=0 汇编后: 1 db 1 Rept 10 1 db 2 X=x11 1 db 3 Db x 1 Endm 1 db 10 例2、把字符AZ的ASCII码填入数组TABLE CHAR=a 汇编后 TABLE LABEL BYTE 1 DB 61H REPT 26 1 DB 62H DB CHAR CHAR = CHAR+1 1 DB TAH ENDM 例3、用宏定义及重复伪操作把TAB,TAB+1,TAB+2,TAB+16的内容 存入堆栈。 宏定义: pushtab mavro k push tab+k endm 宏展开: 1 push tab+0 1 push tab+1 1 1 push tab+16 宏调用: I=0 REPT 17 PUSHTAB %I I=I+1 ENDM 例4、要求建立一个100字的数组,其中每个字的内容是下一个字的地址,而 最后一个字的内容是第一个字的地址。 ARRAY LABEL WORD 汇编后: REPT 99 1 DW $+2 重复 DW $+2 1 DW $+2 ENDM DW ARRAY 1 DW $+2 DW ARRAY 2、不重复伪操作。 (1)IRP伪操作 IRP DUMMY, 重复块 ENDM 汇编程序把重复块的代码重复几次,每次重复把重复块的哑元用自变 量表中的一项来取代,下一次取代下一项,重复次数由自变量表中的自变 量个数来确定。 自变量表必须用尖括号括起,它可以是常数、符号、字符串等,IRP 、IRPC、REPT,不一定用在宏定义中。 例5、IRP X, DB X ENDM 汇编后得: 1 DB 1 1 DB 2 1 DB 10 例6、 IRP REG , PUSH REG ENDM 汇编后得: 1 PUSH AX 1 PUSH BX 1 PUSH CX 1 PUSH DX (2)IRPC 伪操作 格式为: IRPC X,0 1 2 3 4 5 6 7 DB X+1 ENDM 汇编后得: 1 DB 1 1 DB 2 1 DB 8 例8、 IRPC K ,A B C D PUSH K & X ENDM 汇编后得: 1 PUSH AX 1 PUSH BX 1 PUSH CX 1 PUSH DX 汇编程序能根据条件把一段源程序包括在汇编语言程序内或者 把它排除在外,这里就用到条件伪操作。 条件伪操作的一般格式是: IF XX ARGUMENT 自变量满足条件“满足此块” ELSE 不变给定条件时汇编此块。 ENDIF XX表示条件如下: 第三节 条件汇编 IF expression 汇编程序求出表达式的值,如此值不为0则满足条件; IFE expression 如求出表达式的值为0则满足条件; IF DEF symbol 如符号已在程序中定义,或者已用EXTRN伪操作说明该 符号是在外部定义的,则满足条件; IF NDEF symbol 如符号未定义或未通过EXTRN说明为外部符号,则满足 条件; IF NB 如自变量不为空,则满足条件。 IFB 如自变量为空,则满足条件。 IF IDN , 如字符串与相同,满足条件 IF DIF ,如字符串与不相同,满足条件 条件伪操作可以用在宏定义体内,也可以用在宏定义体外,也润许嵌 套任意次。 例1、宏指令MAX把三个变元中的最大值放在AX中,而且使变元数不同 时产生不同的程序段。 宏定义: 调用: MAX 1 , P MAX MACRO K,A,B,C MAX 2 , P,Q LOCAL NEXT,OUT MAX 3 , P,Q,R MOV AX ,A 宏展开: IF K-1 MAX 1 , P IF K-2 1 MAX AX , P CMP C ,AX 1?0002: out JLE NEXT MAX 2, P,Q MOV AX ,C 1 MOV AX,P ENDIF 1?0002:CMP Q,AX NEXT: CMP B ,AX next JLE ?0003 JLE OUT MOV AX ,Q MOV AX ,B 1?0003: out ENDIF MAX 3,P,Q,R OUT: ENDM 1 MOV AX,P 1 CMP R,AX 1 JLE ?0004:next 1 mov AX,R 1?0004:next cmp Q,AX 1 MOV AX,Q 1?0005:out 例2、宏指令GOTO L, X, REL ,Y (其中 REL=Z, NZ,L,NL)

温馨提示

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

评论

0/150

提交评论