Инструкция по расшифровке BNE MIPS - PullRequest
0 голосов
/ 30 ноября 2011

Я выполняю следующий код MIPS в симуляторе MARS:

add $t0, $zero, $zero        # i = 0
        add $t4, $zero, $zero        # initialize the sum to zero
        add $t5, $zero, $zero        # initialize temporary register to zero

        la $a0, array                 # load address of array
        la $a1, array_size            # load address of array_size
        lw $a1, 0($a1)                # load value of array_size variable

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

        add $t5, $a0, $zero           # save contents of $a0 in temporary reg $t5
        nop                           # done.

В машинном коде инструкция bne следующая: 00010101011000001111111111111001.В этом случае немедленным является: 1111111111111001, что равно: 0xFFF9.MIPS возьмет это, сдвинет бит влево на 2 (умножит на 4) и переведет счетчик программ на это число.Тем не менее, 0xFFF9, умноженное на 4, равно 0x3FFE4.Как это возможно?Счетчик программы на SLL должен быть 0x18, а не 0x3FFE4.Что мне здесь не хватает?

Спасибо,

1 Ответ

1 голос
/ 30 ноября 2011

Здесь следует отметить 2 вещи:

  1. Непосредственный находится в дополнении 2;поскольку знаковый бит равен 1, это отрицательное значение
  2. . На MIPS цель ветви выражается как смещение (которое возводится в квадрат со значением, являющимся отрицательным, поскольку цикл предшествует bne).Значение умножается на 4 б / с, все инструкции имеют размер 4 байта
...