#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
также отключится.