宏定义

宏定义语句MACRO和子程序定义语句PROC一样都是伪指令。宏定义需要一对伪指令MACRO和ENDM完成。
格式:

宏名字 MACRO [哑元1,哑元2,… ]  

语句串

ENDM

说明:宏定义不产生目标代码。 其中哑元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
IRP REG,<AX,BX,CX,DX,SI,DI,BP>
PUSH REG
ENDM

汇编时,在代码段中连续插入了7条PUSH指令,分别是PUSH AX~PUSH BP。

条件汇编

格式:IF 表达式
代码段1
ELSE
代码段2
ENDIF
例 在程序中控制某条指令是否汇编。

.CODE

IF X EQ 0 ;汇编时,如果X单元的值等于0,
MOV BX,0 ;这两条指令加在程序中
MOV AL,[BX]
ELSE ;否则,下面两条指令加在程序中
MOV BX,1
MOV DL,[BX]
ENDIF

多模块结构

全局符号定义PUBLIC

在各个模块间共用的变量、符号、标号、过程等要用PUBLIC伪指令事先说明为全局变量,以便能被其他模块引用。
格式:PUBLIC 符号1[,符号2,……]
功能:将本模块中的符号或过程定义为全局变量,共其它模块使用。

外部符号说明EXTRN

EXTRN伪指令用来说明某个变量、符号或过程是其它模块定义的,在本模块中需要引用。
格式:EXTRN 符号1:类型 [,符号2:类型,……]
功能:将外部符号和其类型进行说明。
类型为:BYTE、WORD、DWORD、NEAR、FAR等。符号的类型要与它在定义模块中的一致。

段属性与段组合

在定义代码段时,代码段名相同时要加 PARA 'CODE',以使其类别相同;数据段也可以用PARA 'DATA' 加以说明。
在多模块程序设计中,最少定义一个堆栈段,一般在主模块中定义。主模块的最后一条结束伪指令END START必须加上标号(START),而其它模块的END语句不能带有标号。