DB定义的,是一个字节类型的指针,完全没有容量的概念, 不存在容量的限制,没有存不下的问题。
数据存储从指针所指向的地址开始往下分配,需要填多少数据都可以。(当然还有一个段的大小不能超过64KB的限制)
你的困惑,是你强行将高级语言中一个变量只能存一个数据、是一个数据容器的概念直接拿来套用造成的。这样的概念对于汇编语言来说是错误的。
如果你这样定义:
XY DB 05H, 43H, 21H, 32H
那么,内存中数据就这么分布
地址 数据
XY+0 05
XY+1 43
XY+2 21
XY+3 32
如果你改成这样定义:
XZ DW 4305H, 3221H
那么,内存中数据这么分布:
XZ+0 05
XZ+1 43
XZ+2 21
XZ+3 32
可以看出,这两种定义方式,数据在内存的分布是一模一样的。
区别仅仅是变量名的数据类型的属性不同。
如果你程序中这样用数据:
MOV AL, XY
MOV AH, XY+1
结果AX的内容变成4305H
与用指令 MOV AX, XZ 的结果也是一模一样。
在汇编语言中,并不需要为每个数据存储单元定义一个名字。
数据是可以直接按地址访问的。
实际上,经汇编程序翻译以后,和变量名就变成了直接按地址访问。
机器指令也只能按地址访问。
按地址访问数据时,需要明确数据类型。
定义一个名字,用名字代表具体的地址值(同时也隐含着数据类型), 是为了让汇编程序在汇编时,将指令中的变量名替换为地址,减少编程者的人工工作量,便于编写程序。
DB 定义,要这样理解:
它定义的,是一个指针,而不是容器。
也就是说,它指向的是一个特定类型数据区的开始地址。
它的数据部分可以使用多个数据项的列表。
它的定义没有限定数据的空间大小和数量。
比如,XY DB ?, ?, ? 这里的XY,具有三个属性:段属性提交修改说明它在程序中的哪一个段里,类型属性说明它指向的单元的数据类型是字节还是字,偏移属性说明它的偏移地址值。
哈我用C语言描述给你吧,
a db 53h,43h相当于 char a[2]; a[0]=0x53,a[1]=0x43
汇编中定义一串数值或字符串就是这样的,比方说定义一串字符可以如下
a db 'UNIX'而不用
db 'U'
db 'N'
db 'I'
db 'X'
因为上述写法很麻烦,编译器会将 a db 'UNIX'转换成我们所需要的方式。
db是字节数据定义指令,后面定义的数据个数受到语句行长度的约束,但后面紧接着用db续行来继续定义同一标识符(或者叫变量、常量)。此时定义的标识符的大小受数据段大小的限制(比如小模式的程序不超过64KB)。