数据定义及存储器分配伪指令格式中的"变量"是操作数的符号地址,它是可有可无的,它的作用与指令语句前的标号相同,区别是变量后面不加冒号。如果语句中有变量,那么汇编程序将操作数的第一个字节的偏移地址赋于这个变量。
"注释"字段用来说明该伪指令的功能,它也不是必须有的。
"助记符"字段说明所用伪指令的助记符。
DB(define byte)
请看下面数据定义的例子,注意DB定义的每个数据的存储情况,左边第一列是汇编程序为数据分配的字节地址,第二列是相应地址中存储的数据或ASCII字符(均用十六进制表示)。变量DATA7定义了3个数据和一个字符串,每个数据或串用","分开,它们分别存储在偏移地址002E开始的6个字节单元中。
表4.2.5
;
DB 例子的列表文件
0000 19 DATA1 DB 25 ; 十进制数
0001 89 DATA2 DB 10001001B ; 二进制数
0002 12 DATA3 DB 12H ; 十六进制数
0010 ORG 0010H ; 指定偏移地址为10h
0010 32 35 39 31 DATA4 DB '2591' ; ASCII码数
0018 ORG 0018H ; 指定偏移地址为18h
0018 00 DATA5 DB ? ; 保留一个字节
0020 ORG 0020H ; 指定偏移地址为20h
0020 4D 79 20 6E 61 6D DATA6 DB 'My name is Joe' ; ASCII码字符
65 20 69 73 20 4A
6F 65
002E 0A 10 02 31 30 42 DATA7 DB 10,10H,10B,'10B' ; 不同的数据类型
|
DW(define word)
表4.2.6
;
DW 伪指令例子的列表文件
0070 0RG 70H ;指定起始地址
0070 03BA DATA8 DW 954 ; 十进制数
0072 0954 DATA9 DW 100101010100B ; binary
0074 253F DATA10 DW 253FH ; 十六进制数
0076 FFFB DATA11 DW -5 ; 负数
0080 ORG 80H
0080 0009 FFFF 0007 000C DATA12 DW 9,-1,7,0CH,00100000B,100,'HI'
0020 0064 4849 ; 各种类型数据 |
DD(define doubleword)
表4.2.7
;
DD例子的列表文件
00A0 ORG 00A0H ; 指定起始地址
00A0 FF030000 DATA13 DD 1023 ; 十进制数
00A4 5C960800 DATA14 DD 10001001011001011100B ;
二进制数
00A8 F2572A5C DATA15 DD 5C2A57F2H ; 十六进制数
00AC 23000000 89470300 DATA16 DD 23H,34789H,65533
; 各种数据
FDFF0000 |
DT(define ten bytes)
表4.2.8
;
DQ、DT例子的列表文件
00C0 ORG 00C0H
00C0 C223450000000000 DATA17 DQ 4523C2H ; 十六进制数
00C8 4948000000000000 DATA18 DQ 'HI' ; ASCII字符
00D0 0000000000000000 DATA19 DQ ? ; 分配8个字节单元
00E0 ORG 00E0H
00E0 2998564379860000 DATA20 DT 867943569829 ; 压缩的BCD数
0000
00EA 0000000000000000 DATA21 DT ? ; 分配10个字节单元
0000 |
DUP(duplicate)
表4.2.9
;
DUP例子的列表文件
0100 ORG 0100H ; 数据区的起始地址
0100 0020[ DATA22 DB 32 DUP(?) ; 保留32字节
??
]
0120 ORG 0120H
0120 0005[ DATA23 DB 5 DUP(2 DUP(99)); 存入10个字节的99
0002[
63
]
]
012A 0008[ ATA24 DW 8 DUP(?) ; 保留8个字节
????
] |
对数据定义伪指令前面的变量还要注意它的类型属性问题。变量表示该伪指令中的第一个数据项的偏移地址,此外,它还具有一个类型属性,用来表示该语句中的每一个数据项的长度(以字节为单位表示),因此DB伪指令的类型属性为1,DW为2,DD为4,DQ为8,DT为10。变量表达式的属性和变量是相同的。汇编程序可以用这种隐含的类型属性来确定某些指令是字指令还是字节指令。
下例中变量OPER1为字节类型属性,OPER2为字类型属性,所以第一条MOV指令应为字节指令,第二条MOV指令应为字指令。而第三条指令的变量表达式OPER1+1为字节类型属性,AX却为字寄存器,第四条指令的OPER2为字类型属性,AL为字节寄存器,因此,汇编程序将指示这两条MOV指令出错:"类型不匹配"。
OPER1 DB ?, ?
OPER2 DW ?, ?
.
.
.
MOV OPER1, 0 ;字节指令
MOV OPER2, 0 ;字指令
MOV AX, OPER1+1 ;错误指令:类型不匹配
MOV AL, OPER2 ;错误指令:类型不匹配
PTR属性操作符
下例中的两条MOV指令把OPER1+1的类型属性指定为字,把OPER2的类型属性指定为字节,这样指令中两个操作数的属性就一致了,汇编时就不会出错了。
OPER1 DB ?, ?
OPER2 DW ?, ?
.
.
.
MOV AX, WORD PTR OPER1+1
MOV AL, BYTE PTR OPER2
LABEL伪指令
例如:
BYTE_ARRAY LABEL BYTE
WORD_ARRAY DW 50 DUP (?)
在50个字数组中的第一个字节的地址赋予两个不同类型的变量名:字节类型的变量BYTE_ARRAY和字类型变量WORD_ARRAY。
在程序中访问数组单元时,要按指令类型来选择变量,如下面两条指令:
MOV WORD_ARRAY + 2,0 ; 字指令,
; 把该数组的第3个和第4个字节置0
MOV BYTE_ARRAY + 2,0 ; 字节指令,
; 把该数组的第3个字节置0
|
|