如何在 GNU ARM 汇编中保留未初始化的内存?

Aar*_*oin 2 assembly gcc arm gnu-arm

我在 Raspberry Pi 上使用 GCC 为我正在学习的课程编译一些汇编代码。根据我从GNU 汇编器参考中的信息了解到,我可以在 GNU ARM 汇编中重现以下 C 代码:

int num = 0;
Run Code Online (Sandbox Code Playgroud)

通过这样写:

        .data
num:    .word 0
Run Code Online (Sandbox Code Playgroud)

伟大的!现在我该怎么写呢?

int num;
Run Code Online (Sandbox Code Playgroud)

据我了解,像这样保留未初始化的变量意味着我应该将其视为包含之前内存位置中的任何垃圾值。因此,在以某种方式赋予它值之前,我不应该使用它。

但假设由于某种原因我打算在内存中存储大量数据,并且需要为其保留大量空间。在我看来,如果我无论如何都要用一些数据填充整个内存区域,那么将其初始化为某个值将是对资源的巨大浪费。然而,据我所知,如果不将其初始化为某个值,似乎无法在 GCC ARM Assembly 中创建标签。根据我的汇编教科书,.word指令后面可以有零个表达式,但如果以这种方式使用“那么地址计数器不会前进,并且不会保留任何字节”。我的第一个想法是使用“.space”或“.skip”指令,但对于该指令,甚至官方文档也说“如果省略逗号和填充,则假定填充为零”。

有没有办法让我保留一块内存而不在 GCC ARM Assembly 中初始化它?

Nat*_*dge 5

一般来说,不需要初始化的数据应该放在该.bss部分中。

    .bss
foobar:
    .skip 99999999
Run Code Online (Sandbox Code Playgroud)

这将在该部分中分配 99999999 字节.bss,标签foobar将是其地址。它不会使您的目标文件或可执行文件增大 99999999 字节;可执行文件头仅指示需要多少字节.bss,并且在加载时,系统分配适当的数量并将其初始化为零。

您无法跳过加载时零初始化。系统需要将其初始化为某些内容,因为否则它可能包含来自内核或其他进程的敏感数据。但是将内存清零非常快,并且内核将使用高效的算法,因此我不担心性能影响。它甚至可能在空闲时间清零页面,这样当你的程序加载时,已经有清零的内存可用。不管怎样,你的程序实际使用内存所花费的时间将会淹没它。

这意味着您还可以安全地用于.bss您确实想要初始化为零的数据(尽管不是任何非零值;如果您愿意,您必须像原始示例一样int foo = 3;将其放入。)。.data