我知道.ascii
指令不会在字符串的末尾放空字符,因为.asciz
指令就是用于这个目的的。但是,我不知道.string
指令是否将空字符放在字符串的末尾。
如果它附加了空字符,那么.asciz
和.string
指令之间有什么区别呢?对我来说,同时拥有.asciz
和.string
似乎是多余的。
发布于 2019-12-20 15:11:43
根据as
.ascii "string"
(这里表示完整性)
.ascii
期望零或多个字符串文字..。用逗号隔开。它将每个字符串(没有自动尾随零字节)组装成连续地址。
.asciz
就像.ascii
,但是每个字符串后面都是一个零字节。"z
“在”.asciz
“中代表”零“。
.string "str", .string8 "str", .string16 "str", .string32 "str", .string64 "str"
将
str
中的字符复制到对象文件中。您可以指定多个要复制的字符串,用逗号分隔。除非为特定机器另行指定,否则汇编程序将每个字符串的结束标记为0字节。 ..。 变体string16
、string32
和string64
不同于string
伪操作码,因为从str
复制并扩展到16位、32位或64位的每个8位字符。扩展字符按目标字节顺序存储。
总结一下,.string
和.asciz
的不同之处
.string
不会添加空字节,而.asciz
总是会添加空字节。要测试您自己的系统,可以这样做:
echo '.string“-- gcc -c -o stdout.o -xassembler -;objdump -sj .text stdout.o
如果第一个字节是00
,则插入空字符。.string
也有后缀以将字符展开到特定宽度(16、32或64),但默认情况下为8。正如问题的注释中所述,在简单的用例中,除了语义之外,没有什么不同。它们都支持转义序列并接受多个参数。然而,从技术上讲,这两个伪操作由预处理程序处理不同,而不是别名。(与.zero
和.skip
相比,它们是别名。)
关于.string
,文档提到了两种行为不同的体系结构:
.stringz
指令。.pstring
指令来打包字符和零填充未使用的空间。通过gas/config
文件夹中的源代码,我们可以确认这一点,并找到另外一个:
.string
和.stringz
的行为类似于HPPA。https://stackoverflow.com/questions/36854078
复制相似问题