簡體   English   中英

MIPS中堆棧/幀指針的可變偏移量

[英]variable offsets from stack/frame pointer in MIPS

如果我不初始化變量,我想知道如何從C到MIPS指定變量聲明。 我想通過初始化可以像這樣:

# C code
int x = 7;

# MIPS code
.data
x: .word 7

但是,如果我的C代碼看起來像這樣:

int x;

void main() {
.
.
x = 7;
.
.
}

我應該在聲明'x'時在堆棧指針($ sp)中投入一些內存,然后在將其分配給7時將指針移回'x'嗎? 如果是,我如何知道要增加多少指針才能到達$ sp中的“ x”位置? 據我所知,在將“ 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

我理解這個概念對嗎?

我不明白為什么在第二種情況下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部分歸零。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM