2

我有点坚持以下问题,

考虑以下 MIPS 代码并回答以下问题。

addi $t1, $s0, 400
loop: lw $s1, 0($s0)
add $s2, $s2, $s1
lw $s1, 4($s0)
add $s2, $s2, $s1
addi $s0, $s0, 8
bne $t1, $s0, loop

标签循环在条件分支指令中转换为什么值?

现在我知道了分支目标地址的数学公式。但是这里没有完成内存寻址,所以我通过计算目标地址和 PC 之间的行来找出偏移量。这给出的答案是 7(字偏移)。我对这种方法是否正确?

4

2 回答 2

2

AFAIK,恐怕不是。

正如 MIPS 指令参考所说:

在分支延迟槽中,将一个 18 位带符号偏移(16 位偏移字段左移 2 位)添加到分支之后的指令地址(不是分支本身),以形成 PC 相对的有效目标地址。

据我了解,从分支指令到loop标签的距离是负数(因为标签在分支之前,因此地址较低)。距离以字数计算(因此左移 2 位)。由于所有 MIPS 指令都是 4 字节,这将是 6 条指令之前,因此 -6 是应该出现在分支指令偏移量(低半字)中的值。二进制:1111 1111 1111 1010(二进制补码)。十六进制:FFFA。

用模拟器检查,似乎我的推理是正确的,因为指令被编码为 0x1530FFFA。

于 2011-11-08T13:09:50.550 回答
2

MARS 模拟器的快速实验http://courses.missouristate.edu/KenVollmar/MARS/download.htm给了我答案-6,-5 表示行数差异,另一个 -1 因为 PC 在指令后增加了 1 .

于 2011-11-08T13:13:46.567 回答