3.4 定义数据
3.4.1 内部数据类型
MASM定义了多种内部数据类型,每种数据类型都描述了该模型的变量和表达式的取值集合。数据类型的基本特征是以数据位的数目量的大小:8,16,32,,48,64,80位。其他特征(如有符号、指针、浮点等)主要是为了方便程序员记忆变量中存储的数据的类型。例如,声明为DOWRD变量逻辑上存储的是一个32位整数、一个32位的浮点数或一个32位的指针。MASM汇编器默认情况下是大小写不敏感的,因此伪指令如DWORD可写成dword,Dword.dWord等大小写混合的格式。
下表中,除了最后三种之外,其余的所有的数据类型都是整数数据类型。表中IEEE符号是指IEEE委员会发布的标准实数格式。
3.4.2 数据定义语句
在数据定义语句中使用BYTE(定义字节)和SBYTE(定义有符号字节)伪指令,可以为一个或多个有符号及无符号字节分配存储空间,每个初始值必须是8位整数表达式或者字符常量。例如:
value1 BYTE ‘A’ ;字符常量
value2 BYTE 0 ;最小无符号字节常量
value3 BYTE 255 ;最大无符号字节常量
value4 SBYTE -128 ;最小有符号字节常量
value5 SBYTE +127 ;最大有符号字节常量
使用问号代替初始值可以定义未初始化的变量,这表示将由可执行指令在运行时为变量动态赋值:
value6 BYTE ?
可选的变量名是一个标号,标记该变量相对其所在段开始的偏移。例如,假设value1位于数据段的偏移0000出并占用1个字节的存储空间,那么value2将位于段内偏移值0001的地方:
value1 BYTE 10h
value2 BYTE 20h
遗留的DB伪指令可以定义有符号或无符号的8位的变量:
val1 DB 255 ;无符号字节
val2 DB -128 ;有符号字节
多个初始值
如果一条数据定义语句中有多个初始值,那么标号(名字)仅仅代表第一个初始值的偏移。在下列中,假设list位于偏移0000处,那么值10将位于0000处值20位于0001处,一次类推。
list BYTE 10,20,30,40
下图以字节序列的形式显示了list的定义情况:
并非所有的数据定义都需要标号(名字),如果想继续以list开始的字节数组,就可以在随后的行上接着定义其他数据:
list BYTE 10,20,30,40
BYTE 50,60,70,80
BYTE 81,82,83,84
在单条数据定义语句中,初始值可使用不同的基数,字符和字符串课可以自由混用。在下面例子中,list1和list2的内容是相同的。
list1 BYTE 10 ,32 ,41h ,00100010b
list2 BYTE 0Ah,20h,’A’ ,22h
定义字符串
要想定义字符串,应将一组字符用单引号或双引号括起来。最常见的字符串是以空字符(也称为NULL,0)结尾的字符串,C/C++,Java程序使用这种类型的字符串:
greeting1 BYTE "Good afternoon",0
greeting2 BYTE 'Good night',0
每个字节都占用一个字节,对于前面提到过的数据定义中多个初始值必须以逗号分隔的规则,字符串是一个例外。如果没有这种例外,就不得不这样定义greeting1:
greeting1 BYTE ‘G’,’o’,’o’....etc.
这样太冗长乏味了!
字符串可以占用多行,而无需为每一行都提供一个标号,如下例所示:
十六进制字节0Dh和0Ah也称为CR/LF(回车换行符)或航结束字符,在向标准输出设备上写的时候,回车换行将光标移至下面一行左右开始处。
续行