我需要解码来自 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
的东西,但是我该怎么办?
是的,这是正确的:立即数的位 12、11、10 到 5 以及 4 到 1 是指令中的单独字段。
位 0 隐式为零,因为分支目标始终按 2 对齐(2 字节压缩指令是一回事),因此您缺少低 0。换句话说,对您拥有的值左移 1现在。
按照您所做的那样将它们放在一起(使用
imm[0]=0
),符号扩展为 32 或 64 位,然后查阅文档中的说明以了解其含义。 (RISC-V 立即数操作数始终进行符号扩展,而不是零扩展。)
在这种情况下,它是相对位移,IIRC 相对于分支指令的开始,与其他一些 ISA 不同,它通常相对于结束。