我正在学习汇编我看到两个定义字符串的例子:
msg db '你好,世界!',0xa
- 0xa 在这里是什么意思?
message DB '我很喜欢它!', 0
- 为什么我们这里有一个 0?
- 它是一个尾随空字符吗?
- 为什么我们在上面的例子中有 0xa 但这里有 0?(似乎它们与字符串长度无关)
如果上面的例子是定义汇编字符串的两种方式,程序如何区分它们?
提前感谢您的帮助:)
不同的汇编器有不同的语法,但在db
指令的情况下它们是相当一致的。
db
是一个汇编指令,它在源中指令所在的位置定义具有给定值的字节。可选地,可以将一些标签分配给指令。
常见的语法是:
[label] db n1, n2, n3, ..., nk
其中 n1..nk 是一些字节大小的数字(从 0..0xff)或一些字符串常量。
只要 ASCII 字符串由字节组成,指令只需将这些字节放在内存中,就像指令中的其他数字一样。
例子:
db 1, 2, 3, 4
将分配 4 个字节并用数字 1、2、3 和 4 填充它们
string db 'Assembly', 0, 1, 2, 3
将被编译为:
string: 41h, 73h, 73h, 65h, 6Dh, 62h, 6Ch, 79h, 00h, 01h, 02h, 03h
ASCII 码为 0Ah (0xa) 的字符是字符 LF(换行),在 Linux 中用作控制台的换行命令。
ASCII 码为 00h (0) 的字符是 NULL 字符,在类 C 语言中用作字符串结束标记。(可能在操作系统 API 调用中,因为大多数操作系统都是用 C 编写的)
附录 1:还有其他几个类似于 DB 的汇编指令,它们在内存中定义了一些数据,但大小不同。最常见的是用于 16、32 和 64 位数据的 DW(定义字)、DD(定义双字)和 DQ(定义四字)。但是,它们的语法只接受数字,而不接受字符串。
0 是尾随空值,是的。0xa 是换行符。它们没有定义相同的字符串,所以这就是你区分它们的方式。
0xa
"A"
表示以十进制表示的十六进制值10
。换行控制字符具有ASCII代码 10(返回具有 D 十六进制或 13 十进制)。
字符串通常由一个nul
字符终止以指示它们的结束。