.ascii
,.asciz
和。string
的气体有什么区别?在我看来,很明显:
.ascii
类似于char[]
,因此.ascii "hello"
会转换为0x48
0x65
0x6c
,0x6c
,{{ 1}}。0x6f
是相同的,但是在末尾添加了.asciz
,因此nul
会转换为.asciz "hello"
0x48
0x65
,{{ 1}},0x6c
0x6c
。但是0x6f
与上面的两个有什么区别,为什么一个要比另一个使用?
答案 0 :(得分:3)
GAS对于各种指令具有多个别名,以与各种平台上的Unix汇编程序兼容。这是对同一件事使用冗余指令的主要原因。
其中一些别名根据目标平台的不同而具有不同的含义;通常应采用无处不在的方式,例如始终使用.balign
或.p2align
,切勿使用.align
。始终使用.ascii
或.asciz
,切勿使用.string
。
这样,您(和您的代码的未来读者)可以在GAS手册中查找它的含义,而不必检查它在某些特定目标平台上的表现方式。
与.string
的{{3}}一样(以后在想知道其他指令时应该阅读):
除非为特定机器另外指定,否则汇编器会用0字节标记每个字符串的结尾。
因此,在大多数目标上,它是.asciz
的同义词。但显然在某些情况下,它是.ascii
的同义词。
有.string16
,.string32
和.string64
伪指令,可用于需要宽字符字符串的情况。在那种情况下,也许值得忍受零终止的含混不清,只要您知道它在ISA上的作用,那么您实际上就是用此源文件作为目标。我认为asciz
没有对应的内容。