C语言右移结果出错?

Solomon1588 Solomon1588 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
如题,我在取指令码中的寄存器号时用到掩码和右移,但是右移结果出错了。如下图:





unsigned long long INSN_LD(unsigned long long *pc){
*regFile.ir = (long long)(*( unsigned int *)(memBlock.memBase + *pc)); // 取指令

unsigned int rsNum = (*regFile.ir); // 截断long long 型数据低32位
printf("rsNum %x", rsNum);
rsNum = rsNum & RS_MASK;
rsNum = rsNum >> RS_RIGHT_SHIFT; // 右移21位
printf("rsNum %x", rsNum);// 指令与掩码按位与,取寄存器RS的号码。
printf("%x", rsNum);
unsigned short immediate = (unsigned short)(*regFile.ir); // 小端机,取指令的低2字节,就是偏移量。
int address = regFile.regBase[rsNum] + immediate; // 数据地址

unsigned int rtNum = *(unsigned int*)(*regFile.ir) >> RT_RIGHT_SHIFT; // 右移16位RT寄存器号
rtNum = rtNum & REG_NUM_MASK; // 目的寄存器号

regFile.regBase[rtNum] = *(long long *)(memBlock.memBase + address);
*pc += 4; // pc指向下一条指令的地址
return *pc;
}
...全文

相关推荐

评论 2
收藏 已收藏
分享
返回顶部
Solomon1588
C语言 70,039 成员 243,237 内容