MIPS:计算位移

时间:2014-06-10 05:04:54

标签: mips

解决一些问题,我很困惑计算位移。

一些例子是:

top:    
addi    $s2, $s2, -1
addi    $s1, $s1, 1
bne $s2, $0, top

假设top的值为0x1000 0008。

top:    bne     $s1, $s2, end
addi    $s1, $s1, 1        
end:    j   top

假设top的值为0x1000 0008。

bne指令中的位移是什么?

任何人都可以解释如何计算这些?谢谢。

1 个答案:

答案 0 :(得分:2)

绝对地址无关紧要。重要的是跳跃与目标之间的距离。

要计算偏移量,请计算跳转目标与之后 bne之间的指令之间的距离。在第一个示例中,距离为12个字节,因为目标标签与bne之后的指令之间有3条指令,每条指令的大小为4个字节。由于这是一个向后跳跃,它必须是负偏移,即-12。

由于指令需要字对齐(4个字节),因此存储在指令字中的偏移量向右移位2位(因为无论如何,两个最低有效位始终为00)。这是算术移位,意味着保留符号位。因此,我们需要取-12并将算术右移2位,以获得存储在指令字中的实际偏移量。如果我们以十六进制形式查看-12(这将是0xFFF4),这会变得更容易。移位0xFFF4给出了0xFFFD,这就是我们在指令字中放入的内容。

在你的第二个例子中,偏移量是正的,但除此之外,你计算它的方式完全相同。