我遇到了一些问题,我尝试将 32 位二进制文件解码为 RISCV 架构集中的 SB 型指令
我已经移动了操作码、imm、rs1、rs2 和 rd 值,但未能获得正确的 IMM 值
例如下面的 32 位二进制
11111110000001111001101011100011
立即值是-12,但是在我的实现中
int type_sb_imm(unsigned char* p) {
// Extract the 32-bit instruction from the byte array
unsigned int opcode = (((unsigned int)p[0]) << 24) |
(((unsigned int)p[1]) << 16) |
(((unsigned int)p[2]) << 8) |
((unsigned int)p[3]);
// Extract the immediate value from the instruction (Type SB: branch)
unsigned int uimm = ((opcode >> 7) & 0x1F) | // imm[4:1]
((opcode >> 20) & (0x7F << 5)) | // imm[11:5]
((opcode << 4) & (1 << 11)) | // imm[12]
((opcode << 19) & (0x1F << 12)); // imm[10:5]
// Sign-extend the immediate value to 32 bits
int imm = uimm;
if (imm & 0x1000) {
imm |= 0xFFFFE000;
}
return imm;
}
返回的立即数是4085,请问我哪里出错了?
以最高评论为序...
创建一个使用表定义位的函数(例如):
imm = bitmask(opcode,31,25,5) | bitmask(opcode,11,7,0);
这是我快速完成的一些示例代码(因为您的时间压力)。我在
gdb
下运行它,我 认为 我得到了 mask
一代正确 - 但不能保证:
#include <stdio.h>
typedef unsigned int u32;
u32
bitmask(u32 opc,u32 bhi,u32 blo,u32 shfl)
{
u32 val = opc >> blo;
u32 mask = 0xFFFFFFFF >> 31 - (bhi - blo);
val &= mask;
val <<= shfl;
return val;
}
int
main(void)
{
u32 opc = 0xF0FFFF0A;
u32 imm = 0;
imm |= bitmask(opc,31,25,5);
imm |= bitmask(opc,11,7,0);
printf("%8.8X/%u\n",imm,imm);
return 0;
}
请注意,如果您制作函数
inline
并且仅传递常量位值和移位,编译器优化器将生成高效代码。