.ascii
指令不会在字符串末尾添加空字符,为了实现这个目的需要使用.asciz
指令。然而,我不确定.string
指令是否会在字符串末尾添加空字符。如果它确实追加了空字符,那么
.asciz
和.string
指令之间有什么区别呢?对我来说,同时拥有.asciz
和.string
似乎是多余的。.ascii
指令不会在字符串末尾添加空字符,为了实现这个目的需要使用.asciz
指令。然而,我不确定.string
指令是否会在字符串末尾添加空字符。.asciz
和.string
指令之间有什么区别呢?对我来说,同时拥有.asciz
和.string
似乎是多余的。.ascii "string"
(仅为完整性而提供)
.ascii
命令期望零个或多个字符串字面值(用逗号分隔)。它将每个字符串汇编(没有自动添加尾部的零字节),连续放置在地址中。
.asciz "string"
.asciz
和.ascii
一样,但每个字符串后面跟着一个零字节。"z
" 是 ".asciz
" 中的“零”的意思。
.string "str", .string8 "str", .string16 "str", .string32 "str", .string64 "str"
总之:将字符串
str
中的字符复制到目标文件。可以指定多个要复制的字符串,用逗号分隔。除非针对特定机器有其他规定,否则汇编器会使用 0 字节标记每个字符串的结尾。[...]
string16
、string32
和string64
变体与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
,文档提到有两种不同的体系结构:
.stringz
指令。.pstring
指令,它压缩字符并填充未使用的空间。在gas/config
文件夹中查看源代码,我们可以确认这一点,并找到更多信息:
.string
和.stringz
的行为类似于HPPA。gas/config
在哪里?我想查找一些gas指令的实现,但是无法找到locate gas/config
它?我该如何找到它? - Herdsman
.string
有任何同义词,也没有说明.ascii
或.asciz
有任何同义词。例如,.zero
、.space
和.skip
是同义词。可能有人说:“这个指令的名称不符合它在某些情况下的语义,让我们创建一个别名。”他们不能只是重命名而不破坏向后兼容性,就像 @Nate 所说的那样。与某些 Unix 平台上供应商提供的汇编器兼容性是另一个可能的原因。 - Peter Cordes