如何解决ascii vs asciz vs气体中的弦
.ascii
,.asciz
和。string
的气体有什么区别?在我看来,很明显:
-
.ascii
类似于char[]
,因此.ascii "hello"
会转换为0x48
0x65
0x6c
,0x6c
,{{ 1}}。 -
0x6f
是相同的,但是在末尾添加了.asciz
,因此nul
会转换为.asciz "hello"
0x48
0x65
,{{ 1}},0x6c
0x6c
。
但是0x6f
与上面的两个有什么区别,为什么一个要比另一个使用?
解决方法
GAS对于各种指令具有多个别名,以与各种平台上的Unix汇编程序兼容。这是对同一件事使用冗余指令的主要原因。
其中一些别名根据目标平台的不同而具有不同的含义;通常应采用无处不在的方式,例如始终使用.balign
或.p2align
,切勿使用.align
。始终使用.ascii
或.asciz
,切勿使用.string
。
这样,您(和您的代码的未来读者)可以在GAS手册中查找它的含义,而不必检查它在某些特定目标平台上的表现方式。
与.string
的{{3}}一样(以后在想知道其他指令时应该阅读):
除非为特定机器另外指定,否则汇编器会用0字节标记每个字符串的结尾。
因此,在大多数目标上,它是.asciz
的同义词。但显然在某些情况下,它是.ascii
的同义词。
有.string16
,.string32
和.string64
伪指令,可用于需要宽字符字符串的情况。在那种情况下,也许值得忍受零终止的含混不清,只要您知道它在ISA上的作用,那么您实际上就是用此源文件作为目标。我认为asciz
没有对应的内容。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。