2014-02-08 35 views
3

enter image description here有人可以和我一起走過這個MIPS代碼嗎?

enter image description here

我的第一個問題是

  1. 調整的堆棧空間時,爲什麼數字8選擇?我假設它意味着8個字節,但是如何確定需要調整8個字節?我知道我們應該爲所有參數(在本例中爲一個參數)分配足夠的空間,我也在猜測返回地址,但我們怎麼知道每個人需要多少字節?

  2. 我試圖通過代碼閱讀理解發生了什麼,但我感到困惑的

BEQ $ T0,$零,L1。

我從這裏知道我們分支到它說L1的地方,其中n減1,然後我很困惑。是否

JAL其實

意味着我們立即返回到它在頂部說的事實,但這次與參數爲n = 1而不是n = 2? [假設n = 2是我們的原始論證]在什麼時候我們到達代碼中它說要乘以$ a0和$ v0?

我真的很難過,包紮着我的大腦。如果我已經理解了,每次調用階乘函數,都會在堆棧中添加一個新的「堆棧幀」...每個幀將8個字節分配到堆棧中?並且每個新框架都包含一個返回地址以返回到調用它的過程。如果我正確理解這一點,我很難在代碼中看到它。

+2

如何把這裏的文字,而不是超大的圖像? – deviantfan

回答

1

enter image description here

回答1是在你的code's評論:
這個 「8」 取決於你的代碼,它是在圖片中的 「N」。

8字節,因爲你需要兩個值的地方。每個整數值有4個字節...
這些值是一個參數和返回地址。
(主叫用戶和被叫功能有兩個單獨的返回地址,
但在寄存器只有一個地方
所以調用者保存堆棧暫時在他的地址。)

關於beq: 正確。如果$t0$zero相等(即$t0的值爲0),則跳轉到L1

而關於jal ...
那麼,把它放在一個或兩個字:它是一個函數調用,不跳。

如果您沒有函數調用或跳轉,那麼您的代碼將自上而下處理,即每個指令。
想象一下,你在計算機中指出了你現在所處的位置。
因此,如果要處理jal,它將指向jal指令。
那裏發生了什麼:
你得到另一個指令指針的第一個指令的事實,
hile第一個仍然在jal
然後,第二個指針將自上而下的功能,
而第一個仍然是它的位置。
直到第二個指針到達他的末尾:jr
在那裏,第二個指針再次被移除,
第一個指針將繼續之前停止的位置。
...
「魔術師」關於遞歸是,第二指針可產卵第三
等他等...

+0

你描述得很好,真的很有幫助。 – FrostyStraw

相關問題