解决一些问题,我很困惑计算位移。
一些例子是:
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指令中的位移是什么?
任何人都可以解释如何计算这些?谢谢。
答案 0 :(得分:2)
绝对地址无关紧要。重要的是跳跃与目标之间的距离。
要计算偏移量,请计算跳转目标与之后 bne
之间的指令之间的距离。在第一个示例中,距离为12个字节,因为目标标签与bne
之后的指令之间有3条指令,每条指令的大小为4个字节。由于这是一个向后跳跃,它必须是负偏移,即-12。
由于指令需要字对齐(4个字节),因此存储在指令字中的偏移量向右移位2位(因为无论如何,两个最低有效位始终为00
)。这是算术移位,意味着保留符号位。因此,我们需要取-12并将算术右移2位,以获得存储在指令字中的实际偏移量。如果我们以十六进制形式查看-12(这将是0xFFF4),这会变得更容易。移位0xFFF4给出了0xFFFD,这就是我们在指令字中放入的内容。
在你的第二个例子中,偏移量是正的,但除此之外,你计算它的方式完全相同。