【问题标题】:What's the difference between the .asciz and the .string assembler directives?.asciz 和 .string 汇编器指令有什么区别?
【发布时间】:2016-08-19 15:23:26
【问题描述】:

我知道.ascii 指令不会在字符串末尾放置空字符,因为.asciz 指令就是用于此目的。但是,我不知道.string 指令是否在字符串末尾放置了一个空字符。

如果它确实附加了空字符,那么.asciz.string 指令之间有什么区别?对我来说,同时拥有.asciz.string 似乎是多余的。

【问题讨论】:

  • .asciz.string 是同义词,都是零终止字符串。 .ascii 不会以零终止字符串。您可以在GNU Assembler documentation了解更多信息
  • 谢谢。这一直困扰着我这么久。我相信Zen of Python,它说“应该有一种——最好只有一种——明显的方式来做到这一点。”因此,.asciz.string 是同义词让我感到困惑。
  • 虽然我说它们是同义词,但 .string 似乎可能会或可能不会附加尾随零,具体取决于架构。我没有使用不附加零的特定架构。在这些情况下,它们是相同的。我很好奇,如果真的存在.string.asciz 不同的环境。我猜可以随时查看源代码。
  • 同义词可能存在以与其他(可能是古老的)汇编程序兼容。
  • 汇编手册至少在一个方向链接同义词,但官方文档没有说.string 有任何同义词,或者.ascii 或.asciz 有任何同义词。例如.zero.space.skip 同义词。可能有人说“这个指令的名称在某些情况下不符合它的使用语义,让我们做一个别名”。他们不能像@Nate 所说的那样,在不破坏向后兼容的情况下重命名它。与某些 unix 平台上供应商提供的汇编程序兼容是另一个可能的原因。

标签: gcc assembly x86 directive gnu-assembler


【解决方案1】:

根据binutils docs

.ascii "string"(此处为完整性)

.ascii 需要零个或多个用逗号分隔的字符串文字。它将每个字符串(没有自动尾随零字节)组装成连续的地址。

.asciz "string"

.asciz 就像 .ascii 一样,但每个字符串后面跟着一个零字节。 “.asciz”中的“z”代表“零”。

.string "str", .string8 "str", .string16 "str", .string32 "str", .string64 "str"

将 str 中的字符复制到目标文件中。您可以指定多个要复制的字符串,以逗号分隔。除非对特定机器另有规定,否则汇编程序会用 0 字节标记每个字符串的结尾。

...

变体 string16、string32 和 string64 与字符串伪操作码的不同之处在于 str 中的每个 8 位字符都被复制并分别扩展为 16、32 或 64 位。扩展字符以目标字节顺序存储。

它们都支持转义序列并接受多个参数。至于.string.asciz的区别:

  • 在某些体系结构中,.string 不会添加空字节,而.asciz 总是会添加。要测试您自己的系统,您可以这样做:
    • echo '.string ""' | gcc -c -o stdout.o -xassembler -; objdump -sj .text stdout.o
    • 如果第一个字节为 00,则插入空字符。
  • .string 还具有将字符扩展为特定宽度(16、32 或 64)的后缀,但默认为 8。

正如问题的 cmets 所述,在大多数情况下,除了语义之外没有区别,但从技术上讲,这两个伪操作是不同的。

附录:

事实证明,文档确实提到了两种行为不同的架构:

  • HPPA(HP 精密架构)- 不加 0,但有一个特殊的 .stringz 指令。
  • TI-C54X(来自德州仪器的一些 DSP 芯片)- 零填充每个字的高 8 位(2 个字节)。有一个相关的 .pstring 指令,用于打包字符并用零填充未使用的空间。

翻遍gas/config文件夹中的源码,我们可以确认这一点,再找到一个:

  • IA64(英特尔架构)-.string.stringz 的行为类似于 HPPA。

【讨论】:

  • 如果您为该目标构建了 GAS,“如何确定”部分非常容易。试一试并查看目标文件。否则是的,它没有记录,我猜只是埋在源代码中。
  • 文档确实指定了一对,实际上。你只需要浏览每个架构,看看他们是否对它说了什么。 (或者grep它的来源。)
  • @PeterCordes @Calculuswhiz gas/config在哪里?,我会查找一些gas指令的实现,但是找不到locate gas/config呢?我怎样才能找到它?
  • @Herdsman 它在源代码文件夹中。 ftp.gnu.org/gnu/binutils
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 2016-11-09
相关资源
最近更新 更多