Машинный код
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
)