程序如何确定字符串的结尾?
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)所做的事情。当你想处理重叠的字符串时,这会导致问题(例如,如果 string2
是 string1
的后半部分,那么你不能通过使字符串在内存中重叠来节省内存,因为你必须插入string2
开头的长度会破坏 string1
的中间部分)。
一个“不太好”的程序也可能会浪费 CPU 时间搜索字符串以寻找某种终止符(它有多糟糕取决于字符串的长度——对于极长的字符串来说非常糟糕) .对于 MS-DOS 来说,终止符是一个 '$'
字符(如果你想在字符串中间有一个 '$'
字符,这会使它成为额外的 silly/annoying ),而对于大多数其他在某些情况下(例如 C 编程)它是一个零(空字符)。
当然对于汇编语言,你基本上可以为所欲为(并且可以写出好的程序);直到您必须使用其他人编写的代码(例如 MS-DOS API,或用其他语言编写的代码)。
我可以像这样定义一个新变量 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)所做的事情。当你想处理重叠的字符串时,这会导致问题(例如,如果 string2
是 string1
的后半部分,那么你不能通过使字符串在内存中重叠来节省内存,因为你必须插入string2
开头的长度会破坏 string1
的中间部分)。
一个“不太好”的程序也可能会浪费 CPU 时间搜索字符串以寻找某种终止符(它有多糟糕取决于字符串的长度——对于极长的字符串来说非常糟糕) .对于 MS-DOS 来说,终止符是一个 '$'
字符(如果你想在字符串中间有一个 '$'
字符,这会使它成为额外的 silly/annoying ),而对于大多数其他在某些情况下(例如 C 编程)它是一个零(空字符)。
当然对于汇编语言,你基本上可以为所欲为(并且可以写出好的程序);直到您必须使用其他人编写的代码(例如 MS-DOS API,或用其他语言编写的代码)。