Assembly ascii vs asciz vs气体中的字符串

Assembly ascii vs asciz vs气体中的字符串,assembly,x86,gnu-assembler,Assembly,X86,Gnu Assembler,气体中的.ascii、.asciz和.code>字符串之间有什么区别?我似乎很清楚: .ascii类似于char[],因此.ascii“hello”将转换为0x480x650x6c,0x6c,0x6f .asciz是相同的,但在末尾添加了一个nul,因此.asciz“hello”将转换为0x480x650x6c,0x6c,0x6f0x00 但是,.string与上面两种有什么区别?为什么要使用一种而不是另一种?GAS有多个别名用于各种指令,以便与各种平台上的Unix汇编程序兼容。这是对同一事

气体中的
.ascii
.asciz
和.code>字符串之间有什么区别?我似乎很清楚:

  • .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
(将来当您对其他指令感到疑惑时,应该阅读该指令):

除非对特定机器另有规定,否则汇编程序将每个字符串的末尾标记为0字节

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


如果需要宽字符字符串,则有
.string16
.string32
.string64
指令。在这种情况下,可能值得忍受零终止的模糊性,只要您知道它在ISA上的作用,您就可以使用这个源文件来确定目标。我认为
asciz

没有等价物。string
通常与
.asciz
相同。手册上写着“除非对特定机器另有规定”