Как загрузить 32-разрядную константу в регистр без использования LUI

#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 тех пор, как вы смещаете верхнюю половину, так что не имеет значения, где вы получили расширение нуля или знака в верхнюю половину.