指令集與組合語言

不呼叫其他函式的函式(葉函式、leaf function),在很多情況下不需要將ra保存到堆疊。下列何者是其理由?

  1. A因為葉函式不使用ret指令
  2. B因為葉函式的返回位址是由CPU自動堆入堆疊
  3. C因為不呼叫其他函式,ra不會被覆寫,返回位址會原封不動地保留
查看答案與解析

正確答案:C. 因為不呼叫其他函式,ra不會被覆寫,返回位址會原封不動地保留

ra會在每次呼叫函式的jal時被覆寫,所以呼叫其他函式的函式,必須一開始就將自己的返回位址保存到堆疊。葉函式不使用jal,所以ra不會被破壞,不必保存就能ret。此外,如果也不使用被呼叫端保存的暫存器,甚至不需要建立堆疊框(stack frame)。x86的call指令一定會將返回位址堆入堆疊,這是與RISC-V的差異。

  • A. 葉函式也是以ret返回。
  • B. RISC-V的jal只是把返回位址放入暫存器,不會堆入堆疊。
  • C. 正確。因為不使用會改寫ra的jal。
練習這個領域 前往領域頁面

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

  1. 下列何者是在RISC-V函式開頭執行「addi sp, sp, -16」的目的?
  2. 在RISC-V的標準呼叫慣例中,進入函式時的堆疊指標sp規定要對齊為16位元組的倍數。下列何者是最適當的理由?
  3. 上述程式碼是某個函式的開頭(序言,prologue)。下列何者是這個部分所做的事?
  4. 下列何者是在函式中使用框指標(frame pointer,RISC-V中為s0/fp)的優點?
  5. 在RISC-V中撰寫呼叫自己的遞迴函式時,若忘了將ra保存到堆疊,會發生什麼事?