【问题标题】:What is zero in GNU gas?GNU gas 中的零是多少?
【发布时间】:2021-04-14 20:54:41
【问题描述】:

在以下编译器输出中:

a:
        .long   4
b:
        .byte   99
x:
        .zero   4
c:
        .byte   12
f:
        .zero   4

.zero 指令是什么意思?它似乎是唯一没有在gas directives 中列出的。从上面看,long 是四个字节,.byte 是一个字节,我猜.zero 表示四字节为零(或指令后面的任何数字)。对吗?

如果是这样,为什么不直接使用.long 0。这是否将其放在不同的部分或其他地方?

【问题讨论】:

标签: assembly gnu-assembler


【解决方案1】:

不,它不会将其放在不同的部分中,它只是将其内嵌在您当前正在创建的任何部分中。

就其与.long的关系而言,后者实际上取决于架构。它可能是不同的大小和/或字节序。请注意,字节序对于零值可能无关紧要,但大小可能。

另一方面,.zero 指令是 .skip 的别名(以及 一些 架构上的 .space),并生成请求的字节数不管 的架构。

还请记住,作为.skip 的别名,您还可以提供您希望用于字节的(默认为零),但是这样做没有什么意义:

.zero 4, 32

生成四个空格:-)

【讨论】:

  • 理论上,你可以做一个.byte 0, 0, 0, 0, ..., 0 ...替换.zero 1000时不是很方便。
  • .zero 实际上可能 be 在不同的部分,因为 Godbolt 编译器资源管理器默认隐藏的指令。 (不是因为.zero 本身;只有.common.lcommon 在BSS 中保留空间而不切换到它)。 GCC 和 clang 将零初始化的静态变量放入 .bss,否则放入 .data.rodata。我认为他们只在 BSS 中使用.zero
  • @MartinRosenau:您可以将.byte 0 放入.rept (sourceware.org/binutils/docs/as/Rept.html)
猜你喜欢
  • 2019-05-16
  • 2011-09-13
  • 2014-05-27
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
相关资源
最近更新 更多