.ascii
、.asciz
和之间的区别是什么。气体中的string
?我似乎很清楚:
.ascii
类似于char[]
,因此.ascii "hello"
将翻译为0x48
0x65
0x6c
、0x6c
、0x6f
.asciz
相同,但在末尾添加了一个nul
,因此.asciz "hello"
将转换为0x48
0x65
0x6c
、0x6c
、0x6f
0x00
但是.string
与上述两者的区别是什么?为什么要使用其中一个而不是另一个?
GAS为各种指令提供了多个别名,以与各种平台上的Unix汇编程序兼容。这是对同一事物使用冗余指令的主要原因。
其中一些别名的含义因目标平台而异;当到处都有相同的方式时,通常会避免这些方式,例如总是使用.balign
或.p2align
,而不是.align
。始终使用.ascii
或.asciz
,切勿使用.string
。
这样,您(以及代码的未来读者(就可以在GAS手册中查找它的含义,而不必检查它在特定目标平台上的行为方式。
如.string
的GAS手册中所述(当您想知道其他指令时,您应该在未来阅读该手册(:
除非为特定机器另行指定,否则汇编程序会用0字节标记每个字符串的末尾。
所以在大多数目标上,它是.asciz
的同义词。但显然在某些方面,它是.ascii
的同义词。
如果需要宽字符字符串,则有.string16
、.string32
和.string64
指令。在这种情况下,可能值得忍受零终止的模糊性,只要你知道它在ISA上的作用,你就可以用这个源文件真正瞄准它。我认为asciz
没有等价物。