assembly 如何连接类型B RISC-V指令的立即值?

lc8prwob  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(116)

我有以下来自RISC-V指令的二进制文件,我需要解码:11111110000011100001100011100011
使用RISC-V参考卡,我知道以下信息:

  • 它的opcode1100011,意味着它是B类型格式指令
  • 它的funct3001 = 0x1,意思是bne(分支!=)
  • 寄存器rs111100 = x28t3
  • 寄存器rs200000 = x0zero

到目前为止,该指令看起来应该像bne t3 zero,但我缺少立即值。我有以下内容:

  • imm[12] = 1
  • imm[11] = 1
  • imm[10:5] = 111111
  • imm[4:1] = 1000

我无法理解这些应该如何连接/排序,以获得指令的立即值。我假设的是111111111000,但从那里我该怎么做呢?

ut6juiuv

ut6juiuv1#

是的,没错:立即数的位12、11、10到5以及4到1是指令中的单独字段。

位0隐式为0,因为分支目标总是以2对齐(2字节压缩指令是一个东西),所以你会错过一个低0。换句话说,在你现在拥有的值上左移1。

按照您所做的顺序(使用imm[0]=0)将它们放在一起,将符号扩展到32位或64位,然后查阅说明文档以了解其含义。(RISC-V立即操作数始终是符号扩展的,而不是零扩展的。
在这种情况下,它是一个相对位移,IIRC相对于分支指令的开始,不像在其他一些ISA中,它通常是相对于结束。
一般来说,请参阅 * RISC-V: Immediate Encoding Variants *,了解立即字段所在的图表,以及设计决策将其分解为不同指令格式的基本原理。(最小化用于解码不同指令格式的多路复用器和门延迟,例如,使得符号扩展能够立即无条件地从指令字的顶部位开始。
还涉及:How exactly does the RISC-V immediate encoding notation work?

相关问题