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