气体中的ascii vs asciz vs字符串



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

  • .ascii类似于char[],因此.ascii "hello"将翻译为0x480x650x6c0x6c0x6f
  • .asciz相同,但在末尾添加了一个nul,因此.asciz "hello"将转换为0x480x650x6c0x6c0x6f0x00

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

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

其中一些别名的含义因目标平台而异;当到处都有相同的方式时,通常会避免这些方式,例如总是使用.balign.p2align,而不是.align。始终使用.ascii.asciz,切勿使用.string

这样,您(以及代码的未来读者(就可以在GAS手册中查找它的含义,而不必检查它在特定目标平台上的行为方式。


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

除非为特定机器另行指定,否则汇编程序会用0字节标记每个字符串的末尾。

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

如果需要宽字符字符串,则有.string16.string32.string64指令。在这种情况下,可能值得忍受零终止的模糊性,只要你知道它在ISA上的作用,你就可以用这个源文件真正瞄准它。我认为asciz没有等价物。

最新更新