ascii vs asciz vs 气体中的字符串
ascii vs asciz vs string in gas
gas 中的.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 汇编程序兼容。这是对同一事物使用冗余指令的主要原因。
根据目标平台的不同,其中一些别名有不同的含义;通常避免使用 same-everywhere 方法,例如始终使用 .balign
或 .p2align
,从不使用 .align
。始终使用 .ascii
或 .asciz
,从不使用 .string
.
这样您(以及您代码的未来读者)就可以在 GAS 手册中查找它的含义,而不必检查它在某些特定目标平台上的行为方式。
As documented in the GAS manual for .string
(当你想知道其他指令时,你应该在以后阅读):
Unless otherwise specified for a particular machine, the assembler marks the end of each string with a 0 byte.
所以在大多数目标上,它是 .asciz
的同义词。但显然在某些人看来,它是 .ascii
.
的同义词
有 .string16
、.string32
和 .string64
指令,以防您需要宽字符的字符串。在那种情况下,也许值得忍受 zero-termination 可能存在的歧义,只要您知道它在 ISA 上的作用,您实际上是使用此源文件定位的。我不认为 asciz
.
有等价物
gas 中的.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 汇编程序兼容。这是对同一事物使用冗余指令的主要原因。
根据目标平台的不同,其中一些别名有不同的含义;通常避免使用 same-everywhere 方法,例如始终使用 .balign
或 .p2align
,从不使用 .align
。始终使用 .ascii
或 .asciz
,从不使用 .string
.
这样您(以及您代码的未来读者)就可以在 GAS 手册中查找它的含义,而不必检查它在某些特定目标平台上的行为方式。
As documented in the GAS manual for .string
(当你想知道其他指令时,你应该在以后阅读):
Unless otherwise specified for a particular machine, the assembler marks the end of each string with a 0 byte.
所以在大多数目标上,它是 .asciz
的同义词。但显然在某些人看来,它是 .ascii
.
有 .string16
、.string32
和 .string64
指令,以防您需要宽字符的字符串。在那种情况下,也许值得忍受 zero-termination 可能存在的歧义,只要您知道它在 ISA 上的作用,您实际上是使用此源文件定位的。我不认为 asciz
.