指令集與組合語言
在RISC-V中撰寫呼叫自己的遞迴函式時,若忘了將ra保存到堆疊,會發生什麼事?
- Ara在內層的呼叫中被覆寫,外層的函式無法返回正確的呼叫端
- BCPU會自動保存ra,所以不會有任何問題
- C無論遞迴的深度,計算結果都會變成2倍
查看答案與解析
正確答案:A. ra在內層的呼叫中被覆寫,外層的函式無法返回正確的呼叫端
遞迴呼叫的jal會將ra覆寫為「自己內部呼叫的下一個指令」。若沒有保存,外層的函式在ret時就不會回到原本的呼叫端,而是回到自己內部,導致重複相同的地方或發生錯誤動作。因此,呼叫其他函式的函式,規定要在序言將ra保存到堆疊,並在結尾還原。
- A. 正確。會一直回到自己內部的jal之後。
- B. RISC-V的jal只是改寫ra。
- C. 結果並不會變成固定的倍數。