gpt4 book ai didi

gcc - .asciz 和 .string 汇编器指令之间有什么区别?

转载 作者:行者123 更新时间:2023-12-02 19:41:20 25 4
gpt4 key购买 nike

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

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

最佳答案

根据GNU Binutils docs on as :

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

.ascii expects zero or more string literals [...] separated by commas. It assembles each string (with no automatic trailing zero byte) into consecutive addresses.

.asciz "string"

.asciz is just like .ascii, but each string is followed by a zero byte. The "z" in '.asciz' stands for "zero".

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

Copy the characters in str to the object file. You may specify more than one string to copy, separated by commas. Unless otherwise specified for a particular machine, the assembler marks the end of each string with a 0 byte.

[...]

The variants string16, string32 and string64 differ from the string pseudo opcode in that each 8-bit character from str is copied and expanded to 16, 32 or 64 bits respectively. The expanded characters are stored in target endianness byte order.

总而言之,.string.asciz 之间的区别:

  • 在某些架构(如下所列)中,.string 不会添加空字节,而 .asciz 始终会添加空字节。要测试您自己的系统,您可以这样做:

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

    如果第一个字节是00,则插入空字符。

  • .string 还具有将字符扩展至特定宽度(16、32 或 64)的后缀,但默认情况下为 8。

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

<小时/>

关于 .string,文档提到了两种行为不同的架构:

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

通过挖掘 gas/config 文件夹中的源代码,我们可以确认这一点并找到另一个:

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

关于gcc - .asciz 和 .string 汇编器指令之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36854078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com