欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    第7章高级汇编技术.doc

    • 资源ID:50631492       资源大小:35KB        全文页数:21页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第7章高级汇编技术.doc

    第6章高级汇编语言技术一、宏汇编 宏定义是用一组伪操作来实现的。其格式是: macro_name MACRO dumny_parameter_list . (宏定义体) ENDM其中MACRO和ENDM是一对伪操作.这对伪操作之间是宏定义体-是一组独立功能的程序代码.宏指令名(macro_name)给出该宏定义的名称,调用时就使用宏指令名来调用该宏定义.其中哑元表(dumny_parameter_list)给出了该宏定义中所用到的形式参数(或称虚参),每个哑元之间用逗号隔开. 经宏定义后的宏指令就可以在源程序中调用.这种对宏指令的调用称为宏调用,宏调用的格式是: macro_name actual_parameter_list实元表(actual_parameter_list)中的每一项为实元,相互之间用逗号隔开.1.宏定义可以无变元宏定义: SAVEREG MACRO PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI ENDM宏调用: SAVEREG2.变元可以是操作码宏定义: FOO MACRO P1,P2,P3 MOV AX,P1 P2 P3 ENDM宏调用: FOO WORD_VAR,INC,AX宏展开: + MOV AX,WORD_VAR + INC AX3.变元可以是操作码的一部分,但在宏定义体中必须用&作为分隔符.宏定义: LEAP MACRO COND,LAB J&COND LAB ENDM宏调用: . LEAP Z,THERE . LEAP NZ,HERE .宏展开: . + JZ THERE . + JNZ HERE .4.&是一个操作符,它在宏定义体中可以作为哑元的前缀,展开时可以把&前后个符号合并而形成一个符号,这个符号可以是操作码,操作数或是一个字符串宏定义: PO MACRO P1 JMP TA&P1 ENDM宏调用: FO WORD_VAR宏展开: + JMP TAWORD_VAR5.实元是ASCII串的情况宏定义: MSGGEN MACRO LAB,NUM,XYZ LAB&NUM DB 'HELLO MR.&XYZ' ENDM宏调用: MSGGEN MSG,1,TAYLOR宏展开: + MSG1 DB 'HELLO MR.TAYLOR'6.宏指令名可以与指令助记符或伪操作名相同,在这种情况下,宏指令的优先级最高,而同名的指令或伪操作就失效了.伪操作PURGE可以用来在适当的时候取消宏定义,以便恢复指令的原始含义.宏定义: ADD MACRO OPR1,OPR2,RESULT . ENDM宏调用: . ADD XX,YY,ZZ PURGE ADD .在宏调用后,用PURGE伪操作取消定义,以便恢复ADD指令的原始含义,在PURGE ADD后面所用的ADD指令,则服从机器指令的定义. PURGE伪操作可同时取消多个宏操作,此时各宏指令之间用逗号隔开.7.LOCAL伪操作的使用.宏定义体内允许使用标号,如:宏定义: ABSOL MACRO OPER CMP OPER,O JGE NEXT NEG OPER NEXT: ENDM如果程序中多次调用该宏定义时,展开后会出现标号的多重定义.为此系统提供了LOCAL伪操作,其格式是 LOCAL list of local labels其中局部标号表内的各标号之间用逗号隔开.汇编程序对LOCAL伪操作的局部标号表中的每一个局部标号建立唯一的符号(用?0000?FFFF)以代替在展开中存在的每个局部标号.必须注意,LOCAL伪操作只能用在宏定义体内,而且它必须是MACRO伪操作后的第一个语句,在MACRO和LOCAL伪操作之间还不允许有注释和分号标志. 本例中的ABSOL宏定义在考虑有多次调用可能性的情况下,应定义为: ABSOL MACRO OPER LOCAL NEXT CMP OPER,0 JGE NEXT NEG OPER NEXT: ENDM宏调用: . ABSOL VAR . ABSOL BX .宏展开: . + CMP VAR,0 + JGE ?0000 + NEG VAR +?0000: . + CMP BX,0 + JGE ?0001 + NEG BX +?0001: .8.宏定义中允许使用宏调用,其限制条件是:必须先定义后调用宏定义: DIF MACRO X,Y MOV AX,X SUB AX,Y ENDMDIFSQR MACRO OPR1,OPR2,RESULT PUSH DX PUSH AX DIF OPR1,OPR2 IMUL AX MOV RESULT,AX POP AX POP DX ENDM宏调用: DIFSQR VAR1,VAR2,VAR39.宏定义体内不仅可以使用宏调用,也可以包含宏定义.宏定义: DEFMAC MACRO MACNAM,OPERATOR MACNAM MACRO X,Y,Z PUSH AX MOV AX,X OPERATOR AX,Y MOV Z,AX POP AX ENDM ENDM其中MACNAM是内层的宏定义名,但又是外层宏定义的哑元,所以调用DEFMAC时,就形成一个宏定义.宏调用: DEFMAC ADDITION,ADD宏展开: + ADDITION MACRO X,Y,Z PUSH AX MOV AX,X ADD AX,Y MOV Z,AX POP AX ENDM形成加法宏定义ADDITION.同样,宏调用 DEFMAC SUBTRACT,SUB形成减法的宏定义.当然在形成这些宏定义后,就可以使用宏调用 ADDITION VAR1,VAR2,VAR3而展开成: + PUSH AX + MOV AX,VAR1 + ADD AX,VAR2 + MOV VAR3,AX + POP AX10.这里再介绍一个宏定义的变元中使用的伪操作%,它的格式是: %expression汇编程序把跟在%之后的表达式的值转换成当前基数下的数,在展开期间,用这个数来取代哑元.宏定义: MSG MACRO COUNT,STRING MSG&COUNT DB STRING ENDM ERRMSG MACRO TEXT CNTR=CNTR+1 MSG % CNTR,TEXT ENDM宏调用: . CNTR=0 ERRMSG 'SYNTAX ERROR' . ERRMSG 'INVALID OPERAND' .宏展开: . + MSG1 DB 'SYNTAX ERROR' . + MSG2 DB 'INVALID OPERAND' .二、重复汇编 有时汇编语言程序需要连续地重复完全相同的或者几乎完全相同的一组代码,这时可使用重复汇编。1.重复伪操作其格式为: REPT expression . (重复块) ENDM其中表达式的值用来确定重复块的重复次数,表达式中如包含外部或未定义的项则汇编指示出错. 重复伪操作并不一定要在宏定义体内,例如:X=0 REPT 10X=X+1 DB X ENDM则汇编后产生 + DB 1 + DB 2 + DB 3 . + DB 10把字符A到Z的ASCII码填入数组TABLECHAR='A'TABLE LABEL BYTE REPT 26 DB CHAR CHAR=CHAR+1 ENDM用宏定义及重复伪操作把TAB,TAB+1,TAB+2,.,TAB+16的内容存入堆栈.宏定义: PUSH_TAB MACRO K PUSH TAB+K ENDM宏调用: I=0 REPT 17 PUSH_TAB % I I=I+1 ENDM要求建立一个100D字的数组,其中每个字的内容是下一个字的地址,而最后一个字的内容是第一个字的地址.ARRAY LABEL WORD REPT 99 DW $+2 ENDM DW ARRAY 2.不定重复伪操作 (1)IRP伪操作格式是: IRP dummy,<argument list> . (重复块) ENDM汇编程序把重复块的代码重复几次,每次重复把重复块中的哑元用自变量表中的一项来取代,下一次取代下一项,重复次数由自变量表中的自变量个数来确定.自变量表必须用尖括号括起,它可以是常数,符号,字符串等.例1: IRP X,<1,2,3,4,5,6,7,8,9,10> DB X ENDM汇编后得: + DB 1 + DB 2 . + DB 10例2: IRP REG,<AX,BX,CX,DX> PUSH REG ENDM汇编后得: + PUSH AX + PUSH BX + PUSH CX + PUSH DX (2)IRPC伪操作格式是: IRPC dummy,string(或<string>) . (重复块) ENDMIRPC和IRP类似,但自变量表必须是字符串.重复次数由字符串中的字符个数确定,每次重复用字符串中的下一个字符取代重复块中的哑元.例:例1: IRPC X,0 1 2 3 4 5 6 7 DB X+1 ENDM汇编后得: + DB 1 + DB 2 . + DB 8例2: IRPC K,A B C D PUSH K&X汇编后展开形成: + PUSH AX + PUSH BX + PUSH CX + PUSH DX三、条件汇编 汇编程序能根据条件把一段源程序包括在汇编语言程序内或者把它排除在外,这里就用到条件伪操作.条件伪操作的一般格式是: IFXX argument . 自变量满足给定条件汇编此块 ELSE . 自变量不满足给定条件汇编此块 ENDIF自变量必须在汇编程序第一启遍扫视后就成为确定的数值.条件伪操作中的XX表示条件如下: IF expression 汇编程序求出表达式的值,如此值不为0则满足条件. IFE expression 如求出表达式的值为0则满足条件. IFDEF symbol 如符号已在程序中定义,或者已用EXTRN伪操作说明该符号是在外部定义的,则 满足条件. IFNDEF symbol 如符号未定义或未通过EXTRN说明为外部符号则满足条件. IFB <argument> 如自变量为空则满足条件 IFNB<argument> 如自变量不为空则满足条件 IFIDN <argu-1>,<argu-2> 如果字符串<arg-1>和字符串<arg-2>相同,则满足条件. IFDIF <argu-1>,<argu-2> 如果字符串<arg-1>和字符串<arg-2>不相同,则满足条件.条件伪操作可以用在宏定义体内,也可以用在宏定义体外,也允许嵌套任意次.例1:宏指令MAX把三个变元中的最大值放在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 ENDIF NEXT: CMP B,AX JLE OUT MOV AX,B ENDIF OUT: ENDM宏调用: MAX 1,P MAX 2,P,Q MAX 3,P,Q,R宏展开: MAX 1,P + MOV AX,P +?0001: MAX 2,P,Q + MOV AX,P +?0002:CMP Q,AX + JLE ?0003 + MOV AX,Q +?0003: MAX 3,P,Q,R + MOV AX,P + CMP R,AX + JLE ?0004 + MOV AX,R +?0004:CMP Q,AX + JLE ?0005 + MOV AX,Q +?0005:例2.宏指令GOTO L,X,REL,Y(其中REL可以是Z,NZ,L,NL等)可以根据不同情况产生无条件转移指令或比较和条件转移指令.宏定义: GOTO MACRO L,X,REL,Y JFB <REL> JMP L ELSE MOV AX,X CMP AX,Y J&REL L ENDIF ENDM宏调用: . GOTO LOOP,SUM,NZ,15 . GOTO EXIT .宏展开: . + MOV AX,SUM + CMP AX,15 + JNZ LOOP . + JMP EXIT例3.宏定义可允许递归调用,此时条件伪操作可用来结束宏递归 宏指令POWER可以用来实现X和2N相乘.这只需对X左移N次可实现,可以设COUNT为递归次数的计数值,当该数与N相等时即可结束递归调用.宏定义: POWER MACRO X,N SAL X,1 COUTN=COUT+1 IF COUNT-N POWER X,N ENDIF ENDM宏调用: COUTN=0 POWER AX,3宏展开: + SAL AX,1 + SAL AX,1 + SAL AX,1例4.宏指令BRANCH产生一条转向X的转移指令.当它相对于X的距离小于128字节时产生JMP SHORT X;否则产生JMP NEAR PTR X(X必须位于该转移指令之后,即低地址区).宏定义: BRANCH MACRO X IF ($-X) LT 128 JMP SHORT X ELSE JMP NEAR PTR X ENDIF ENDM宏调用: BRANCH X宏展开: 如X与BRANCH指令间的距离小于128时产生 + JMP SHORT X否则产生: + JMP NEAR PTR X返回目录

    注意事项

    本文(第7章高级汇编技术.doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开