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
相同。手册上写着“除非对特定机器另有规定”