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

问题描述

我可以定义一个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)所完成的。当您要使用重叠的字符串时,这会导致问题(例如,如果string2string1的后半部分,则无法通过使字符串在内存中重叠来节省内存,因为您必须插入string2开头的长度会破坏string1的中间)。

“性能较差”的程序也可能会浪费CPU时间来搜索字符串以寻找某种终止符(其严重程度取决于字符串的长度-对于非常长的字符串而言非常糟糕)。对于MS-DOS,该终止符是一个'$'字符(如果您想在字符串的中间使用一个'$'字符,这会使它变得更加愚蠢/讨厌),并且在大多数其他情况下(例如C编程)为零(空字符)。

当然,对于汇编语言,您几乎可以做任何喜欢的事情(并且可以编写一个好的程序);直到您必须使用别人编写的代码(例如MS-DOS API或用其他某种语言编写的代码)。