MIPS PC相对寻址中beq/bne无后续指令时立即数与编码计算问题
问题解答
规则适用性说明
PC+4的基准规则始终适用,和beq/bne指令后有没有其他指令无关。这个规则是MIPS五级流水线的硬件设计决定的:当beq/bne进入译码阶段计算跳转地址时,取指阶段已经完成了下一条指令的读取,此时PC寄存器的值天然就是当前beq/bne指令的地址+4,和后续地址是否存放有效指令没有任何关系。
示例代码立即数与机器码计算
你给出的示例代码先按地址对齐标注如下(假设第一条指令起始地址为0x00000000,MIPS指令固定4字节长,地址逐次加4):
地址 指令 0x00000000 addi $4, $3, 40 0x00000004 addi $5, $3, 0 0x00000008 loop:lw $6, 0($5) 0x0000000C addi $6, $6, 1 0x00000010 sw $6, 0($5) 0x00000014 addi $5, $5, 4 0x00000018 slt $6, $5, $4 0x0000001C bne $6, $zero, loop
立即数字段计算逻辑
beq/bne的16位立即数存储的是字偏移量,也就是字节偏移量除以4,计算公式为:立即数 = (目标跳转地址 - (当前指令地址 + 4)) / 4
代入示例参数:
- 当前bne指令地址:
0x1C,因此PC+4 = 0x1C + 4 = 0x20 - 目标跳转地址是loop标签的地址:
0x08 - 立即数 =
(0x08 - 0x20) /4 = -0x18 /4 = -6 - -6的16位补码表示为
0xFFFA,就是bne指令的立即数字段值。
完整机器码计算
bne指令的操作码为0x05,源寄存器rs是$6(编号0x06),目标寄存器rt是$zero(编号0x00),拼接后完整32位机器码为:000101 00110 00000 1111111111111010,转十六进制为0x14C0FFFA。
内容的提问来源于stack exchange,提问作者kingsbane
相关产品推荐
相关产品推荐

