ascii vs asciz vs 气体字符串

sam*_*249 4 x86 assembly gnu-assembler

.ascii.asciz、 和之间有什么区别。string在气体中?在我看来很清楚:

  • .ascii是这样的char[],所以.ascii "hello"会转化为0x48 0x65 0x6c, 0x6c, 0x6f
  • .asciz是相同的,但nul在末尾添加了 a ,因此.asciz "hello"将转换为0x48 0x65 0x6c, 0x6c, 0x6f 0x00

但是,.string与上述两种有什么区别,为什么要使用另一种呢?

Pet*_*des 5

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

其中一些别名的含义因目标平台而异;通常在任何地方都有相同的方式时避免使用它们,例如始终使用.balignor .p2align,从不.align。始终使用.asciior .asciz,从不.string

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


GAS 手册中所述.string(当您想知道其他指令时,您应该在未来阅读):

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

所以在大多数目标上,它是.asciz. 但显然在某些情况下,它是.ascii.

还有.string16.string32.string64的情况下,指示你想要的宽字符的字符串。在这种情况下,也许值得忍受零终止的可能歧义,只要您知道它在您实际使用此源文件针对的 ISA 上的作用。我不认为asciz.