.asciz和.string汇编程序指令之间有什么区别?

问题描述 投票:9回答:1

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

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

gcc assembly x86 directive gas
1个回答
5
投票

根据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。

如对问题的评论中所述,在大多数情况下,除了语义上没有其他区别,但是从技术上讲,这两个伪操作是不同的。

附录:

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

  • HPPA(HP精密体系结构)-不加0,但对此具有特殊的.stringz指令。
  • TI-C54X(来自Texas Instruments的一些DSP芯片)-每个字的高8位(2字节)为零。有一个相关的.pstring指令,该指令压缩字符并将零填充未使用的空间。

gas/config文件夹中浏览源代码,我们可以确认这一点并找到另外一个:

  • IA64(英特尔体系结构)-.string.stringz的行为类似于HPPA。
© www.soinside.com 2019 - 2024. All rights reserved.