我有以下来自RISC-V指令的二进制文件,我需要解码:11111110000011100001100011100011
使用RISC-V参考卡,我知道以下信息:
- 它的
opcode
是1100011
,意味着它是B类型格式指令 - 它的
funct3
是001
=0x1
,意思是bne
(分支!=) - 寄存器
rs1
为11100
=x28
或t3
- 寄存器
rs2
为00000
=x0
或zero
到目前为止,该指令看起来应该像bne t3 zero
,但我缺少立即值。我有以下内容:
imm[12]
=1
imm[11]
=1
imm[10:5]
=111111
imm[4:1]
=1000
我无法理解这些应该如何连接/排序,以获得指令的立即值。我假设的是111111111000
,但从那里我该怎么做呢?
1条答案
按热度按时间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?