GNU gas 中的 .zero 是什么?

4
在下面的编译器输出中:
a:
        .long   4
b:
        .byte   99
x:
        .zero   4
c:
        .byte   12
f:
        .zero   4

什么是.zero 指令?它似乎是唯一没有列在gas指令中的指令。从上面的内容看,long代表4字节,.byte代表1字节,我猜.zero意味着零占四个字节(或者指令后面的数字是多少就占几个字节)。这正确吗?
如果这样的话,为什么不直接使用.long 0呢?这会将其放在不同的部分还是其他原因?

1
谷歌搜索“gas“.zero”会出现https://sourceware.org/binutils/docs/as/Zero.html(在非旧手册中)作为最高点击率:它是“.skip”的别名。 它也在当前手册的目录中。 https://sourceware.org/binutils/docs/as/. (对我来说,“gas manual”在谷歌上是最高点击率,但在谷歌学习我想要什么之前,我通常通过在https://stackoverflow.com/tags/x86/info中搜索“gas manual”来到达那里,因为chrome的URL栏会轻松地自动完成这个过程,只需键入“x86 /”。) - Peter Cordes
1个回答

8

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

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

另一方面,.zero指令是.skip(以及某些体系结构上的.space)的别名,并生成请求的字节数,而与体系结构无关。

还要记住,作为.skip的别名,您还可以提供要用于字节的(默认为零),但这样做可能没有太多意义:

.zero 4, 32

生成四个空格 :-)


1
理论上,你可以使用.byte 0, 0, 0, 0, ..., 0来代替.zero 1000,但这并不是很方便。 - Martin Rosenau
1
.zero实际上可能位于不同的部分,因为Godbolt编译器资源管理器默认隐藏了指令。(这并不是由于.zero本身;只有.common.lcommon在不转换到BSS的情况下在其中保留空间)。GCC和clang将零初始化的静态变量放在.bss中,否则放在.data.rodata中。我认为他们只在BSS中使用.zero - Peter Cordes
2
@MartinRosenau:你可以将.byte 0放在一个.rept中(https://sourceware.org/binutils/docs/as/Rept.html)。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接