在汇编中将字符附加到字符串

时间:2013-02-06 14:07:32

标签: assembly x86 masm

我想将'$'附加到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

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

1 个答案:

答案 0 :(得分:2)

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

m2不是字节值。它是一个标签,名称和某个对象的地址。此标签的值(地址)通常不适合单个字节(这就是您收到错误的原因)。并且您不希望m2m3 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执行指令的方式。或者它会尝试将数据解释为指令,并且您的程序将无法正常工作。