ascii vs asciz vs气体中的弦

时间:2020-09-17 23:52:36

标签: assembly x86 gnu-assembler

.ascii.asciz和。string的气体有什么区别?在我看来,很明显:

  • .ascii类似于char[],因此.ascii "hello"会转换为0x48 0x65 0x6c0x6c,{{ 1}}。
  • 0x6f是相同的,但是在末尾添加了.asciz,因此nul会转换为.asciz "hello" 0x48 0x65,{{ 1}},0x6c 0x6c

但是0x6f与上面的两个有什么区别,为什么一个要比另一个使用?

1 个答案:

答案 0 :(得分:3)

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

其中一些别名根据目标平台的不同而具有不同的含义;通常应采用无处不在的方式,例如始终使用.balign.p2align,切勿使用.align。始终使用.ascii.asciz,切勿使用.string

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


.string的{​​{3}}一样(以后在想知道其他指令时应该阅读):

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

因此,在大多数目标上,它是.asciz的同义词。但显然在某些情况下,它是.ascii的同义词。

.string16.string32.string64伪指令,可用于需要宽字符字符串的情况。在那种情况下,也许值得忍受零终止的含混不清,只要您知道它在ISA上的作用,那么您实际上就是用此源文件作为目标。我认为asciz没有对应的内容。