NASM 程序集 - 此变量之后的", 0"有什么用?



就在我遵循在汇编中使用 MessageBoxA 函数的指南之前,在创建变量时,他们在变量内容后使用了", 0"。这是干什么用的?

代码如下所示:

paramText  db  "this is text", 0

它实际上是字节零,很可能是为了创建以 null 结尾的字符串。

db是"定义字节",此代码将生成以下字节(十六进制格式(:

74 68 69 73 20 69 73 20 74 65 78 74 00

引号中的"字符串"被拆分为单个字符的 ASCII 字符代码(我相信 NASM 中的 UTF8 也是可能的,所以一个字符可能会产生多个字节(,最后一个值", 0"只是编译为零。

db 1, 2, 301 02 03会产生 3 个机器代码字节。

零作为"字符串 nul 终止符"放在最后一个字母之后,供其他代码使用,它接受以零结尾的字符串(如MessageBoxA代码(。

">

变量"在编程中是相当高级的概念,机器并不直接支持它,你在编译时得到的是"符号/符号名称"paramText,它等于在它之后定义的第一个字节的内存地址(那个0x74(=这可以在编译时用于处理该地址。然后db生成实际的二进制机器代码 =,该代码将在运行时存在,作为操作系统加载到内存中的值。而最后一个零是在这种情况下(而不是"之后"(的"可变内容"的一部分,如果你想这样想的话。

但它只是计算机内存中的二进制值。"变量"逻辑(包括类型和/或格式(是由代码创建的,代码使用内存进行操作,并由编程语言+编译器创建,允许在源代码中进行此类构造,但CPU本身并不知道该概念,并且它仅使用位(通常分组为字节,单词等(进行操作。


编辑:您实际上也可以在NASM中使用类似C的字符串转义值,但字符串必须括在反引号中,例如:

paramText:  db  `this is text`

引号和撇号不会扫描字符串文字以查找转义序列,并且会将"\0"编译为两个字符。但是使用", 0"作为下一个字节定义是IMO更容易记住的,而不是记住反引号/引号定义的字符串之间的差异,这是NASM特定的功能,并非所有x86汇编程序都支持。

MessageBoxA函数需要以null 结尾的字节字符串。零只是null 终止符,它告诉所有接受字符串的 C 函数字符串在哪里结束。