2016-11-04 30 views
0

我在想如何指定從C到MIPS的變量聲明,如果我不初始化它們的話。我想這與初始化它會是這樣的:MIPS中堆棧/幀指針的可變偏移

# C code 
int x = 7; 

# MIPS code 
.data 
x: .word 7 

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

int x; 

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

,我要用來堆棧指針一些內存($ SP)當聲明'x'時,然後在將指針分配給7時將指針移回'x'?如果是的話,我怎麼會知道要增加指針以達到$ sp中'x'的位置?據我所知,員工的很多已經到7

編輯分配「X」以前也發生過:

很抱歉的混亂。我的問題不是關於全局變量。所以代碼也可以是這樣的:

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

順便說一句,爲什麼你不使用'gcc -O0 -S codeTest.c'來觀察編譯器如何以非天真的非優化方式來執行它,只需輸出一些代碼(相當於代表解析的內部編譯器結構C源)?您可能還想嘗試用'-O3'來看看它如何切換這個數據樹以發出「最佳」(編譯器最好)機器代碼以達到相同的結果。 – Ped7g

回答

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部分歸零。

+0

謝謝。我不知道.space。我喜歡這個主意。但是如果在主函數中聲明'x'會怎麼樣呢?另外,如果我理解正確,C允許多個同一變量的聲明,只要它們不在同一個範圍內即可。如果在主函數內部和外部聲明'x'會怎麼樣?如果在我的代碼生成器中,我打印兩次「x:.space 4」,是不是會在MIPS中發生錯誤? – Babak

+0

我的答案是關於未初始化的全局變量。局部變量將被堆棧分配(除了靜態局部變量)。 – Michael

+0

@範圍內聲明的@Babak在本地範圍內是本地的(通常編譯爲堆棧變量,但這不是C語言所要求的,編譯器也可能決定將它放入'.data/.bss'中(但這沒有意義)或者像CPU寄存器一樣保存(可以在現實世界中發生)當你在不同的作用域中聲明兩次'x'時,它們實際上是不同的變量(C編譯器沒有問題在特定範圍內選擇正確的一個,對於機器對於讀者來說很容易,更糟糕的是)在大多數彙編程序中,如果定義了符號名稱,則無法執行相同的特技操作 - 對於該ASM文件而言,通常是全局的 – Ped7g