指令集與組合語言
在RISC-V中,要將無法收進12位元立即值的32位元常數(例:0x12345678)放入暫存器,一般的方法是下列何者?
- A使用一次addi,直接寫入32位元的立即值
- B以lui設定高20位元,再以addi加上低12位元
- 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. 用兩個指令就能產生,也可以放在記憶體中再讀取。