db
不是一些可以组合或连接不同对象的魔术运算符。这是一个指令,告诉汇编器静态分配空间(内存),就在此处用于随后列表中固定数量的字节值,并用这些值对其进行初始化。因此,m2 db "gggg"
被替换为 4 个字节,每个字节都是字母 g 的 ASCII 码。
m2
不是字节值。它是某个对象的标签、名称和地址。此标签(地址)的值通常不适合单个字节(这就是您收到错误的原因)。而且您不想要m2
in的地址,您想要名称为,m3 db m2
的对象的内容或值。m2
"gggg"
所以,m3 db m2
不会神奇地扩展到类似m3 db "gggg"
. 如果您想操作程序的源代码并执行文本替换,您可以使用宏,它能够在源代码转换为机器代码之前扩展为数字常量、字符串和指令。
但是,在这种情况下,您需要显式分配另一块空间(是的,db
可以这样做),编写代码(指令)以"gggg"
从另一个位置复制到它,然后坚持"$"
到底。
最后,这样的事情几乎总是错误的:
mov ds, ax
m3 db "gggg$"
当它被翻译成机器代码然后执行时,你认为 CPU 完成后会做什么mov ds, ax
?你不认为它会尝试将“gggg$”的五个数据字节重新解释为指令字节,对它们进行解码并像处理 的字节一样执行它们mov ds, ax
?CPU 不会知道您打算将这五个字节作为数据而不是代码。数据字节与指令字节无法区分,db
它本身不是 CPU 指令,它只是对汇编器的指令,就像var
Pascal 或 JavaScript 中的关键字一样。
您必须将数据移出 CPU 执行指令的位置。否则它将尝试将数据解释为指令,您的程序将无法运行。