指令集與組合語言

在RISC-V的呼叫慣例中,t0~t6是「呼叫端保存(caller-saved)」的暫存器。當某個函式想在呼叫另一個函式之後,仍使用放在t0的值時,下列何者是正確的處理?

  1. A什麼都不做,被呼叫的函式也必定會將t0還原
  2. Bt0不會被其他函式改寫,所以可以直接使用
  3. C在呼叫前將t0的值退避到堆疊等處,呼叫後再還原
查看答案與解析

正確答案:C. 在呼叫前將t0的值退避到堆疊等處,呼叫後再還原

t系列的暫存器,約定被呼叫的函式可以不保存而自由使用。因此,若呼叫之後仍需要該值,呼叫端必須自行先退避。將保存的責任依暫存器分配給呼叫端與被呼叫端,許多函式就能不費保存的功夫而使用暫時用的暫存器,也能減少整體保存與還原的次數。

  • A. t系列是被呼叫端可以自由破壞的暫存器。
  • B. 任何函式都能自由使用t0。
  • C. 正確。或是一開始就放在會被保存的s暫存器。
練習這個領域 前往領域頁面

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

  1. 不呼叫其他函式的函式(葉函式、leaf function),在很多情況下不需要將ra保存到堆疊。下列何者是其理由?
  2. 下列何者是在RISC-V函式開頭執行「addi sp, sp, -16」的目的?
  3. 在RISC-V的標準呼叫慣例中,進入函式時的堆疊指標sp規定要對齊為16位元組的倍數。下列何者是最適當的理由?
  4. 上述程式碼是某個函式的開頭(序言,prologue)。下列何者是這個部分所做的事?
  5. 下列何者是在函式中使用框指標(frame pointer,RISC-V中為s0/fp)的優點?