2013-02-18 224 views
0

我在MIPS手冊中閱讀: 「注意我們使用」add immediate「指令的」無符號「版本,因爲我們正在處理一個地址,它是一個無符號的二進制數。不會因爲計算的地址跨越內存空間的中點而產生異常。「MIPS:使用堆棧

這是什麼意思?特別跨過內存空間的中點。

而且,在下面的代碼中,我不明白爲什麼它從8($ sp)跳到20($ sp)。代碼後來從12($ sp)和16($ sp)加載,但是什麼時候對這些內存部分做了些什麼。我想在JAL JILL中可能,但是沒有給出太多的解釋。

addiu $sp, $sp, -24 
sw $t1, 0($sp) 
sw $t2, 4($sp) 
sw $t3, 8($sp) 
sw $ra, 20($sp) 
jal JILL 
lw $ra, 20($sp) 
lw $t4, 12($sp) 
lw $t5, 16($sp) 
addiu $sp, $sp, 24 
+0

它不是一個「無符號加法」它是帶有「無符號溢出異常」的附加。加法操作本身並不知道這些位的解釋。 – 2013-02-19 05:03:07

回答

1

Assumming一個MIPS32架構,其具有32位的地址空間,存儲空間的中點。將地址0x80000000的(即2^31)。 在32位有符號(A2-補充)運算中,從0到0x7FFFFFFF的整數保留給正數,0x80000000到0xFFFFFFFF的整數保留給負數。

當您發出已簽名的添加時,如果添加的結果「交叉」該中點,則會發生溢出異常。但在你的例子中,你實際上處理的是內存地址,而不是有符號數......因此地址的符號(解釋爲32位數)是沒有意義的,所以你應該使用無符號加法。

關於你提到的第二個問題,你必須尋找到吉爾程序,看看會發生什麼......肯定有程序將存儲一些信息12($sp)16($sp)

+0

所以,如果我正確地理解了你的意思,那只是爲了防止由於補碼的加入而可能發生的溢出異常。關於第二個問題,上面的實現和JILL中的堆棧調整之間有什麼區別?在代碼和概念上會更困難嗎? – John 2013-02-18 16:07:18

+0

是的,只是爲了防止堆棧位於內存空間中點附近時可能出現的溢出異常。關於你的第二個問題,這一切都取決於用於調用其他過程的調用約定。在你的例子中,調用者爲被調用的過程保留堆棧空間以存儲結果,然後從調用者返回時程序使用結果並釋放使用的堆棧空間。由於某些寄存器需要由調用者保存($ t1,$ t2,$ t3和$ ra),因此您不能輕易將該行爲移至JILL過程。 – gusbro 2013-02-18 17:11:15

+0

您是否介意詳細說明最後一句話? – John 2013-02-18 18:22:36