MASM汇编语言还有两种特殊的数据结构形式:结构和记录。
1.常数
常数是没有任何属性的纯数值。在汇编时常数的值已确定,并且在程序运行过程中,常数的值不会改变。常数分为两种类型:数值型常数和字符串型常数。
1)数值型常数
(1)二进制数:以字母B结尾,如01011101B。
(2)八进制数:以字母Q或O结尾,如723Q,21O。
(3)十进制数:以字母D(或省略)结尾,如1995D,3508。
(4)十六进制数:以字母H结尾,例如:3A40H,5BH。
2)字符串型常数
用单引号括起来的字符串,如‘ABCD’,‘S|123456’等。每个字符在机内以ASCII码存放,例如‘A’在内存中为41H。
2.变量
变量用来定义存放在存储器单元中的数据。
当存储单元中的数据在程序运行中随时可以修改时,这个存储单元中的数据可以用变量来定义。为了便于对变量的访问,要给变量取一个名字称为变量名。变量名应符合标识符的规定,它是存放数据存储单元的符号地址。
定义变量可用变量定义伪指令(后面将介绍)。
经过定义的变量,有三重属性。
1)段属性(SEG)
表示变量存放在某个逻辑段中(通常指变量所在段的段基址)。如上例中,变量DATA1、DATA2、DATA3放在逻辑段DATA中。当指令中要对这些变量进行存取操作时,需将段基址送至段寄存器中。
2)偏移地址属性(OFFSET)
表示变量在所在段的偏移地址,以字节数表示。例如,上面例子中DATA1的偏移地址为0,DATA2的偏移地址为1,DATA3的偏移地址为2。段基址和偏移地址组成变量的逻辑地址。
3)类型属性(TYPE)
表示变量占用存储单元的字节数,这一属性是由数据定义伪指令来规定的。变量可分别定义为8位,16位,32位,48位,64位和80位数据。
3.标号
标号是指令语句所在地址的符号表示。标号表明该指令在内存中的位置,常作为转移指令的操作数,确定程序转移的目标地址。
与变量类似,每个标号也有三重属性,如下所述。
(1)段属性(SEG):该标号所在段的段基址。
(2)偏移地址属性(OFFSET):该标号所在段的偏移地址。
(3)距离属性(DISTANCE):当标号作为转移类指令的操作数时,可在段内或段间转移,这时它们的距离属性不同。
NEAR:只允许在本段内转移;
FAR:允许在段间转移。
设置标号距离可用隐含方式或伪指令LABEL定义其距离属性两种方式。
(1)隐含方式:标号后面跟“”隐含其距离属性为NEAR,只能在本段中转移。
(2)用LABEL伪指令定义距离属性。
4.表达式
表达式是操作数的常见形式,表达式由常数、变量、标号及连接它们的运算符组成。表达式的运算不由CPU完成,而是在程序汇编过程中进行计算确定,并将表达式的结果作为操作数参加指令所规定的操作。MASM允许使用的表达式分为以下两类。
1)数字表达式
数字表达式的结果是数字。
例如:MOV DX,(6*A-B)/2
指令的源操作数(6*A-B)/2是一个表达式。若设变量A的值为1,变量B的值为2,则此表达式的值为(6*1-2)/22,是一个数字结果,此表达式是数字表达式。
2)地址表达式
地址表达式的结果是一个存储单元的地址。当这个地址中存放的是数据时,称为变量;当这个地址中存放的是指令时,则称为标号。
当在指令的操作数部分用到地址表达式时,应当注意其物理意义。例如,两个地址相乘或相除是无意义的,两个不同段的地址相加减也是无意义的。经常使用的是地址±(加减号)数字量。如SUM+l是指向SUM字节单元的下一个单元的地址。
例如:MOV AX, ES:[BX+SI+1000H]
BX+SI+1000H为地址表达式,结果是一个存储单元的地址。