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

Posted

技术标签:

【中文标题】程序如何确定字符串的结尾?【英文标题】:How does a program determine the end of a string? 【发布时间】:2020-10-21 17:08:32 【问题描述】:

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

【问题讨论】:

MS-DOS 约定(对于许多 DOS 函数调用)是用 $ 而不是 0 来终止字符串。如果您不调用 MS-DOS,那么您不需要 $。字符串是否必须被 $ 终止取决于被调用的 DOS 函数。 @MichaelPetch 我在一本相对现代的书中看到$ 位于字符串的末尾。如果你能用历史评论来解释你的话,我将不胜感激。提前谢谢你。 @Michael Petch:中断 21h 服务 09h 实际上是唯一一个采用美元终止字符串的“CP/M 样式”函数。所有其他 DOS 函数使用 ASCIZ 或指针 + 长度来确定长度。 除非我知道是哪本书,否则我无法对现代书籍发表任何评论。你在看哪本书?或者它是什么网页(如果是网页)?我有很多书,所以我可能有你正在看的那本书。 例如,有关 DOS 的历史信息显示 Int 21h/Ah=9(您可以在此处阅读:ctyme.com/intr/rb-2562.htm)使用以 $ 结尾的字符串。如果这本现代书正在展示如何在 DOS 中将某些内容打印到标准输出,那么他们使用的示例代码将需要 $ 来表示该功能。 【参考方案1】:

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

这取决于程序。一个好的程序会做类似(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 或其他语言编写的代码)。

【讨论】:

你可以用 DOS 中断 21h 函数 40h, bx = 1 (stdout handle), ds:dx -> data, cx = length 来代替。这与函数 09h 完全相同的数据接收器,只是接口不同。 由于这个问题被标记为 [masm] 它可以在示例中简化为mov ecx, sizeof msg

以上是关于程序如何确定字符串的结尾?的主要内容,如果未能解决你的问题,请参考以下文章

CoreData/SQLite 确定字段是不是以特定字符串结尾的最快方法

C++ 程序员不知道以空字符结尾的字符串是如何工作的可以接受吗? [关闭]

在编译时确定#defined 字符串长度

python_如何判断字符串a以某个字符串开头或结尾?

Python - 检查字符串中的最后一个字符是否为数字

JS如何判断字符串是以指定字符串结尾