查找代码段的偏移量

时间:2011-11-08 09:19:47

标签: mips computer-architecture mips32

我对以下问题感到有些困惑,

  

考虑以下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(字偏移)的答案。我采用这种方法是对的吗?

2 个答案:

答案 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。