指令集與組合語言

針對沒有M擴充的RV32I CPU,編譯C語言的「a * b」(int與int相乘)時,一般會變成什麼?

  1. A變成呼叫以重複位移與加法來進行乘法的函式庫函式
  2. B因為無法使用乘法,所以發生編譯錯誤
  3. C直接輸出M擴充的mul指令,並在執行時自動追加
查看答案與解析

正確答案:A. 變成呼叫以重複位移與加法來進行乘法的函式庫函式

針對沒有乘法器的CPU,編譯器會將乘法替換為呼叫__mulsi3這類輔助函式庫的函式。這個函式以與直式計算相同的方法求積:逐一檢查其中一個數的位元,若為1就加上另一個數位移後的值。雖然能正確計算,但會比硬體乘法器慢數十倍。省略ISA的擴充,電路會變小,代價是處理變慢。

  • A. 正確。以軟體取代硬體來計算。
  • B. C語言的乘法在任何CPU上都能使用。
  • C. 執行不存在的指令,會變成非法指令例外。
練習這個領域 前往領域頁面

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

  1. 關於以前的MIPS等具備的分支延遲槽(branch delay slot,不論是否分支,緊接在分支指令之後的1個指令都會被執行的規定),下列何者正確?
  2. 在64位元的RV64I中執行lw指令時,讀入的32位元值是如何放入64位元暫存器的?
  3. 下列何者是對ABI(應用程式二進位介面)的正確說明?
  4. 使用C語言函式指標的呼叫「(*fp)(x)」,在RISC-V中一般是以下列哪個指令進行?
  5. 關於採用相同指令集架構(ISA)的兩顆CPU,下列何者正確?