程序如何确定字符串的结尾?

How does a program determine the end of a string?

我可以像这样定义一个新变量 msg db 'Hello, world!$',或者另一种方式 msg2 db 'Hello, world!', 0 我知道字符串的结尾是使用内存中的值 0 确定的。那么符号$代表什么?

How does a program determine the end of a string?

这取决于程序。一个好的程序会做类似 (NASM syntax):

string:    db "Hello World!"
.end:

    mov ecx,string.end - string   ; ecx = length of the string

..并且会在任何修改(附加、截断、连接等)期间跟踪字符串 length/s,以便它始终知道字符串的长度,几乎没有任何开销。

“不太好”的程序可能会将字符串的长度放在字符串的开头。这是一些旧的编程语言(例如 Pascal)所做的事情。当你想处理重叠的字符串时,这会导致问题(例如,如果 string2string1 的后半部分,那么你不能通过使字符串在内存中重叠来节省内存,因为你必须插入string2 开头的长度会破坏 string1 的中间部分)。

一个“不太好”的程序也可能会浪费 CPU 时间搜索字符串以寻找某种终止符(它有多糟糕取决于字符串的长度——对于极长的字符串来说非常糟糕) .对于 MS-DOS 来说,终止符是一个 '$' 字符(如果你想在字符串中间有一个 '$' 字符,这会使它成为额外的 silly/annoying ),而对于大多数其他在某些情况下(例如 C 编程)它是一个零(空字符)。

当然对于汇编语言,你基本上可以为所欲为(并且可以写出好的程序);直到您必须使用其他人编写的代码(例如 MS-DOS API,或用其他语言编写的代码)。