[英]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.