MIPS BNE Инструкция - PullRequest
       5

MIPS BNE Инструкция

2 голосов
/ 01 декабря 2011

У меня есть следующий набор инструкций:

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 до завершения выполнения инструкции?

Ответы [ 2 ]

2 голосов
/ 01 декабря 2011

При переходе mips выполняет две инструкции - сама инструкция перехода и следующая за ней (так называемый интервал задержки перехода).

В то время, когда ветвление вступает в силу, ПК указывает на инструкцию, что следует самой инструкции ветвления, поэтому -7 подходит.

1 голос
/ 01 декабря 2011

На большинстве архитектур целевые показатели ветвления рассчитываются из инструкции, следующей за инструкцией ветвления (т. Е. ПК уже продвинут).IIRC ARM является единственным распространенным исключением (в этом случае ПК продвинулся еще дальше, благодаря конвейерной обработке (первоначальной реализации ARM)).

...