16

我正在学习汇编我看到两个定义字符串的例子:

msg db '你好,世界!',0xa

  • 0xa 在这里是什么意思?

message DB '我很喜欢它!', 0

  • 为什么我们这里有一个 0?
  • 它是一个尾随空字符吗?
  • 为什么我们在上面的例子中有 0xa 但这里有 0?(似乎它们与字符串长度无关)

如果上面的例子是定义汇编字符串的两种方式,程序如何区分它们?

提前感谢您的帮助:)

4

3 回答 3

16

不同的汇编器有不同的语法,但在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(定义四字)。但是,它们的语法只接受数字,而不接受字符串。

于 2013-10-22T19:54:27.497 回答
1

0 是尾随空值,是的。0xa 是换行符。它们没有定义相同的字符串,所以这就是你区分它们的方式。

于 2013-10-22T19:38:26.297 回答
1

0xa"A"表示以十进制表示的十六进制值10。换行控制字符具有ASCII代码 10(返回具有 D 十六进制或 13 十进制)。

字符串通常由一个nul字符终止以指示它们的结束。

于 2013-10-22T19:40:28.813 回答