为什么需要'20,22'在'字符串DB 20,22 dup('?')中?

时间:2013-06-25 20:04:28

标签: assembly x86-16

我一直在为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是字符数?我可能会说废话,但是会对这些问题的任何澄清表示感谢

2 个答案:

答案 0 :(得分: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 $

答案 1 :(得分:0)

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

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

db 13,10简单地表示字节“0x0d”和“0x0a”。