Почему MARS MIPS 32-битные возможны сразу?
Таким образом, согласно нескольким источникам, на которые я смотрел, невозможно использовать 32-битное непосредственное в 32-битном формате, потому что машинные инструкции являются 32-битными, а непосредственные значения хранятся в машинных инструкциях. Насколько я знаю, наибольшее значение может быть 16-битным, чтобы оставить место для остальной части инструкции. Но в MARS 4.5 mips эта инструкция работает нормально (с настройками по умолчанию):
.text
ori $t1, $0, 0xffffffff #load 32-bit pattern into $t1
Это собирает и работает нормально, что сбивает меня с толку, поскольку я думаю, что это не должно происходить по вышеупомянутым причинам (как 32-битный машинный код может содержать 32-битный немедленный?). Мое лучшее предположение - ori в MARS на самом деле выполняет псевдоинструкцию, когда непосредственное поле больше 0xffff, чем lui и ori для регулярной загрузки, но я не уверен. Может кто-то пролить свет на это?
1 ответ
Если вы заметите, что при сборке этой инструкции в марсе 4.5 вы получите три инструкции
lui $1,0xFFFFFFFF
ori $1,$1,0x0000FFFF
or $9,$0,$1
что все еще немного вводит в заблуждение, но в основном это исправляет это для вас.