【问题标题】:MIPS BNE InstructionMIPS BNE 指令
【发布时间】:2012-01-10 05:14:55
【问题描述】:

我有一套指令如下:

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 模拟器将bne 指令解释为:bne $11, $0, 0xfff90xfff9-7,表示指令会后退 7 步。但是,sll 倒退了六步。 MIPS 是否考虑当前指令?或者这是因为程序计数器在指令完成执行之前在fetch 阶段增加了?

【问题讨论】:

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

标签: assembly mips


【解决方案1】:

在分支上 mips 执行 两条 指令——分支指令本身和它之后的一条(所谓的分支延迟槽)。

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

【讨论】:

    【解决方案2】:

    在大多数架构上,分支目标是根据分支指令之后的指令计算的(即:PC 已经高级)。 IIRC ARM 是唯一常见的例外(在那里,由于流水线(原始 ARM 实现),PC 进一步发展)。

    【讨论】:

      猜你喜欢
      • 2012-01-09
      • 1970-01-01
      • 2014-03-04
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 2016-04-27
      • 1970-01-01
      相关资源
      最近更新 更多