版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第6章高级汇编语言技术一、宏汇编 宏定义是用一组伪操作来实现的。其格式是: macro_name MACRO dumny_parameter_list . (宏定义体) ENDM其中MACRO和ENDM是一对伪操作.这对伪操作之间是宏定义体-是一组独立功能的程序代码.宏指令名(macro_name)给出该宏定义的名称,调用时就使用宏指令名来调用该宏定义.其中哑元表(dumny_parameter_list)给出了该宏定义中所用到的形式参数(或称虚参),每个哑元之间用逗号隔开. 经宏定义后的宏指令就可以在源程序中调用.这种对宏指令的调用称为宏调用,宏调用的格式是: macro_name actu
2、al_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.变元可以是操作码的一部分,但在宏定义体中必须用&作为分隔符.宏定义:
3、 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 HEL
4、LO MR.&XYZ ENDM宏调用: MSGGEN MSG,1,TAYLOR宏展开: + MSG1 DB HELLO MR.TAYLOR6.宏指令名可以与指令助记符或伪操作名相同,在这种情况下,宏指令的优先级最高,而同名的指令或伪操作就失效了.伪操作PURGE可以用来在适当的时候取消宏定义,以便恢复指令的原始含义.宏定义: ADD MACRO OPR1,OPR2,RESULT . ENDM宏调用: . ADD XX,YY,ZZ PURGE ADD .在宏调用后,用PURGE伪操作取消定义,以便恢复ADD指令的原始含义,在PURGE ADD后面所用的ADD指令,则服从机器指令的定义. PURG
5、E伪操作可同时取消多个宏操作,此时各宏指令之间用逗号隔开.7.LOCAL伪操作的使用.宏定义体内允许使用标号,如:宏定义: ABSOL MACRO OPER CMP OPER,O JGE NEXT NEG OPER NEXT: ENDM如果程序中多次调用该宏定义时,展开后会出现标号的多重定义.为此系统提供了LOCAL伪操作,其格式是 LOCAL list of local labels其中局部标号表内的各标号之间用逗号隔开.汇编程序对LOCAL伪操作的局部标号表中的每一个局部标号建立唯一的符号(用?0000?FFFF)以代替在展开中存在的每个局部标号.必须注意,LOCAL伪操作只能用在宏定义体
6、内,而且它必须是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.宏定义中允许使用宏调用,其限制条件是:必须
7、先定义后调用宏定义: 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 E
8、NDM 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
9、 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 . +
10、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=ATABLE LABEL BYTE REPT 26 DB
11、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, . (重复块) ENDM汇编程序把重复块的代码重复几次,
12、每次重复把重复块中的哑元用自变量表中的一项来取代,下一次取代下一项,重复次数由自变量表中的自变量个数来确定.自变量表必须用尖括号括起,它可以是常数,符号,字符串等.例1: IRP X, DB X ENDM汇编后得: + DB 1 + DB 2 . + DB 10例2: IRP REG, PUSH REG ENDM汇编后得: + PUSH AX + PUSH BX + PUSH CX + PUSH DX (2)IRPC伪操作格式是: IRPC dummy,string(或) . (重复块) ENDMIRPC和IRP类似,但自变量表必须是字符串.重复次数由字符串中的字符个数确定,每次重复用字符串中
13、的下一个字符取代重复块中的哑元.例:例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自变量必须在汇编程序第一启遍扫视后就成
14、为确定的数值.条件伪操作中的XX表示条件如下: IF expression 汇编程序求出表达式的值,如此值不为0则满足条件. IFE expression 如求出表达式的值为0则满足条件. IFDEF symbol 如符号已在程序中定义,或者已用EXTRN伪操作说明该符号是在外部定义的,则 满足条件. IFNDEF symbol 如符号未定义或未通过EXTRN说明为外部符号则满足条件. IFB 如自变量为空则满足条件 IFNB 如自变量不为空则满足条件 IFIDN , 如果字符串和字符串相同,则满足条件. IFDIF , 如果字符串和字符串不相同,则满足条件.条件伪操作可以用在宏定义体内,也可
15、以用在宏定义体外,也允许嵌套任意次.例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
16、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 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 A
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《电子电路综合设计》课程教学大纲
- 2024年出售旧砖楼板合同范本
- 2024年出口风扇采购合同范本
- 2024-2025学年度第一学期阶段检测试题(八年级 地理)
- 受伤人员的紧急救护培训
- 创伤失血性休克护理
- 古诗文默写集合
- 医护沟通与医疗安全
- 2023-2024学年广州七年级语文上学期开学摸底考试卷(含答案)
- 《页岩气的研究报告》课件
- 学校安全隐患排查整治表
- 人音版初中音乐 九年级上册 中考一轮复习课件
- 施工机器人应用方案
- 肝硬化食管胃底静脉曲张破裂出血的诊治
- 概率论(华南农业大学)智慧树知到课后章节答案2023年下华南农业大学
- 大学生幸福感调查报告-2
- 一日生活中幼儿自主探究行为的表现及支持策略研究
- 第8课 用制度体系保证人民当家做主
- 我们的出行方式 (教学设计)2022-2023学年综合实践活动四年级上册 全国通用
- 物品放行操作规程及放行条样板
- 新苏教版六年级上册科学全册知识点(精编)
评论
0/150
提交评论