高级汇编技术.ppt

上传人:rrsccc 文档编号:8988329 上传时间:2021-01-28 格式:PPT 页数:34 大小:296.48KB
返回 下载 相关 举报
高级汇编技术.ppt_第1页
第1页 / 共34页
高级汇编技术.ppt_第2页
第2页 / 共34页
高级汇编技术.ppt_第3页
第3页 / 共34页
高级汇编技术.ppt_第4页
第4页 / 共34页
高级汇编技术.ppt_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《高级汇编技术.ppt》由会员分享,可在线阅读,更多相关《高级汇编技术.ppt(34页珍藏版)》请在三一文库上搜索。

1、6 高级汇编技术,本章学习要点,1、掌握宏汇编的基本概念 2、理解宏定义、宏调用、宏展开的特点和使用过程 3、了解重复汇编的基本概念和使用 4、了解条件汇编的基本概念和使用,6 高级汇编技术,6.1 宏汇编,6.2 重复汇编,6.1.1 宏定义、宏调用和宏展开,6.1.2 形参和实参,6.1.3 伪指令PURGE,6.1.4 伪指令LOCAL,6.1 宏汇编,什么是宏? 宏(或宏指令)是源程序中一段有独立功能的程序代码,只需定义一次,可以多次调用。 为什么使用宏汇编? 在编制汇编语言程序过程中,有些功能程序段需要多次重复使用,所不同的只是参与操作的操作数。 为了减少编程的工作量,通常采用两种方

2、法: 将程序段编写为独立的子程序 将程序段定义成宏,6.1.1 宏定义、宏调用和宏展开,1.宏定义 用伪指令MACRO/ENDM实现,其语句格式是: 宏指令名 MACRO 形参1,形参2,形参n 宏体 ENDM 例如,BCD码和ASCII码之间的转换,可将AL中的内容左移或右移定义成宏指令。,说明,宏指令名是该宏定义的名称。调用时使用宏指令名对该宏定义进行调用。 宏指令符合标识符规定。宏指令名不能重复,但可以和源程序中的其他变量、标号、指令、伪指令名相同,在这种情况下宏指令的优先级最高。 MACRO必须与ENDM成对出现。MACRO标识宏定义的开始 。 形式参数(即形参,也称哑元、虚参)是可选

3、项,宏可以不带参数;带参数时,多个形参间用逗号分隔。形参的规定与对标识符的规定是一致的 。,1.宏定义 假设左移4位: SHIFT MACRO MOV CL,4 SAL AL,CL ENDM 2.宏调用 宏调用的格式为: 宏指令名 实参1,实参2,实参n,对于上例的宏定义,编程时宏调用语句为 SHIFT 3.宏展开 宏展开将宏指令语句用宏定义中宏体的程序段目标代码替换。汇编源程序时,宏汇编程序将对每条宏指令语句进行宏展开,用实参替代相应的形参,对宏体目标代码作相应改变。,例6.1,例6.1 将两个用压缩的BCD码表示的4位十进制数相加,结果存入RESULT单元中 。 ;对两数相加功能进行宏定义

4、 BCDADD MACRO VARX,VARY,RESULT MOV AL,VARX ADD AL,VARY DAA ;低位相加、调整 MOV RESULT,AL MOV AL,VARX1 ADC AL,VARY1 DAA ;高位相加、调整 MOV RESULT1,AL ENDM,DATA SEGMENT A1 DB 30H,11H A2 DB 79H,47H A3 DB 2 DUP(?) B1 DB 32H,23H B2 DB 71H,62H B3 DB 2 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:PUSH DS

5、MOV AX,0 PUSH AX,MOV AX,DATA MOV DS,AX BCDADD A1,A2,A3 ;宏调用 BCDADD B1,B2,B3 ;再次宏调用 RET CODE ENDS END START 经宏展开后: PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV AL,A1, ADD AL,A2 DAA ;低位相加、调整 MOV A3,AL MOV AL,A11 ADC AL,A21 DAA ;高位相加、调整 MOV A31,AL ;对两数相加功能进行宏定义 MOV AL,B1 ADD AL,B2 DAA ;低位相加、调整 MO

6、V B3,AL MOV AL,B11 ADC AL,B21, DAA ;高位相加、调整 MOV B31,AL 宏汇编程序在所展开的指令前标识以号以示区别。 宏定义允许嵌套。在宏定义中可以使用宏调用,但必须先定义这个宏调用。,例6.3,例6.3 有宏定义如下: DIFML MACRO OPRAND,OPRAT OPRAND MACRO X,Y,Z PUSH AX MOV AX,X OPRAT AX,Y MOV Z,AX POP AX ENDM ENDM,对宏定义DIFML进行宏调用: DIFML ADDITION,ADD 经宏展开: ADDITION MACRO X,Y,Z PUSH AX MO

7、V AX,X ADD AX,Y MOV Z,AX POP AX ENDM 为实现对ADDITION的调用,需要连续两条宏调用语句: DIFML ADDITION,ADD ADDITION N1,N2,N3,6.1.2 形参和实参,宏定义中可以不带任何形参,宏调用时不需提供实参(即使有实参,也会不予处理),宏展开后宏体中的所有指令不作修改原样插入到宏调用的宏指令处。如例6.4。 形参可以是操作码或操作数的一部分,但在宏定义体中必须使用分隔符&,即&是操作符,在宏定义中可作为形参的前缀,展开时把&前后的两个符号连接起来,形成操作码、操作数或字符串。&只能出现在宏定义中。如例6.6,在宏定义中,形参

8、可以出现在宏体的任何位置,可以是操作码或操作数。如例6.3中OPRAT。 伪操作%不能出现在形参的前面,通常用在宏调用中,将跟在它后面的表达式的值转换成以当前基数下的数,在宏展开时,用转换后的值代替形参。如例6.8。 在宏调用中的实参如果自身是带有间隔符(如逗号、空格),必须使用文本操作符将它括起来,作为单一的完整的实参。如例6.9。,例6.4,例6.4 将寄存器内容移位的操作定义为宏指令,并 宏调用。设一个参数时,移位次数为参数CN: SHIFT MACRO CN MOV CL,CN SHL AX,CL ENDM 宏调用时提供相应的实参数值: SHIFT CONST 设两个参数时,参数为寄存

9、器和移位次数: SHIFT MACRO CN,R MOV CL,CN SHL R,CL ENDM 宏调用提供移位次数和寄存器:SHIFT CONST,REG,例6.6,例6.6 宏定义: SHIFT MARCO X,Y,Z MOV CL,X S&Z Y,CL ENDM 形参Z是操作码的一部分。宏汇编中规定,若宏定义体中的形 参没有适当的分隔符,就不被当作形参,调用时也不会被实 参代替。上例被调用时: SHIFT 4,AL,AL SHIFT 6,BX,AR 则宏展开时的目标代码: MOV CL,4 SAL AL,CL MOV CL,6 SAR BX,CL,例6.8,例6.8 宏定义: MAKER

10、 MACRO COUNT,STR MAKER&COUNT DB STR ENDM ERRMA MACRO TEXT CNTR=CNTR1 MAKER %CNTR,TEXT ENDM,经宏调用: CNTR=0 ERRMA SYNTAX ERROR ERRMA INVALID OPERAND 宏展开: MAKER1 DB SYNTAX ERROR MAKER2 DB INVALID OPERAND ,例6.9,例6.9 在程序设计中,对堆栈段的定义语句基本相同,只是堆栈段的长度和初值不同。所以可以先定义一个宏(放在宏库中),供随时取用,为编程带来很大方便。宏定义如下: MSTACK MACRO X

11、YZ STACK SEGMENT STACK DB XYZ STACK ENDS ENDM 宏调用时: MSTACK 100 DUP(?) 宏展开为: STACK SEGMENT STACK DB 100 DUP(?) STACK ENDS,6.1.3 伪指令PURGE,宏指令名可以和源程序中的其他变量名、标号、指令助记符、伪操作名相同,此时宏指令的优先级别最高,使其他同名的指令或伪操作无效。为了使这些指令或伪指令恢复功能,服从机器指令的定义,宏汇编程序提供了伪操作PURGE,用来在适当的时候取消宏定义。 PURGE伪指令的一般格式是: PURGE 宏定义名, 方括号表示PURGE可以取消多个

12、宏定义,宏名之间用逗号隔开。如宏定义: SUB MACRO VARX,VARY,RESULT ENDM 宏调用:SUB X,Y,Z PURGE SUB “PURGE SUB”语句后的SUB恢复减法功能。,6.1.4 伪指令LOCAL,宏定义体内可以使用标号。对于使用了标号的宏定义,若多次调用,势必产生标号的多重定义,汇编时出错。解决这一问题可使用伪指令LOCAL,其一般格式为: LOCAL 局部标号1,局部标号2, 宏汇编程序将为标号分别生成格式为“?XXXX”的唯一的符号以代替各局部标号。XXXX代表四位十六进制数0000FFFF。这样,在汇编源程序中,避免了多次宏调用时生成的标号重复。 注

13、意:LOCAL伪操作只能用在宏定义体内,而且必须是MACRO伪操作后的第一个语句,在MACRO与LOCAL不能出现注释和分号标志,例6.10,例6.10 定义取绝对值的宏指令如下: ABS MACRO OPS LOCAL PLUS CMP OPS,0 JGE PLUS NEG OPS PLUS:MOV AX,OPS ENDM 宏调用: ABS CX MOV BX,AX ABS DX,宏展开后的指令为: CMP CX,0 JGE ?0000 NEG CX ?0000:MOV AX,CX MOV BX,AX CMP DX,0 JGE ?0001 NEG DX ?0001: MOV AX,DX,6.

14、2 重复汇编,6.2.1 定重复伪指令REPT,6.2.2 不定重复伪指令IRP,6.2.3 不定重复字符伪指令IRPC,6.2.1 定重复伪指令REPT,其一般格式为: REPT 表达式 (重复块 ) ENDM 其中,REPT和ENDM必须成对出现,两者间的重 复块是要重复汇编的部分。表达式的值用来表示重 复块的重复汇编次数。定重复伪操作不一定要用在 宏定义体内。,例6.11,例6.11 有下列语句: NUM=0 REPT 10 NUM=NUM1 DB NUM ENDM 汇编后,将数据1,2,3,10分配给十个连续 的字节单元: DB 1 DB 2 DB 3 DB 10,6.2.2 不定重复

15、伪指令IRP,其一般格式为: IRP 形参,参数1,参数2, (重复块) ENDM 此伪指令重复执行重复块中所包含的语句,重复的次数由参数表中的参数个数决定。重复汇编时,依次用参数表中的参数取代形参,直到表中的参数用完为止。参数表中的参数必须用两个三角号括起来,参数可以是常数、符号、字符串等,各参数间用逗号隔开。,例6.13,例6.13 多次将AX、BX、CX、DX寄存器内容压栈,宏定义如下: PUSHR MACRO IRP REG,AX,BX,CX,DX PUSH REG ENDM ENDM 汇编后: PUSH AX PUSH BX PUSH CX PUSH DX,6.2.3 不定重复字符伪

16、指令IRPC,其语句格式为: IRPC 形参,字符串(或字符串) (重复块) ENDM 此伪指令重复执行重复块中的语句,重复汇编的次数等于字符串中字符的个数。每次重复执行时,依次用字符串中的一个字符取代形参,直到字符串结束。可见IRPC伪指令与IRP伪指令类似,只是IRPC用字符串(其三角括号可以有也可以无)代替了IRP伪指令中的参数表。,例6.15,例6.15 如例6.13可用IRPC实现: PUSHR MACRO IRPC REG,ABCD PUSH REG&X ENDM ENDM 同样,汇编后也可得到: PUSH AX PUSH BX PUSH CX PUSH DX,本章小结,本章主要介绍了高级汇编技术中的宏汇编。在编写源程序的过程中,使用宏汇编和使用子程序一样,都能减少程序员的工作量,因而也能减少程序出错的可能性。本章阐述了两者间的区别。对于宏指令,应该掌握宏定义和宏调用,明确宏展开的形式,理解参数的传递,并能正确地使用参数。另外,还应掌握一些常见的伪指令和常用的宏操作符及其正确使用。掌握并能够应用相应的重复汇编伪指令。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1