我正在尝试用 C 语言向我的管道模拟器实现跳转指令。我一直在阅读mips的J-Instruction,并看到它由26位imm和6位操作码构成。经过一些进一步的阅读后,我发现可以使用此
计算跳转指令的地址PC <- PC31-28::IR25-0::00
我不完全确定如何用 C 语言实现这一点。在计算前阶段时,我一直在尝试类似下面的代码,但它对我不起作用。
if(idStage.instruction.type == J)
{
ifStage.pc = ifStage << idStage.instruction.imm;
ifStage.pc = IfStage << 2;
}
我怎样才能用 C 语言实现PC&lt; - PC31-28 :: IR25-0 :: 00?
答案 0 :(得分:1)
这将是
ifStage.pc = (ifStage.pc & 0xF0000000) | (idStage.instruction.imm << 2);
即:取当前PC,应用AND掩码保持位28..31,然后应用OR掩码,立即移位器2位置左侧。 假设idStage.instruction.imm是立即26位。如果它可以在高位(26..31)中保存“垃圾”,那么你将应用另一个AND掩码:
ifStage.pc = (ifStage.pc & 0xF000) | ((idStage.instruction.imm & 0x3FFFFFF) << 2);