我有一套如下说明:
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 Simulator将bne
指令解释为:bne $11, $0, 0xfff9
。 0xfff9
是-7
,意味着该指令将跳回7步。但是,sll
退后六步。 MIPS是否考虑了当前的指令?或者是否发生这种情况是因为程序计数器在指令完成执行之前在fetch
阶段递增?
答案 0 :(得分:2)
On branch mips执行两个指令 - 分支指令本身及其后面的指令(所谓的分支延迟槽)。
当分支生效时,PC指向跟随分支指令本身的指令,因此-7是合适的。
答案 1 :(得分:1)
在大多数体系结构中,分支目标是根据分支指令之后的指令计算出来的(即:PC已经提前)。 IIRC ARM是唯一的常见例外(由于流水线操作(最初的ARM实现),PC仍在进一步发展)。