程序如何确定字符串的结尾?
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)所做的事情。当您想要使用重叠字符串时,这会导致问题(例如,如果 string2
是 string1
的后半部分,那么您无法通过使字符串在内存中重叠来节省内存,因为您必须在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 确定字段是不是以特定字符串结尾的最快方法