【问题标题】:ascii vs asciz vs string in gasascii vs asciz vs string in gas
【发布时间】:2020-09-17 23:52:36
【问题描述】:

气体中的.ascii.asciz 和 .string 有什么区别?我似乎很清楚:

  • .ascii 类似于 char[],所以 .ascii "hello" 将转换为 0x48 0x65 0x6c0x6c0x6f
  • .asciz 是相同的,但在末尾添加了一个nul,所以.asciz "hello" 将转换为0x480x650x6c0x6c0x6f0x00

但是.string 与上述两者有什么区别,为什么要使用一个而不是另一个?

【问题讨论】:

  • .string 通常与.asciz 相同。手册说“除非针对特定机器另有规定”

标签: assembly x86 gnu-assembler


【解决方案1】:

GAS 为各种指令提供多个别名,以便与各种平台上的 Unix 汇编程序兼容。这是对同一事物使用冗余指令的主要原因。

其中一些别名的含义因目标平台而异;通常避免那些到处都是一样的方式,例如始终使用.balign.p2align,从不使用.align。始终使用.ascii.asciz,永远不要使用.string

这样您(以及您的代码的未来读者)可以在 GAS 手册中查找它的含义,而无需检查它针对某些特定目标平台的行为方式。


作为documented in the GAS manual.string (当你想知道其他指令时,你应该阅读它):

除非对特定机器另有规定,否则汇编程序会用 0 字节标记每个字符串的结尾。

所以在大多数目标上,它是.asciz 的同义词。但显然在某些人看来,它是 .ascii 的同义词。

.string16.string32.string64 指令,以防您需要宽字符的字符串。在这种情况下,可能值得忍受零终止可能的歧义,只要您知道它在您实际使用此源文件的目标的 ISA 上做了什么。我认为asciz 没有等价物。

【讨论】:

    猜你喜欢
    • 2014-06-10
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2016-09-14
    • 2017-11-06
    • 2020-07-31
    • 2012-04-30
    相关资源
    最近更新 更多