MIPS BNE指令

时间:2011-12-01 00:10:10

标签: assembly mips

我有一套如下说明:

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指令的地址(程序计数器)为0x18bne的地址为0x30。 MARS Simulator将bne指令解释为:bne $11, $0, 0xfff90xfff9-7,意味着该指令将跳回7步。但是,sll退后六步。 MIPS是否考虑了当前的指令?或者是否发生这种情况是因为程序计数器在指令完成执行之前在fetch阶段递增?

2 个答案:

答案 0 :(得分:2)

On branch mips执行两个指令 - 分支指令本身及其后面的指令(所谓的分支延迟槽)。

当分支生效时,PC指向跟随分支指令本身的指令,因此-7是合适的。

答案 1 :(得分:1)

在大多数体系结构中,分支目标是根据分支指令之后的指令计算出来的(即:PC已经提前)。 IIRC ARM是唯一的常见例外(由于流水线操作(最初的ARM实现),PC仍在进一步发展)。