指令集與組合語言

在RISC-V中,要將無法收進12位元立即值的32位元常數(例:0x12345678)放入暫存器,一般的方法是下列何者?

  1. A使用一次addi,直接寫入32位元的立即值
  2. B以lui設定高20位元,再以addi加上低12位元
  3. C因為無法使用常數,所以必須從輸入讀取
查看答案與解析

正確答案:B. 以lui設定高20位元,再以addi加上低12位元

lui(load upper immediate)會將20位元的立即值放在暫存器的位元31~12,並將低12位元設為0。接著以addi加上低12位元,就能產生任意的32位元常數。在組合語言中寫下「li a0, 0x12345678」時,組譯器會視需要將其展開為這兩個指令。在指令長度固定的ISA中,將大的常數分開來產生是一般的做法。

  • A. 32位元的指令放不下32位元的立即值。
  • B. 正確。虛擬指令li也會展開為這個組合。
  • C. 用兩個指令就能產生,也可以放在記憶體中再讀取。
練習這個領域 前往領域頁面

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

  1. 在RISC-V中以lui與addi兩個指令產生常數0x12345FFF時,正確的組合是下列何者?
  2. 下列何者是RISC-V的auipc指令(add upper immediate to PC)的動作?
  3. 在RISC-V(RV32I)中執行「addi t0, zero, -1」之後,t0中存放的32位元值是下列何者?
  4. 記憶體上的1個位元組存放著0x80。以RISC-V的lb指令與lbu指令將此位元組載入32位元暫存器時,下列何者是兩者的值的正確組合?
  5. 關於條件分支的機制,下列何者是RISC-V與x86的差異?