【问题标题】:what is the syntax to define a string constant in assembly?在汇编中定义字符串常量的语法是什么?
【发布时间】:2013-10-22 19:33:59
【问题描述】:

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

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

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

消息 DB '我喜欢它!',0

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

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

感谢任何帮助:)

【问题讨论】:

标签: string assembly


【解决方案1】:

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

【讨论】:

  • 如果使用DD而不是DB,你能解释一下所提到的“字符串”数据项将被编译成的代码吗?这是修改后的代码“string dd 'Assembly', 0, 1, 2, 3”
  • @Kaustav 大多数汇编程序会给你一个错误,使用“DD”而不是“DB”指令。
  • 我是 asm 的新手,但我认为如果我定义 DD,那么汇编程序将为 easch 项分配 16 位。另外,如何使用 DB 在 8 位存储中存储超过 255 的值?
  • @Kaustav DD 为每个项目分配 32 位(4 字节)。在字节数组中存储超过 1 个字节的值是逐字节存储的(当然)。
  • 标签包含: 是一种很好的风格,例如string: db 'Assembly', 0, 1, 2, 3。如果标签名称恰好是指令助记符或指令,则防止出现歧义。 (在 NASM 中工作;MASM 可能只允许在数据部分中声明“变量”,而不是普通标签。)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    字符串通常以nul 字符结尾以表示它们的结束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多