MIPS Декодирование команд - PullRequest
       86

MIPS Декодирование команд

0 голосов
/ 24 ноября 2018

Я пытаюсь понять, как декодировать двоичные инструкции MIPS.

Я скомпилировал программу hello world на C в системе Debian MIPS с помощью gcc, и objdump показывает мне, что первая инструкция в разделе .textэто:

600: 03e00025 move zero,ra

Я не понимаю, как он определяет, что это инструкция MOVE.

03e00025 - это 00000011111000000000000000100101 в двоичном виде.Если я правильно понимаю, первые 6 битов здесь - это код операции, который в данном случае равен 0, что означает, что это инструкция R-типа, поэтому нам нужно взглянуть на последние 6 битов, то есть 100101.Если посмотреть на Руководство по набору инструкций MIPS , похоже, что это должна быть инструкция OR.Я даже не могу найти MOVE в этом руководстве.

Погуглив для этого, я обнаружил, что, очевидно, в сборке есть "псевдо" инструкции, и предположительно move $t, $s расширяется до addiu $t, $s, 0, но если япосмотрите в руководстве ADDIU есть код операции 001001.Другой результат, который я обнаружил, утверждает, что он переводится как ADD, но последние шесть бит ADD должны быть 100000, так что это тоже не подходит.

Чего мне не хватает?

1 Ответ

0 голосов
/ 24 ноября 2018
Машинный код

MIPS не имеет специального кода операции для move, но для удобства людей многие ассемблеры поддерживают псевдоинструкции, такие как li, la и move, которые собираются в один или нескольконастоящие машинные инструкции.addiu является распространенным.

Было бы совершенно правильно, чтобы objdump декодировал инструкцию как or $0, $ra, $0 (согласно Шутеру), чтобы показать вам, как она на самом деле кодируется.

Для некоторыхДля дизассемблера имеет смысл декодировать любой из обычно используемых способов копирования регистра в мнемонику move.Добавление или ИЛИ немедленное 0, или ноль от чтения регистра $zero, ничего не делают со значением, чтобы оно копировалось без изменений.

При чтении asm, вам, как правило, все равно, является ли оно or, ori, addiu $0, $ra, 0 или что-либо еще.


Различные ассемблеры могут использовать разные реализации для псевдоинструкции move, или рукописный asm может использовать любую из них.Я не думаю, что есть какие-либо последствия для производительности в любом случае.Таким образом, детали того, какая машинная инструкция используется для реализации move, зависит от ассемблера.


Я не уверен, какой смысл move с пунктом назначения $zero,Это было бы бездействующим, потому что $zero отбрасывает записи.(Это регистр процессора, эквивалентный /dev/zero)

...