8086汇编语言:多文件编程
宏
宏定义
宏定义语句MACRO和子程序定义语句PROC一样都是伪指令。宏定义需要一对伪指令MACRO和ENDM完成。
格式:
宏名字 MACRO [哑元1,哑元2,… ] |
说明:宏定义不产生目标代码。 其中哑元1,哑元2,… 是虚拟参数或形式参数,用逗号分隔。虚参或形参可不设置。
宏调用
在程序中使用宏时,只要写出宏名字[实参]
既可。
宏展开
源程序在汇编时,宏指令被汇编程序用相应的程序代码所取代 ,这个过程称为宏展开。
宏运算
宏运算是指以特殊运算符实现不同变元的过程。
包括&、< >、!、%、;; 5种运算符。
& 替换运算符
用于将字串与哑元连接。宏调用时,字串与相应的实元内容连在一起。
e.g. 定义字符串宏指令DISTR.。
宏定义:
DISTR MACRO SS
DB ‘Exam:&SS’,0AH,0DH,’$’
ENDM
宏调用:
DISTR book
宏展开:
DB ‘Exam:book’ ,0AH,0DH,’$’
< > 传递运算符
在变元为字符串时,如果实元是含有空格的字符串,则实元要用< > 传递运算符括起来。
!转义运算符
当字符串中含有< 或 >字符时,为避免与传递运算符冲突,在宏调用的实元中用!表示该字符为普通字符。
% 表达式运算符
在宏调用的实元中如果有表达式,%运算符将表达式的值作为实元。
;; 宏注释符
双分号;;宏注释符是在宏定义中使用的注释符。其后的注释在宏调用及宏展开时不出现。
宏标号
格式:LOCAL 标号1 [,标号2…]
LOCAL指定局部标号伪指令只能在宏定义体中使用,并且是宏定义体的第一条语句。LOCAL的作用是将给出的标号在多次宏调用时以不同的数字取代标号,避免标号的重复定义。
宏删除
当不需要某个宏时,可以将其删除。
格式:PURGE 宏名[,宏名…]
说明:PURGE伪指令在汇编时将该语句中的宏定义名删除。
宏库建立与调用
将宏的宏定义部分放在扩展名为.MAC的文件中,称为宏库。
在应用程序中使用宏指令之前,用INCLUDE伪指令把宏库调入,然后再使用这些宏。
结构伪操作
结构定义
格式: 结构名 STRUC
结构体
结构名 ENDS
结构预置
把相关信息存入存储器。
格式: 结构变量名 结构名 <字段值表>
结构名是结构定义时的名字;<字段值表>用于给结构变量赋初值。
mem1 class <1,’WANG’,’MAN’,18,89>
结构引用
格式:结构变量名.结构字段名
说明:“.”表示对字段的访问。在使用时,可以预先将结构变量的起始地址、偏移量送往某个寄存器,再用寄存器间址代替结构变量名 。
重复汇编和条件汇编
重复汇编
重复次数确定
格式:REPT 重复次数n
重复体
ENDM
功能:将重复体重复n次。
重复次数不确定
格式1:IRP 哑元,<实元1,实元2,…>
重复体
ENDM
功能:用实元替代哑元,重复次数由实元的个数决定。
格式2:IRPC 哑元,字符串
功能:由字符串替代哑元,重复次数由字符串的字符个数决定。
用IRP定义子程序现场保护功能。
.CODE |
汇编时,在代码段中连续插入了7条PUSH指令,分别是PUSH AX~PUSH BP。
条件汇编
格式:IF 表达式
代码段1
ELSE
代码段2
ENDIF
例 在程序中控制某条指令是否汇编。
.CODE |
多模块结构
全局符号定义PUBLIC
在各个模块间共用的变量、符号、标号、过程等要用PUBLIC伪指令事先说明为全局变量,以便能被其他模块引用。
格式:PUBLIC 符号1[,符号2,……]
功能:将本模块中的符号或过程定义为全局变量,共其它模块使用。
外部符号说明EXTRN
EXTRN伪指令用来说明某个变量、符号或过程是其它模块定义的,在本模块中需要引用。
格式:EXTRN 符号1:类型 [,符号2:类型,……]
功能:将外部符号和其类型进行说明。
类型为:BYTE、WORD、DWORD、NEAR、FAR等。符号的类型要与它在定义模块中的一致。
段属性与段组合
在定义代码段时,代码段名相同时要加 PARA 'CODE'
,以使其类别相同;数据段也可以用PARA 'DATA'
加以说明。
在多模块程序设计中,最少定义一个堆栈段,一般在主模块中定义。主模块的最后一条结束伪指令END START
必须加上标号(START),而其它模块的END语句不能带有标号。