2016-05-12 5 views
0

Учитывая этот код:Транслейтинг Mips сборка в машинный код: BNE

[0x00000000] arraycopy: lw $t0, 0($a0) 
[0x00000004]    addi $a0, $a0,4 
[0x00000008]    addi $a1, $a1,4 
[0x0000000C]    sw $t0, -4($a1) 
[0x00000010]    bne $t0,$0,arraycopy 
[0x00000014]    Nop (means no operation) 

Теперь я заинтересован, чтобы перевести bne командную строку в машинный код:

То, что я получил: 0001 0100 0000 1000 - ....

Теперь, какова будет остальная часть команды?

** Обновление: Я получаю, что Offset значение: 1111 1111 1110 1100 которое -20 Но правильный ответ должен быть: 0xfffb который -5

Любая идея, почему **

ответ

1

Потому что? MIPS инструкция должна быть приведена в соответствие 4 байта, смещение в пределах команды перехода может быть закодированы [и является закодированным] в качестве слов смещения и не байт смещения. Это увеличивает допустимый диапазон ветви на 4x [хорошая вещь]. Таким образом, для подписанного закодированного смещения 16 бит вы получаете смещенное байтовое смещение 18 бит.

Таким образом, для заданного смещения байтов оно закодировано в ветви, сдвинув его вправо на 2 [т.е. нижние два бита должны всегда равны нулю, поэтому ничего не теряется]. Когда команда выполняется, то оборудование будет принимать смещение и восстановить его в байте, сдвигая его влево на 2.

байтовое смещение вычисляется не от адреса самой отрасли (0x00000010), но из адрес следующей инструкции (0x00000014).

Итак, смещение байта - -0x00000014 (десятичный -20) -> 0xFFFFFFEC. Смещение этого правого 2 бита [деление на 4] вызывает 0xFFFFFFFB (десятичный -5).

Поскольку закодированное смещение составляет только подписанные 16 бит, мы получаем 0xFFFB