我知道.ascii
指令不会在字符串末尾添加空字符,因为.asciz
指令用于此目的。但是,我不知道.string
指令是否在字符串的末尾放置一个空字符。
如果它确实附加了空字符,那么.asciz
和.string
指令之间有什么区别?对我来说,同时拥有.asciz
和.string
似乎是多余的。
.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
。.string
也具有后缀,可将字符扩展到某些宽度(16、32或64),但默认情况下为8。如对问题的评论中所述,在大多数情况下,除了语义上没有其他区别,但是从技术上讲,这两个伪操作是不同的。
附录:
事实证明,文档do提到了两种行为不同的架构:
.stringz
指令。.pstring
指令,该指令压缩字符并将零填充未使用的空间。在gas/config
文件夹中浏览源代码,我们可以确认这一点并找到另外一个:
.string
和.stringz
的行为类似于HPPA。