数据定义及存储器分配伪指令格式中的"变量"是操作数的符号地址,它是可有可无的,它的作用与指令语句前的标号相同,区别是变量后面不加冒号。如果语句中有变量,那么汇编程序将操作数的第一个字节的偏移地址赋于这个变量。

  "注释"字段用来说明该伪指令的功能,它也不是必须有的。
  "助记符"字段说明所用伪指令的助记符。

  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