2011-12-01 339 views
1

我有一组指令如下:MIPS BNE指令

loop: 
     sll $t1, $t0, 2    # t1 = (i * 4) 
     add $t2, $a0, $t1    # t2 contains address of array[i] 
     sw $t0, 0($t2)    # array[i] = i 

     addi $t0, $t0, 1    # i = i+1 
     add $t4, $t4, $t0    # sum($t4) = ($t4 + array[i]) 

     slt $t3, $t0, $a1    # $t3 = (i < array_size) 
     bne $t3, $zero, loop   # if (i < array_size) then loop 

sll指令具有的0x18的地址(程序计数器)。 bne的地址为0x30。 MARS模拟器将bne指令解释为:bne $11, $0, 0xfff90xfff9-7,这意味着指令将跳回7步。然而,sll是六个步骤。 MIPS是否考虑到当前的指令?或者是否发生这种情况是因为程序计数器在指令结束执行前在fetch阶段增加了?

+0

我没有答案,但我会添加“步幅”作为另一个可能的原因。 –

回答

2

分支mips执行两个指令 - 分支指令本身和它后面的一个(所谓的分支延迟槽)。

当分支生效时,PC指向跟在之后的分支指令本身,所以-7是合适的。

1

在大多数体系结构中,分支目标是根据分支指令后的指令计算的(即:PC已经高级)。 IIRC ARM是唯一常见的例外(由于流水线化(最初的ARM实现)),PC仍然更先进。