#assembly #mips
Вопрос:
Я пытаюсь загрузить 32-разрядную константу 0x1234ABCD для регистрации $t0
в сборке MIPS. Однако я не могу использовать lui
это для этого. Мой инстинкт подсказывает использовать два addi
, но я не уверен, как это сделать. Мне обязательно понадобилось бы 2 или более, чтобы получить 32 бита информации. Мне нужно как-то установить верхние биты без lui
этого . Каков хороший способ приблизиться к репликации lui
без ее использования?
Комментарии:
1.Обычно мы бы так и поступили
lui $t0 0x1234
ori $t0, 0xABCD
. Как загрузить верхние биты без немедленной загрузки верхних?2. вы смотрели набор инструкций? какую часть документации вы не понимаете?
3. Будьте изобретательны: мы можем использовать сложение, вычитание, сдвиг, умножение на меньшие константы для достижения больших.
4. @ErikEidt Я не понимал, насколько это мощно. Спасибо!
Ответ №1:
Вы можете использовать, например ori
, в сочетании с sll
для загрузки 32-разрядной константы в 3 инструкциях без использования lui
:
ori $t1, $zero, 0x1234 # load the upper half in the lower bits of $t1
sll $t1, $t1, 16 # move them to the upper half
ori $t1, $t1, 0xABCD # combine with the lower half
Комментарии:
1. Другой способ сформулировать это так: это
lui
можно точно эмулировать сori
помощью /sll
-by-16. Или сaddiu
тех пор, как вы смещаете верхнюю половину, так что не имеет значения, где вы получили расширение нуля или знака в верхнюю половину.