我不明白的 Risc-v 指令

Raz*_*wad 3 instruction-set riscv

我有这个 risc v 代码:

lui S0, 0x1234
ori S1, S0, 0x5678
add S2, S1, S1
Run Code Online (Sandbox Code Playgroud)

问题问我,“寄存器 S2 保存什么?” 这个问题解释了这一点lui,我引用:

"将立即数 imm 的低半字加载到寄存器 rt 的高半字中。寄存器的低位设置为 0 "

我不知道如何“编译这个程序”,0x1234 是什么意思?谢谢

dop*_*ane 6

一次一个听指令。首先是load-upper-immediate,取出立即数 ( 0x1234) 并将其“加载”到S0寄存器的上半部分,并将下半部分清零:

lui S0, 0x1234 

S0 = 0x12340000
Run Code Online (Sandbox Code Playgroud)

接下来是or-immediate,我们 OR 中的值S0与 value 0x5678

ori S1, S0, 0x5678

   0x12340000
OR 0x00005678
   ----------
   0x12345678 = S1
Run Code Online (Sandbox Code Playgroud)

最后是add,我们将 S1 中的值与其自身相加,或者等效地,将 S1 中的值乘以 2:

add S2, S1, S1

  0x12345678
+ 0x12345678
  ----------
  0x2468ACF0 = S2
Run Code Online (Sandbox Code Playgroud)

所以S2寄存器中的值为0x2468ACF0。请注意,我假设是 32 位字。立即数类似于常量,lui将常量放入寄存器上半部分的指令也是如此。与 结合使用ori,您可以将整个字立即加载到寄存器中。