Assembly GNU气体中的零是什么?

Assembly GNU气体中的零是什么?,assembly,gnu-assembler,Assembly,Gnu Assembler,在以下编译器输出中: a: .long 4 b: .byte 99 x: .zero 4 c: .byte 12 f: .zero 4 .zero指令是什么意思?这似乎是唯一一个没有列入名单的。从上面看,long是四个字节,.byte是一个字节,我猜.zero表示四个字节为零(或者指令后面的数字)。对吗 如果是这样,为什么不直接执行.long 0。这会把它放在不同的部分吗?不,它不会把它放在不同

在以下编译器输出中:

a:
        .long   4
b:
        .byte   99
x:
        .zero   4
c:
        .byte   12
f:
        .zero   4
.zero
指令是什么意思?这似乎是唯一一个没有列入名单的。从上面看,
long
是四个字节,
.byte
是一个字节,我猜
.zero
表示四个字节为零(或者指令后面的数字)。对吗


如果是这样,为什么不直接执行
.long 0
。这会把它放在不同的部分吗?

不,它不会把它放在不同的部分,它只是把它放在你当前创建的任何部分中

就其与
.long
的关系而言,后者实际上取决于体系结构。它可以是不同的大小和/或长度。请注意,endianness对于零值可能并不重要,但大小可能会有所不同

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

还请记住,作为
.skip
的别名,您还可以提供要用于字节的值(默认为零),但执行以下操作毫无意义:

.zero 4, 32

要生成四个空格:-)

理论上,您可以做一个
。字节0,0,0,…,0
。。。这在替换
.zero 1000
时不是很方便。
.zero
实际上可能位于不同的部分,因为Godbolt编译器资源管理器在默认情况下隐藏了指令。(不是因为
.zero
本身;只有
.common
.lcommon
在BSS中保留空间而不切换到它)。GCC和clang在
.bss
中放入零个初始化静态变量,否则
.data
.rodata
。我想他们只在BSS中使用
.zero
。@MartinRosenau:你可以把
.byte 0
放在
.rept
()中,谷歌搜索
气体。zero
是(在非旧手册中)最热门的:它是
的别名。skip
。在当前手册的目录中。(谷歌搜索“天然气手册”是我最近最喜欢的,但在谷歌知道我想要什么之前,我通常会在谷歌搜索“天然气手册”,因为chrome的URL栏可以通过键入“x86/”自动为我完成这一任务)