Почему сразу же возможен 32-битный MARS mips?

Итак, согласно нескольким источникам, на которые я смотрел, невозможно использовать 32-битное немедленное выполнение в 32-битных mips, потому что машинные инструкции 32-битные, а немедленные значения хранятся в машинных инструкциях. Насколько мне известно, наибольшее значение может быть 16-битным, чтобы оставить место для остальной части инструкции. Но в MARS 4.5 mips эта инструкция работает нормально (с настройками по умолчанию):

.text
ori $t1, $0, 0xffffffff #load 32-bit pattern into $t1

Это собирает и работает нормально, что сбивает меня с толку, поскольку я думаю, что этого не должно быть по вышеупомянутым причинам (как 32-битный машинный код может немедленно поддерживать 32-битный?). Я предполагаю, что ori в MARS действительно запускает псевдо-инструкцию, когда значение поля немедленного действия выше 0xffff, что lui и ori должны загружаться регулярно, но я не уверен. Может кто-нибудь пролить свет на это?


person giraffe    schedule 14.03.2017    source источник
comment
Разберите двоичный файл и убедитесь в этом сами. На самом деле это не должно работать. Обратите внимание, что некоторые инструкции, такие как знак addi, расширяют действие сразу, поэтому addi $t1, $0, 0xffffffff действительно работает. Между прочим, эту инструкцию ассемблер мог бы использовать вместо ori здесь.   -  person Jester    schedule 15.03.2017


Ответы (1)


Если вы заметили, что при сборке этой инструкции в Mars 4.5 вы получите три инструкции

lui $1,0xFFFFFFFF
ori $1,$1,0x0000FFFF
or $9,$0,$1

что все еще немного вводит в заблуждение, но в основном исправляет это за вас.

person old_timer    schedule 15.03.2017
comment
чтобы еще больше подчеркнуть это, поставьте nop до и после вашей инструкции ori, а затем соберите, посмотрите, что он дает. - person old_timer; 15.03.2017