MASM有丰富的伪指令。必须搞清这些伪指令的功能及用法,才能编写出高质量的汇编语言源程序。
MASM的伪指令可分为变量定义语句、符号定义语句、段定义语句、段分配语句、过程定义语句、群定义语句、结构定义语句、记录定义语句等。
本节重点讨论前五种伪指令语句,这些语句在程序中比较重要,使用频繁。
4.3.1 变量定义语句
变量定义语句用来定义字节、字或双字等变量。变量定义语句有两种不同的格式。
1.格式1
[变量名]DB/DW/DD/DF/DQ/DT表达式
功能:为变量分配1个字节/字/双字/长字/四字/十字节的存储单元,并给它们赋值。格式1又可分为以下几种具体用法:
2.格式2
格式2用于定义重复变量。
4.3.2 符号定义语句
编制源程序时,经常将常数或表达式等用一特定符号表示,这时需要用符号定义语句。符号定义语句不占用内存,有两种基本格式。
1.等值语句(EQU)
格式:符号EQU表达式
功能:将表达式的值赋给EQU左边的符号。
例如:COUNT EQU 5;COUNT等于5
NUMEQU 13+6-2;NUM等于表达式的值
等值语句在汇编时不产生任何目标代码,也不占用存储单元。但在同一个程序中,不能对已定义的符号重新定义。
2.等号语句
格式:符号 表达式
等号语句与EQU语句有同样的功能,区别在于等号语句定义的符号允许重新定义,使用更加方便灵活。
4.3.3 段定义语句
在汇编程序设计中,需要将存储器分成若干段,CPU访问存储器时,凭借段寄存器对各段进行访问。通常用段定义语句(SEGMENT/ENDS)来定义各种类型的逻辑段。在MASM5.0以上的汇编语言版本中,有完整定义伪指令和简化段定义两种。
1.完整的段定义语句
1)段定义语句
格式:段名SEGMENT[定位类型][,组合类型][,字长选择][,类别]
任何一个逻辑段从SEGMENT语句开始,以ENDS语句结束。伪指令名SEGM ENT和ENDS是本语句的关键字,不可以默认,并且总是成对出现的。语句中段名是必选项,定位类型、组合类型、字长选择、分类名为可选项。
(1)段名(SEG NAME)
用户自己选定,不能省略,一个段开始与结尾用的段名应一致。
(2)定位类型(ALIGN TYPE)
定位类型表示对段的起始边界的要求,可有以下五种选择:
①PAGE(页):表示本段从一页的边界开始,一页为256个字节,所以PAGE定义的边界其地址能整除256,这样段的首地址的最后八位二进制数一定为‘0’(即以00H结尾)。
②PARA(节):表示本段从一个节的边界开始,一节为16个字节,所以段的起始地址最后四位二进制数一定为‘0’(即以0H结尾)。PARA通常隐含,即未定义定位类型时,其定位类型为PARA。
③DWORD(双字):表示本段从4的倍数地址开始。
④WORD(字):表示本段从偶数地址开始,该地址的最低位应为0。
⑤BYTE(字节):表示本段可从任何地址开始定位。
(3)组合类型(COMBINE TYPE)
组合类型用来对各个逻辑段之间的连接方式提出要求,可供选择的参数有以下六种:
①NONE:表示该段与其他同名段不进行连接,独立存于存储器中。如果语句中省略组合类型,则MASM把它作为NONE处理。
②PUBLIC:该段可与其他模块中的同名段在满足定位类型的前提下,由低地址到高地址连接起来,组合成一个较大的逻辑段。
③COMMON:该段与其他模块中的同名段采用覆盖方式在存储器中定位,即它们具有相同的段首地址,共享同一个存储区,而共享存储器的长度由同名段中最大的段确定。段的内容为所连接的最后一个模块中的内容,以及没有覆盖到的前面COMMON段的部分内容。
④MEMORY:定义该段与其他模块中的同名段具有相同的首地址,采用覆盖方式在存储器中进行连接。与COMMON的不同处是:带有MEMORY参数的逻辑段覆盖在其他同名段的最高地址。