MIPS-32中beq指令偏移量计算疑问求助
搞懂MIPS-32
beq指令的偏移量计算:你的疑问拆解 嘿,刚接触MIPS确实容易在分支指令的偏移量这里踩坑,我来一步步帮你理清逻辑,解决你的疑问:
先纠正个小细节(不影响核心,但得说清楚)
你提到$a0=00100、$a1=00101,这个寄存器编号是对的($a0对应寄存器4,$a1对应寄存器5),咱们重点看偏移量的计算逻辑。
MIPS分支指令的核心规则:偏移量是怎么来的?
MIPS的beq这类分支指令,偏移量不是直接填目标地址,而是基于「延迟槽后的PC值」计算的相对偏移,这里的关键规则有两个:
- 当CPU执行
beq指令时,PC已经自动更新为「当前指令地址 + 4」(也就是下一条指令的地址) - 偏移量的单位是字(4字节),最终会被编码成16位的有符号整数
用公式表示就是:
目标地址 = (当前PC + 4) + (偏移量 × 4)
反过来算偏移量的话,就是:
偏移量 = (目标地址 - (当前PC + 4)) ÷ 4
代入你的数值算一遍
现在把你的数据套进去:
- 当前PC(也就是这条
beq指令所在的地址):0x0040122C - 目标地址:
0x00401200
第一步:计算当前PC + 40x0040122C + 4 = 0x00401230
第二步:算目标地址和这个值的差值0x00401200 - 0x00401230 = -0x30(转换成十进制就是-48)
第三步:除以4(因为偏移量按字算,1字=4字节)-0x30 ÷ 4 = -0xC(十进制就是-12)——这就是答案里的偏移量啦!
为什么你之前的二进制编码不对?
你之前写的二进制里偏移量是0001 0010 0000 0000,这是把目标地址直接当成了偏移量,但实际上分支指令的偏移量不是目标地址本身,而是按上面规则算出的相对偏移。
正确的beq指令二进制应该是:000100 | 00100 | 00101 | 1111 1111 1111 0100
最后16位是-12的16位补码(十进制-12的补码就是0xFFF4,对应二进制1111111111110100)。
最后再划个重点
- 分支偏移是相对于
当前PC+4,不是当前PC本身 - 偏移量的单位是字,所以必须把字节差值除以4
- 偏移量是16位有符号数,负数要用补码表示
内容的提问来源于stack exchange,提问作者Winson T.
相关产品推荐
相关产品推荐

