指令集與組合語言
使用C語言函式指標的呼叫「(*fp)(x)」,在RISC-V中一般是以下列哪個指令進行?
- A將函式的位址放入暫存器,以jalr跳到該暫存器的位址
- B在jal中以立即值寫入函式的位址後跳躍
- C以beq與函式的位址比較,相等就跳躍
查看答案與解析
正確答案:A. 將函式的位址放入暫存器,以jalr跳到該暫存器的位址
函式指標所指的目的地到執行時才會知道,所以無法使用把目的地寫在指令中的jal。因此,將指標的值載入暫存器,像「jalr ra, 0(t0)」這樣跳到暫存器的位址,返回位址則留在ra。C++的虛擬函式或共用函式庫中函式的呼叫,也是類似的間接呼叫。由於目的地會變動,CPU會以間接分支預測器來預測目的地。
- A. 正確。是目的地在執行時才決定的間接呼叫。
- B. jal的目的地固定在指令中,無法在執行時改變。
- C. beq是條件分支,不用於函式的呼叫。