You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从MIPS的bne指令中获取立即数/分支偏移量及目标地址?

MIPS中bne指令立即数与目标地址的获取步骤

示例代码

slt $t2, $t5, $t0 <---- 0x04001248 (PC) [Memory Address]
        bne $t2, $s4, ELSE
        lw $s4, 120($s1)
        j DONE
  ELSE: addi $t2, $t2, -100
  DONE: nop

已知信息

bne指令的字段值:

  • op: 000101(bne操作码)
  • rs: 01010(对应寄存器$t2)
  • rt: 01100(对应寄存器$s4)

一、获取bne指令的立即数

  1. 从bne指令的32位机器码中提取低16位,这部分就是以补码形式存储的立即数字段。
  2. 对该16位补码执行符号扩展:若最高位为1(表示负数),则将高位16位全部补1;若最高位为0(表示正数),则高位16位全部补0,得到32位的偏移量。

二、获取bne指令的目标地址

MIPS分支指令采用相对寻址,计算步骤如下:

  1. 计算bne指令自身的PC值:示例中前一条slt指令地址为0x04001248,MIPS指令长度为4字节,因此bne的PC值为 0x04001248 + 4 = 0x0400124C。
  2. 计算PC+4:即bne指令的下一条指令地址,值为 0x0400124C + 4 = 0x04001250。
  3. 将步骤一中得到的32位偏移量左移2位:由于MIPS以字节寻址,分支偏移量按字(4字节)为单位,左移2位可将其转换为字节偏移量。
  4. 目标地址 = (PC + 4) + (左移后的偏移量)。

三、关于负十六进制值的疑问

得到负十六进制值是正常现象,并非方法错误:
bne的立即数字段以补码形式存储,当分支目标位于PC+4的**前向(地址更小的方向)**时,偏移量为负数,对应的十六进制表示最高位为1,呈现负数值。只要严格按照上述步骤计算,最终得到的目标地址会是正确的。


内容的提问来源于stack exchange,提问作者Adriel Orlando Johan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 20:34:53