指令集與組合語言

在RISC-V中撰寫呼叫自己的遞迴函式時,若忘了將ra保存到堆疊,會發生什麼事?

  1. Ara在內層的呼叫中被覆寫,外層的函式無法返回正確的呼叫端
  2. BCPU會自動保存ra,所以不會有任何問題
  3. C無論遞迴的深度,計算結果都會變成2倍
查看答案與解析

正確答案:A. ra在內層的呼叫中被覆寫,外層的函式無法返回正確的呼叫端

遞迴呼叫的jal會將ra覆寫為「自己內部呼叫的下一個指令」。若沒有保存,外層的函式在ret時就不會回到原本的呼叫端,而是回到自己內部,導致重複相同的地方或發生錯誤動作。因此,呼叫其他函式的函式,規定要在序言將ra保存到堆疊,並在結尾還原。

  • A. 正確。會一直回到自己內部的jal之後。
  • B. RISC-V的jal只是改寫ra。
  • C. 結果並不會變成固定的倍數。
練習這個領域 前往領域頁面

指令集與組合語言的其他題目

  1. 在小端序(little-endian)的RISC-V中,以「sw」將存放0x12345678的暫存器寫入位址0x100。之後以「lbu」讀取位址0x101的1個位元組,值是多少?
  2. 在RISC-V中,當讀取4個位元組的lw指令的位址不是4的倍數(邊界未對齊)時,下列何者是可能發生的事?
  3. RISC-V的指令「slli t0, a0, 3」的結果,t0會是a0之值的幾倍?(不考慮溢位)
  4. a0存放int型(4位元組)陣列a的起始位址,a1存放索引i。下列何者是上述程式碼讀入a2的內容?
  5. 關於x86的「add eax, [rbx]」這種運算指令可以直接使用記憶體上的值的方式,下列何者正確?