Регистр MIPS не присваивает значение 0XFA9C регистру $a0

#assembly #mips

#сборка #mips

Вопрос:

Я пытаюсь присвоить 0xFA9C $ a0. Но программное обеспечение Qtspim показало ошибку, скриншот которой прилагается ниже. Спасибо за вашу помощь.

СКРИНШОТ ОШИБКИ

Комментарии:

1. Ну, точно так же, как указано в ошибке, значение, которое вы пытаетесь использовать, находится вне диапазона addi . Вместо этого вы можете попробовать использовать li псевдоинструкцию, которая должна разрешать любую 32-разрядную константу.

Ответ №1:

0xFA9C равно 64 156, что не помещается в 16-разрядное поле со знаком immediate addi инструкции.

Если вам действительно нужно это число, загрузите его как немедленное li $t0, 0xFA9C , и ассемблер будет использовать две инструкции для построения этого числа.

Если вы предполагали, что это отрицательное число, например, -1380, затем используйте десятичное число или (это работает в MARS) дополните его 32-разрядным шестнадцатеричным знаком: 0xFFFFFA9C , это сообщает ассемблеру, что это отрицательное число, и это число будет соответствовать 16-разрядному непосредственному значению addi .

Комментарии:

1. и ассемблер будет использовать две инструкции для построения этого числа. — или, если это разумно, будет использоваться ori $t0, $zero, 0xFA9C для реализации этого li . Логические инструкции MIPS обнуляют свои непосредственные действия, а не расширяют знак. Я проверил, и ассемблер qtspim действительно знает этот трюк. (Но он разбирает результирующую 3408fa9c машинную инструкцию как ori $8, $0, -1380 , что является правильным только в том случае, если вы обрабатываете немедленное как int16_t , а не 32-битное расширение после нуля :/) Уверен, что GAS и clang также знают, что нужно использовать ori , и, вероятно, MARS.

2. @PeterCordes. Вы правы, MARS делает ori $t0, $at, 0xFA9C ; однако MARS также принимает addi $a0, $a0, 0xFA9C , и он генерирует lui $at, 0x0 , за которым следует, за ori $a0, $a0, 0xFA9C которым следует add $a0, $a0, $at !

3. Да, MARS поддерживает «расширенные» псевдоинструкции, выходящие за рамки стандартных ассемблеров MIPS. т.Е. Он обрабатывает каждую инструкцию с помощью immediate как потенциальную псевдоинструкцию. Способ, которым он обрабатывает это, обычно очень тупой (неэффективный), не оптимизирующий части значения, равные нулю при расширении в шаблоны, которые могут обрабатывать общий случай. например addi $a0, $zero, 0xFA9C , расширяется с тем же шаблоном, который вы описали.

4. У MARS нет AFAIK возможности разрешать только «обычные» псевдо-инструкции. Если вы отключите «расширенные (псевдо) инструкции и форматы», это li также отключится.