指令集與組合語言
不呼叫其他函式的函式(葉函式、leaf function),在很多情況下不需要將ra保存到堆疊。下列何者是其理由?
- A因為葉函式不使用ret指令
- B因為葉函式的返回位址是由CPU自動堆入堆疊
- C因為不呼叫其他函式,ra不會被覆寫,返回位址會原封不動地保留
查看答案與解析
正確答案:C. 因為不呼叫其他函式,ra不會被覆寫,返回位址會原封不動地保留
ra會在每次呼叫函式的jal時被覆寫,所以呼叫其他函式的函式,必須一開始就將自己的返回位址保存到堆疊。葉函式不使用jal,所以ra不會被破壞,不必保存就能ret。此外,如果也不使用被呼叫端保存的暫存器,甚至不需要建立堆疊框(stack frame)。x86的call指令一定會將返回位址堆入堆疊,這是與RISC-V的差異。
- A. 葉函式也是以ret返回。
- B. RISC-V的jal只是把返回位址放入暫存器,不會堆入堆疊。
- C. 正確。因為不使用會改寫ra的jal。