【发布时间】:2019-08-25 16:19:15
【问题描述】:
我在我的 Raspberry Pi 上使用 GCC 来为我正在学习的课程编译一些汇编代码。根据GNU Assembler Reference 中的信息,我了解到我可以在 GNU ARM 程序集中重现以下 C 代码:
int num = 0;
这样写:
.data
num: .word 0
太棒了!现在我该怎么写呢?
int num;
我的理解是,像这样保持未初始化的变量意味着我应该将其视为包含之前内存位置中的任何垃圾值。因此,在我以某种方式赋予它一个值之前,我不应该使用它。
但是假设出于某种原因我打算在内存中存储大量数据并且需要为其预留大量空间。在我看来,如果我无论如何都要用一些数据填充它,那么将整个内存区域初始化为某个值将是一种巨大的资源浪费。然而,据我所知,如果不将其初始化为某个值,似乎无法在 GCC ARM 程序集中制作标签。根据我的assembly textbook,.word 指令后面可以有零个表达式,但如果以这种方式使用,“那么地址计数器不会提前,也不会保留任何字节。”我的第一个想法是改用“.space”或“.skip”指令,但对于这个指令,甚至official documentation 都说“如果省略了逗号和填充,则假定填充为零。”
我没有办法在 GCC ARM Assembly 中不初始化就保留一块内存吗?
【问题讨论】:
-
在全局范围内的 C 中,
int num;和int num = 0;完全是同义词。 ISO C 保证静态存储是零初始化的,如果没有显式初始化为其他东西。 Are global variables always initialized to zero in C? 一些嵌入式编译器可能会让您在系统启动时通过一些特殊选项避免将部分 BSS 归零。例如。gcc -mno-clearbss是 Microblaze 的一个选项。可能对gcc -fno-zero-initialized-in-bss有用,尽管我认为这会影响int foo与int foo=0;相同。