addi
инструкция требует 16-битный параметр со знаком. На 16 битах можно кодировать от -32768 (-0x8000) до +32767 (0x7fff).
Инструкция 7 addi $13, $0, 0x8000
находится вне диапазона (+32768).
и инструкции 8 addi $14, $0, 0xffff0000
и 9 addi $15, $0, 0x7fffffff
и даже больше.
Инициализация регистров с аргументом, содержащим более 16 значащих битов, обычно требует двух инструкций. Для этого предназначены макрокоманды, такие как li
, которые могут загружать в две инструкции 32 целых числа или la
, которые делают то же самое с адресом (меткой).
По сути, для загрузки 0x01234567 в $ 2 необходимо сначала загрузить старшие биты с помощью lui
(немедленная загрузка сверху), а затем или с нижней частью аргумента.
lui $2, 0x0123 # load the upper part and clears 16 LSBs
# content of $2 is 0x01230000
ori $2, $2, 0x4567 # ors with the 16 least significant bits
Обратите внимание, что ori
(и andi, xori
) считают свой операнд логическим и не выполняют расширение знака. Операнд просто расширен нулем.
Таким образом, вы можете заменить ligne 7 на
ori $13, $0, 0x8000
для правильной инициализации в одной инструкции.
Точно так же, для инструкции 8 немедленного все 16 младших битов очищены, и инициализация может быть выполнена уникальным lui
lui $14, 0xffff
Для строки 9 требуются две инструкции
lui $15, 0x7fff
ori $15, $15, 0xffff
Нет никакой возможности действительно оптимизировать код. Чтобы инициализировать 10 разных регистров, вам нужно как минимум 10 инструкций.