MIPS中

时间:2016-11-04 05:17:10

标签: assembly compiler-construction mips

我想知道如何指定从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

我理解这个概念吗?

1 个答案:

答案 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部分归零。