инициализация значений в Марсе 4.5 с ошибкой - PullRequest
0 голосов
/ 02 июня 2019

Моя домашняя работа - инициализировать значения в определенных регистрах. Мы должны отключить Разрешить расширенные (псевдо) инструкции и форматы.

Когда я пытаюсь собрать код, я получаю это сообщение об ошибке для строки 7,8,9

Расширенная (псевдо) инструкция или формат не разрешены.

Также есть ли способ оптимизировать код? Мы начали на ассемблере на прошлой неделе, поэтому я довольно новичок в этом.

.text
addi $8, $0, 1
addi $9, $0, 11
addi $10, $0, 0x1000
addi $11, $0, -1
addi $12, $0, -0x8000
addi $13, $0, 0x8000
addi $14, $0, 0xffff0000
addi $15, $0, 0x7fffffff
addi $24, $0, 5322
addi $25, $0, 75

1 Ответ

1 голос
/ 02 июня 2019

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

Обратите внимание, что oriandi, xori) считают свой операнд логическим и не выполняют расширение знака. Операнд просто расширен нулем.

Таким образом, вы можете заменить ligne 7 на

ori $13, $0, 0x8000

для правильной инициализации в одной инструкции.

Точно так же, для инструкции 8 немедленного все 16 младших битов очищены, и инициализация может быть выполнена уникальным lui

lui $14, 0xffff

Для строки 9 требуются две инструкции

lui $15, 0x7fff     
ori $15, $15, 0xffff

Нет никакой возможности действительно оптимизировать код. Чтобы инициализировать 10 разных регистров, вам нужно как минимум 10 инструкций.

...