2

一段时间以来,我一直在定义字符串,DB 20, 22但不知道为什么:

我读到第一个字节是缓冲区大小,第二个字节保存字符串的使用字节数,但我不知道这两个值是否都是强制性的。例如,当我定义一个字符串并想要将一个寄存器指向它时,我必须使用 +2 来跳过这两个字符。

string DB 20, 22 dup('?')
lea si, string+2
lea si, [string] ; I think this is another alternative

这让我想知道我是否可以在没有它们的情况下定义字符串lea si, string。这是可能的还是两个项目都是强制性的?另外,当我想跳过一行并将光标移到开头时DB 13, 10,编译器如何知道 13 不是缓冲区大小而 10 不是字符数?我可能在胡说八道,但对这些问题的任何澄清将不胜感激

4

2 回答 2

2

如果你只想要一个字符串,那么只需定义它:

myString db 'hello, world'

然后你可以像你展示的那样解决它:

lea si, myString

但是,您要么需要知道字符串有多长,要么必须添加一个终止符,以便输出函数知道在哪里停止。如果您想要以 0 结尾的字符串,例如:

myString db 'hello, world', 0  ; don't forget that terminator

或者,您可以将长度放在字符串之前,这可能是您20, 22的:

myString db 12, 'hello, world'

一个字节适用于最多 255 个字符的字符串。如果您需要处理比这更长的字符串,您可能希望将字符串长度标准化为两个字节。

无论您选择哪种方式,您的输出函数都需要知道如何处理它。

顺便说一句,如果你想要以长度为前缀的字符串,你不应该手动编码长度。让汇编程序为您解决:

myString db myStringEnd - $
         db 'hello, world'
myStringEnd equ $
于 2013-06-25T20:45:21.650 回答
0

我认为“db 20, 22 dup(?)”实际上会将以下字节放入内存中:0x14 0x00 0x00 0x00 .....(0x00 的 22 倍)。这种看起来像帕斯卡风格的字符串,其中第一个字节包含字符串长度。

没有必要像那样定义字符串。

db 13, 10 仅表示字节“0x0d”和“0x0a”。

于 2013-06-25T20:07:03.243 回答