0

我想将'$'附加到字节数组的末尾以通过int打印我尝试使用masm使用此代码:

.MODEL small
.STACK 200h
.data
m2 db "gggg"
.code
_start:
    mov ax,@data
    mov ds,ax 
    m3 db m2,"$"
END _start

但给了我这个错误:

 error A2071: initializer magnitude too large for specified size

这段代码是真的吗?有什么办法吗?

4

1 回答 1

2

db不是一些可以组合或连接不同对象的魔术运算符。这是一个指令,告诉汇编器静态分配空间(内存),就在此处用于随后列表中固定数量的字节值,并用这些值对其进行初始化。因此,m2 db "gggg"被替换为 4 个字节,每个字节都是字母 g 的 ASCII 码。

m2不是字节值。它是某个对象的标签、名称和地址。此标签(地址)的值通常不适合单个字节(这就是您收到错误的原因)。而且您不想要m2in的地址,您想要名称为,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 指令,它只是对汇编器的指令,就像varPascal 或 JavaScript 中的关键字一样。

您必须将数据移出 CPU 执行指令的位置。否则它将尝试将数据解释为指令,您的程序将无法运行。

于 2013-02-06T15:25:21.757 回答