如何从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指令的立即数
- 从bne指令的32位机器码中提取低16位,这部分就是以补码形式存储的立即数字段。
- 对该16位补码执行符号扩展:若最高位为1(表示负数),则将高位16位全部补1;若最高位为0(表示正数),则高位16位全部补0,得到32位的偏移量。
二、获取bne指令的目标地址
MIPS分支指令采用相对寻址,计算步骤如下:
- 计算bne指令自身的PC值:示例中前一条
slt指令地址为0x04001248,MIPS指令长度为4字节,因此bne的PC值为0x04001248 + 4 = 0x0400124C。 - 计算
PC+4:即bne指令的下一条指令地址,值为0x0400124C + 4 = 0x04001250。 - 将步骤一中得到的32位偏移量左移2位:由于MIPS以字节寻址,分支偏移量按字(4字节)为单位,左移2位可将其转换为字节偏移量。
- 目标地址 =
(PC + 4) + (左移后的偏移量)。
三、关于负十六进制值的疑问
得到负十六进制值是正常现象,并非方法错误:
bne的立即数字段以补码形式存储,当分支目标位于PC+4的**前向(地址更小的方向)**时,偏移量为负数,对应的十六进制表示最高位为1,呈现负数值。只要严格按照上述步骤计算,最终得到的目标地址会是正确的。
内容的提问来源于stack exchange,提问作者Adriel Orlando Johan
相关产品推荐
相关产品推荐

