汇编--学习笔记(十四)-高级汇编技术--宏
2017-05-27 14:55
253 查看
为用户提供更加容易、更加灵活、更加向高级语言靠拢的汇编工具。
一、宏汇编
二、重复汇编
三、条件汇编
2、宏指令:用户自定义的指令。在编程时,将多次使用的功能用一条宏指令来代替。
汇编语言程序
指令
伪指令(伪操作)
宏指令
一、宏定义
如果宏定义体有一个或多个标号,则必须用LOCAL伪操作列出所有的标号。
二、宏调用
实元表中实元与亚元表中的亚元在位置上一一对应;
若实元数>大于亚元数,则多余的实元无效;
若实元数<大于亚元数,则多余的亚元作“空(NULL)”处理;
对宏指令的调用必须先定义后调用。
三、宏展开
源程序被汇编时,汇编程序把宏调用展开。
也就是把宏定义复制到调用宏指令的位置上,同时用实元取代亚元。
由于LOCAL定义的标号也由??0000~??FFFF替代(因为标号展开后不能重复,所以会自动对标号编号)。
例一:保护寄存器(保护现场)
无参数
例二:两个字相乘(子程序)
有参数
例三、取消宏指令
宏指令名与指令助记符或伪操作名相同,宏指令的优先级最高。可以用PURGE取消宏指令。
例四、求绝对值(使用LOCAL伪操作)
使用了标号,所以用LOCAL的方式,如上所说用LOCAL列出所有宏定义中出现的标号。
子程序与宏优缺点比较:
子程序
优点:模块化、节省内存,可被多次调用,编程效率高。
缺点:额外开销大(保存返回地址,计算转向地址,传递参数等。),增加了执行时间。适用于子功能代码较长、调用比较频繁的情况。
宏调用
优点:参数传送简单,执行效率高。
缺点:不节省空间,适用于子功能代码较短、传参较多的情况。
例一:REPT
这里是构成了一个循环,DB每次都会形成一个数值。
例二
把字符‘A’到‘Z’的ASCII码填入数值TABLE。
每次重复时,用自变量表中的一项取代哑元,而重复次数由自变量的个数决定。
例一:IRP
这里就如同在循环中,自变量会一个一个的代替哑元。用于保存现场确实好。
例二:IRP
2、IRPC格式:
每次重复用字符串中的一个字符取代哑元,重复次数等于字符串中的字符数。
例:
在数据段产生字符区ARRAY,包括4个字符串‘NO.K’
IRP和IRPC的区别:
如果是寄存器只能用IRP
如果是字符串两种方法都可以使用
一般格式:
1、IF 表达式
功能:表达式值不为0,表示条件为真。
如果条件为真,则汇编IF之后直到ENDIF间的程序段,然后继续汇编ENDID之后的部分。
否则汇编ELSE后的程序段之后跳到ENDIF后继续汇编。
2、IFE 表达式
功能:表达式值为0表示条件为真。其它同上。
3、IF1
功能:汇编处于第一次扫描时条件为真,其它同上。
4、IF2
功能:汇编处于第二次扫描时条件为真,其它同上。
一、宏汇编
二、重复汇编
三、条件汇编
一、宏汇编
1、宏:源程序中一段具有独立功能的程序代码。2、宏指令:用户自定义的指令。在编程时,将多次使用的功能用一条宏指令来代替。
汇编语言程序
指令
伪指令(伪操作)
宏指令
一、宏定义
MACRO_NAME MACRO [亚元表] ;形参、虚参 [LOCAL 标号表] ...... (宏定义体) ...... ENDM ;这里没有宏的名字
如果宏定义体有一个或多个标号,则必须用LOCAL伪操作列出所有的标号。
二、宏调用
MACRO_NAME [实元表] ;实参
实元表中实元与亚元表中的亚元在位置上一一对应;
若实元数>大于亚元数,则多余的实元无效;
若实元数<大于亚元数,则多余的亚元作“空(NULL)”处理;
对宏指令的调用必须先定义后调用。
三、宏展开
源程序被汇编时,汇编程序把宏调用展开。
也就是把宏定义复制到调用宏指令的位置上,同时用实元取代亚元。
由于LOCAL定义的标号也由??0000~??FFFF替代(因为标号展开后不能重复,所以会自动对标号编号)。
例一:保护寄存器(保护现场)
无参数
宏定义: 宏展开: SAVEREG MACRO PUSH AX + PUSH AX PUSH BX + PUSH BX PUSH CX + PUSH CX PUSH DX + PUSH DX PUSH SI + PUSH SI PUSH DI + PUSH DI ENDM 宏调用: SAVEREG
例二:两个字相乘(子程序)
有参数
宏定义: 宏展开: MULTIPLY MACRO OPR1,OPR2,RESULT PUSH DX + PUSH DX PUSH AX + PUSH AX MOV AX,OPR1 + PUSH AX,CX IMUL OPR2 + PUSH VAR MOV RESULT,AX + PUSH XYZ[BX],AX POP AX + POP AX POP DX + POP DX ENDM 宏调用: MULTIPLY CX,VAR,XYZ[BX]
例三、取消宏指令
宏指令名与指令助记符或伪操作名相同,宏指令的优先级最高。可以用PURGE取消宏指令。
宏定义: ADD MARCO OPR1,OPR2,RESULT ...... ...... ENDM 宏调用: ...... ADD XX,YY,ZZ ;这里调用的宏定义是自己定义的ADD,自己定义的优先级要高 PURGE ADD ;取消宏定义ADD .....
例四、求绝对值(使用LOCAL伪操作)
使用了标号,所以用LOCAL的方式,如上所说用LOCAL列出所有宏定义中出现的标号。
宏定义: 宏展开: ABSOL MACRO OPER + CMP VAR,0 LOCAL NEXT ;列出所有标号 + JGE ??0000 CMP OPER,0 ;将参赛和0进行比较 + NEG VAR JGE NEXT ;如果参数大于等于0,就转到标号NEXT + ??0000: NEG OPER ;否则就取反 NEXT: ENDM 宏调用: ...... ABSOL VAR ;这里的展开是??0000: ...... ABSOL BX ;第二次调用时就是??0001: ......
子程序与宏优缺点比较:
子程序
优点:模块化、节省内存,可被多次调用,编程效率高。
缺点:额外开销大(保存返回地址,计算转向地址,传递参数等。),增加了执行时间。适用于子功能代码较长、调用比较频繁的情况。
宏调用
优点:参数传送简单,执行效率高。
缺点:不节省空间,适用于子功能代码较短、传参较多的情况。
二、重复汇编
作用:用于连续产生完全相同或基本相同的一组代码。一、重复伪操作 REPT
格式: REPT 表达式 ...... ;重复块 ENDM
例一:REPT
这里是构成了一个循环,DB每次都会形成一个数值。
汇编后: X = 0 + DB 1 REPT 10 + DB 2 X = X + 1 ...... DB X + DB 10 ENDM
例二
把字符‘A’到‘Z’的ASCII码填入数值TABLE。
汇编后: CHAR = 'A' + DB 61H TABLE LABEL BYTE + DB 62H REPT 26 + DB 63H DB CHAR + ...... CHART = CHAR+1 + DB 7AH ENDM
一、不定重复伪操作 IRP/IRPC
1、IRP格式:每次重复时,用自变量表中的一项取代哑元,而重复次数由自变量的个数决定。
IRP 哑元,<自变量表> ...... ;重复块 ENDM
例一:IRP
这里就如同在循环中,自变量会一个一个的代替哑元。用于保存现场确实好。
汇编后: IRP REG,<AX,BX,CX,DX> + PUSH AX PUSH REG + PUSH BX ENDM + PUSH CX + PUSH DX
例二:IRP
汇编后: DATA SEGMENT DATA SEGMENT ARRAY LEBEL BYTE ARRAY LABEL BYTE IRP K,<1,2,3,4> + DB 'NO.1' DB 'NO.&K' + DB 'NO.2' ENDM + DB 'NO.3' DATA ENDS + DB 'NO.4' DATA ENDS
2、IRPC格式:
每次重复用字符串中的一个字符取代哑元,重复次数等于字符串中的字符数。
IRPC 哑元,字符串 .... ;重复块 ENDM
例:
在数据段产生字符区ARRAY,包括4个字符串‘NO.K’
汇编后: DATA SEGMENT DATA SEGMENT ARRAY LEBEL BYTE ARRAY LABEL BYTE IRP K,1234 + DB 'NO.1' DB 'NO.&K' + DB 'NO.2' ENDM + DB 'NO.3' DATA ENDS + DB 'NO.4' DATA ENDS
IRP和IRPC的区别:
如果是寄存器只能用IRP
如果是字符串两种方法都可以使用
三、条件汇编
作用:根据条件把一段源程序包括在汇编语言程序内,或者排除在外。一般格式:
IFxx 自变量 ;xx为条件 ...... ;自变量满足条件则汇编此块 [ELSE] ...... ;自变量不满足条件则汇编此块 ENDIF
1、IF 表达式
功能:表达式值不为0,表示条件为真。
如果条件为真,则汇编IF之后直到ENDIF间的程序段,然后继续汇编ENDID之后的部分。
否则汇编ELSE后的程序段之后跳到ENDIF后继续汇编。
2、IFE 表达式
功能:表达式值为0表示条件为真。其它同上。
3、IF1
功能:汇编处于第一次扫描时条件为真,其它同上。
4、IF2
功能:汇编处于第二次扫描时条件为真,其它同上。
相关文章推荐
- [原创][技术]PHP学习笔记(5)--PHP高级2/2
- AT&T学习笔记汇编之高级特性
- Python学习笔记(十四):模块高级
- 汇编入门学习笔记 (十四)—— 直接定址表
- Spring学习笔记-C7-SpringMVC高级技术
- JAVA核心技术学习笔记(第七版,Ⅱ高级特性之集合)
- JDK核心技术卷II高级特性(原书第八版)学习笔记1——流与文件1
- Spring学习笔记之Spring MVC的高级技术 4000
- Eclipse插件开发 学习笔记 PDF 第一篇到第四篇 免分下载 开发基础 核心技术 高级进阶 综合实例
- 流媒体技术学习笔记之(十四)FFmpeg进行笔记本摄像头+麦克风实现流媒体直播服务
- Eclipse插件开发 学习笔记 PDF 第一篇到第四篇 免分下载 开发基础 核心技术 高级进阶 综合实例
- 汇编语言学习笔记(十四)端口
- [原创][技术]PHP学习笔记(4)--PHP高级1/2
- JAVA核心技术学习笔记(第七版,Ⅱ高级特性)
- IL 汇编学习笔记(三)
- C#学习笔记(二十二):使用文件高级
- IL 汇编学习笔记(三)
- IL 汇编学习笔记(四)
- IL 汇编学习笔记(四)
- C#学习笔记(十四):StatusBar控件