“.asciz”和“.string”汇编指令有什么区别?

11
我知道.ascii指令不会在字符串末尾添加空字符,为了实现这个目的需要使用.asciz指令。然而,我不确定.string指令是否会在字符串末尾添加空字符。
如果它确实追加了空字符,那么.asciz.string指令之间有什么区别呢?对我来说,同时拥有.asciz.string似乎是多余的。

2
这些同义词可能存在是为了与其他(可能古老的)汇编器兼容。 - Nate Eldredge
3
汇编手册至少在一个方向上链接同义词,但官方文档没有说明 .string 有任何同义词,也没有说明 .ascii.asciz 有任何同义词。例如,.zero.space.skip 是同义词。可能有人说:“这个指令的名称不符合它在某些情况下的语义,让我们创建一个别名。”他们不能只是重命名而不破坏向后兼容性,就像 @Nate 所说的那样。与某些 Unix 平台上供应商提供的汇编器兼容性是另一个可能的原因。 - Peter Cordes
1个回答

9
根据GNU Binutils 的 as 文档: .ascii "string" (仅为完整性而提供)

.ascii 命令期望零个或多个字符串字面值(用逗号分隔)。它将每个字符串汇编(没有自动添加尾部的零字节),连续放置在地址中。

.asciz "string"

.asciz.ascii 一样,但每个字符串后面跟着一个零字节。"z" 是 ".asciz" 中的“零”的意思。

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

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

[...]

string16string32string64 变体与 string 伪操作码不同,它们从 str 中复制并扩展了每个 8 位字符,分别扩展到 16、32 或 64 位。 扩展的字符按目标字节顺序存储。

总之:.string.asciz 的区别如下:
  • In certain architectures (listed below), .string will not add the null byte, when .asciz always will. To test your own system, you can do this:

      echo '.string ""' | gcc -c -o stdout.o -xassembler -; objdump -sj .text stdout.o
    

    If the first byte is 00, then the null character was inserted.

  • .string also has suffixes to expand characters to certain widths (16, 32, or 64), but by default it is 8.

正如问题评论中所述,对于简单的用例,它们之间没有区别,除了语义。它们都支持转义序列并接受多个参数。不过,从技术上讲,这两个伪操作由预处理器以不同的方式处理,它们不是别名。(与.zero.skip相比,它们是别名。)


关于.string,文档提到有两种不同的体系结构:

  • HPPA(HP精密结构)- 不添加0,但有一个特殊的.stringz指令。
  • TI-C54X(德州仪器的DSP芯片)- 零填充每个字(2个字节)的上8位。有一个相关的.pstring指令,它压缩字符并填充未使用的空间。

gas/config文件夹中查看源代码,我们可以确认这一点,并找到更多信息:

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

1
“如何确定”部分如果你有为该目标构建的GAS,那么就很容易了。只需尝试并查看对象文件即可。否则,是没有记录的,我想它被埋在源代码中了。 - Peter Cordes
文档确实指定了一些,你只需要浏览每个架构并查看它们是否有关于此的说明(或在源代码中使用grep命令搜索)。 - General Grievance
@PeterCordes @Calculuswhiz gas/config在哪里?我想查找一些gas指令的实现,但是无法找到locate gas/config它?我该如何找到它? - Herdsman
2
@Herdsman 它在源代码文件夹中。https://ftp.gnu.org/gnu/binutils/ - General Grievance

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接