问题描述
我可以定义一个像msg db 'Hello,world!$'
这样的新变量,或者用另一种方式msg2 db 'Hello,world!',0
我知道字符串的结尾是使用内存中的值0
确定的。那么$
代表什么呢?
解决方法
程序如何确定字符串的结尾?
这取决于程序。一个好的程序会做类似(NASM语法)的事情:
string: db "Hello World!"
.end:
mov ecx,string.end - string ; ecx = length of the string
..并且在进行任何修改(追加,截断,连接等)时都将跟踪字符串的长度/秒,以便它始终知道字符串的长度,而几乎没有任何开销。
“性能较差”的程序可能会将字符串的长度放在字符串的开头。这是一些旧的编程语言(例如Pascal)所完成的。当您要使用重叠的字符串时,这会导致问题(例如,如果string2
是string1
的后半部分,则无法通过使字符串在内存中重叠来节省内存,因为您必须插入string2
开头的长度会破坏string1
的中间)。
“性能较差”的程序也可能会浪费CPU时间来搜索字符串以寻找某种终止符(其严重程度取决于字符串的长度-对于非常长的字符串而言非常糟糕)。对于MS-DOS,该终止符是一个'$'
字符(如果您想在字符串的中间使用一个'$'
字符,这会使它变得更加愚蠢/讨厌),并且在大多数其他情况下(例如C编程)为零(空字符)。
当然,对于汇编语言,您几乎可以做任何喜欢的事情(并且可以编写一个好的程序);直到您必须使用别人编写的代码(例如MS-DOS API或用其他某种语言编写的代码)。