我对以下问题感到有些困惑,
考虑以下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(字偏移)的答案。我采用这种方法是对的吗?
答案 0 :(得分:2)
AFAIK,我不敢。
正如MIPS指令参考所述:
18位有符号偏移(16位偏移字段向左移位2位) 被添加到分支后面的指令的地址(不是 分支本身),在分支延迟槽中,形成PC相对 有效的目标地址。
据我所知,从分支指令到loop
标签的距离是负的(因为标签在之前分支,因此地址较低)。距离以字数计算(因此左移2位)。由于所有MIPS指令都是4个字节,因此之前是6个指令,因此-6应该出现在分支指令偏移量(下半字)中。二进制:1111 1111 1111 1010(二进制补码)。十六进制:FFFA。
使用模拟器检查,似乎我的推理是正确的,因为指令被编码为0x1530FFFA。
答案 1 :(得分:2)
使用MARS模拟器http://courses.missouristate.edu/KenVollmar/MARS/download.htm的快速实验给出了答案-6,-5表示行数差异和另一个-1,因为PC在指令后增加了1。