指令集與組合語言

RISC-V的虛擬指令「ret」,實際上是以下列哪一個指令執行的?

  1. Ajal ra, 0
  2. Bjalr x0, 0(ra)
  3. Clw ra, 0(sp)
查看答案與解析

正確答案:B. jalr x0, 0(ra)

jalr(jump and link register)會跳躍到暫存器的值加上位移的位址,並將下一個指令的位址放入寫入目的地。ret是「jalr x0, 0(ra)」,跳到ra的位址,並將連結捨棄到x0。jalr也用於函式指標或虛擬函式的呼叫這類在執行時才決定目的地的跳躍。還原ra的「lw ra, …」是在ret之前進行的準備。

  • A. 會覆寫ra,導致無法返回。
  • B. 正確。跳到ra的位址,並捨棄返回位址。
  • C. 只是從記憶體讀取ra,並不會返回。
練習這個領域 前往領域頁面

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

  1. 下列何者是制定呼叫慣例(calling convention)的主要目的?
  2. 在RISC-V的標準呼叫慣例中,下列何者是用於傳遞整數引數與回傳值的暫存器?
  3. 在RISC-V的標準呼叫慣例中,呼叫一個有10個整數引數的函式時,第9個與第10個引數是在哪裡傳遞?
  4. 在RISC-V的呼叫慣例中,s0~s11被視為「被呼叫端保存(callee-saved)」的暫存器,下列何者是其意義?
  5. 在RISC-V的呼叫慣例中,t0~t6是「呼叫端保存(caller-saved)」的暫存器。當某個函式想在呼叫另一個函式之後,仍使用放在t0的值時,下列何者是正確的處理?