我想将'$'附加到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
这段代码是真的吗? 有什么办法吗?
答案 0 :(得分:2)
db
不是一个组合或连接不同对象的魔术运算符。它是一个指令,告诉汇编器静态分配空间(内存),这里是后面列表中固定数量的字节值,并用这些值初始化它。因此,m2 db "gggg"
被4个字节替换,每个字节是字母g的ASCII码。
m2
不是字节值。它是一个标签,名称和某个对象的地址。此标签的值(地址)通常不适合单个字节(这就是您收到错误的原因)。并且您不希望m2
中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指令,它只是汇编程序的指令,就像Pascal或JavaScript中的关键字var
一样。
您必须将数据移出CPU执行指令的方式。或者它会尝试将数据解释为指令,并且您的程序将无法正常工作。