首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >.asciz和.string汇编程序指令有什么区别?

.asciz和.string汇编程序指令有什么区别?
EN

Stack Overflow用户
提问于 2016-04-26 02:00:00
回答 1查看 12.5K关注 0票数 11

我知道.ascii指令不会在字符串的末尾放空字符,因为.asciz指令就是用于这个目的的。但是,我不知道.string指令是否将空字符放在字符串的末尾。

如果它附加了空字符,那么.asciz.string指令之间有什么区别呢?对我来说,同时拥有.asciz.string似乎是多余的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-20 15:11:43

根据as

.ascii "string" (这里表示完整性)

.ascii期望零或多个字符串文字..。用逗号隔开。它将每个字符串(没有自动尾随零字节)组装成连续地址。

.asciz "string"

.asciz就像.ascii,但是每个字符串后面都是一个零字节。"z“在”.asciz“中代表”零“。

.string "str", .string8 "str", .string16 "str", .string32 "str", .string64 "str"

str中的字符复制到对象文件中。您可以指定多个要复制的字符串,用逗号分隔。除非为特定机器另行指定,否则汇编程序将每个字符串的结束标记为0字节。 ..。 变体string16string32string64不同于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,文档提到了两种行为不同的体系结构:

  • HPPA (HPPA)-不添加0,但有一个特殊的.stringz指令。
  • TI-C54X (德州仪器公司的DSP芯片)-零-填补每字的上8位(2字节).有一个相关的.pstring指令来打包字符和零填充未使用的空间。

通过gas/config文件夹中的源代码,我们可以确认这一点,并找到另外一个:

  • IA64 (英特尔架构)- .string.stringz的行为类似于HPPA。
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36854078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档