如何快速判断十六进制转二进制后的MIPS指令为R型或I型
快速区分MIPS R型/I型指令:看前6位opcode就够了!
嘿,这个问题我当初刚学MIPS指令集的时候也卡过一阵子,其实核心判断逻辑超简单——只需要看二进制指令的前6位(最高位开始的6位)opcode!
核心判断规则
- 如果二进制指令的前6位是
000000:这绝对是R型指令!
这时候后面的26位会按照R型格式拆分:5位rs、5位rt、5位rd、5位shift amount、6位function code。换句话说,最后16位是「5位rd + 5位shift amount + 6位function code」的组合,不是立即数。 - 如果二进制指令的前6位不是
000000:那就是I型指令(如果排除J型的话,J型opcode是000010或000011,但你问的是R/I,所以不用管这个)!
这时候后面的26位会按照I型格式拆分:5位rs、5位rt、16位immediate amount。也就是最后16位直接就是立即数。
举两个实际例子
- R型指令示例:十六进制
0x00221820转二进制是000000 00001 00010 00011 00000 100000
前6位是000000,判定为R型。最后16位是00011 00000 100000,对应rd、shift amount、function code,这条是add $3, $1, $2指令。 - I型指令示例:十六进制
0x8C010004转二进制是100011 00000 00001 0000000000000100
前6位是100011(lw指令的opcode),非0,判定为I型。最后16位0000000000000100就是立即数,对应lw $1, 4($0)指令。
为什么这个方法靠谱?
MIPS指令集的设计就是这么直白:所有R型指令的opcode固定为全0,靠后面的function code区分具体操作;而所有I型指令都用非0的opcode来标识,根本不需要看后面的位就能快速区分。
内容的提问来源于stack exchange,提问作者Richie




