smo*_*als 4 windows variables assembly nasm
就在我遵循指南在汇编中使用MessageBoxA函数之前,在创建变量时,它们在变量内容之后使用了",0".这个是来做什么的?
代码如下所示:
paramText db "this is text", 0
Run Code Online (Sandbox Code Playgroud)
db 是“定义字节”,此代码将生成这些字节(以十六进制格式):
74 68 69 73 20 69 73 20 74 65 78 74 00
Run Code Online (Sandbox Code Playgroud)
引号中的“字符串”被拆分为 ASCII 字符代码(我相信 NASM 中的 UTF8 也是可能的,所以一个字符可能会产生多个字节)用于单个字符,最后一个值“, 0” 只是编译成这样,如零。
即db 1, 2, 3会产生 3 个机器码字节01 02 03。
零放在最后一个字母之后作为“字符串 nul 终止符”供其他代码使用,它接受以零结尾的字符串(如MessageBoxA代码)。
“变量”是编程中相当高级的概念,机器并不直接支持它,编译时得到的是“符号/符号名称” paramText,它等于其后定义的第一个字节的内存地址(即0x74) = 这可以在编译时使用以处理该地址。然后db产生实际的二进制机器代码 = 它将在运行时存在,作为由操作系统加载到内存中的值。如果您想这样考虑,最后一个零是此上下文中“可变内容”的一部分(不是“之后”)。
但它只是计算机内存中的二进制值。“变量”逻辑(包括类型和/或格式)是由代码创建的,它使用内存进行操作,并由编程语言 + 编译器创建,在源代码中允许这样的构造,但 CPU 本身并不知道这个概念,并且它仅对位进行操作(通常分组为字节、字……)。
编辑:您实际上也可以在 NASM 中使用类似 C 的字符串转义值,但字符串必须用反引号括起来,例如:
paramText: db `this is text\0`
Run Code Online (Sandbox Code Playgroud)
引号和撇号不会扫描转义序列的字符串文字,并且会将“\0”编译为两个字符。但是使用“, 0”作为下一个字节定义在 IMO 中更容易记住,而不是记住反引号/引号定义的字符串之间的区别,这是 NASM 特定的功能,并非所有 x86 汇编程序都支持。