我想知道如何指定从C到MIPS的变量声明,如果我不初始化它们的话。我想通过初始化它会是这样的:
# C code
int x = 7;
# MIPS code
.data
x: .word 7
但是,如果我的C代码看起来像这样:
int x;
void main() {
.
.
x = 7;
.
.
}
在声明' x'时,我应该在堆栈指针($ sp)中投入一些内存,然后将指针移回' x'当我把它分配到7?如果是的话,我怎么知道增加指针的数量以达到' x'的位置?在$ sp?据我所知,在分配' x'之前已经发生了很多工作人员。到7。
修改
对此感到抱歉。我的问题并非专门针对全球变量。所以代码也可以是这样的:
void main() {
.
.
int x;
.
.
x = 7; # or simply x;
.
.
}
正如人们在评论中提到的那样,它需要分配堆栈。所以我想我的问题是关于增加堆栈指针所需的数量。我应该以某种方式记住偏移到" x"每次我想使用它,我都会这样做:
addi $sp, $sp, x_offset
lw $t0, 0($sp)
addi $sp, $sp, -x_offset
我理解这个概念吗?
答案 0 :(得分:2)
我不明白为什么x
将在第二种情况下进行堆栈分配。它仍然是一个全局变量。
如果要在数据部分中保留一些空格而不明确赋予它任何值,请使用.space
指令(假设使用了GNU汇编程序):
.data
x: .space 4 # reserve space for 4 bytes == 1 word
我相信x
在这种情况下保证初始值为0。
请注意,x
仍会占用目标文件/可执行文件中的空间。如果您想避免未初始化的变量占用可执行文件中的空格,请将它们放在.bss
部分,并使用.comm
/ .lcomm
保留空间:
.bss
.lcomm x,4
然后,您的启动代码(crt0
或您正在调用的任何代码)中通常会包含一些代码,这些代码会在启动时将整个.bss
部分归零。