Об инструкции addi в MIPS
Я узнал, что расширение знака происходит в непосредственном значении MIPS addi
инструкция. ( http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/addi.html)
Тем не менее, я не уверен, когда он будет распространяться до минус значения.
Я старался
main:
addi $t0, $0, 0x8000
jr $31
этот код и qtSpim выдал следующую ошибку.
немедленное значение (32768) вне диапазона (-32768 .. 32767) в строке 3 файла addi $t0, $0, 0x8000
Чтобы подписать расширение до минусового значения, MSB должен быть равен "1", но он выходит за пределы диапазона, чтобы быть непосредственным значением.
Итак, я предполагаю, что addi
не "в действительности", случается, что знак продлен. Я угадываю это правильно?
Или, если нет, подскажите, пожалуйста, куда я себя вела? Также очень поможет пример расширения знака:)
1 ответ
Адди принимает значение со знаком. Формат инструкции addi в собранном виде:
bit 31-26 25-21 20-16 15-0
value 8 rs rd (signed) const
* Источник См. MIPS Run
Где 8 - код операции, rs - регистр назначения, rd - регистр источника, а (подписанное) const - целое число со знаком, добавляемое к rd.
Ассемблер ожидает (необязательно) 16-разрядное целое число со знаком, где вы задаете ему значение 0x8000. Конкретный ассемблер, который вы используете, видит это как положительное целое число в шестнадцатеричном виде, 32768 как ошибка, которая не подходит.
Я буду осторожен с переполнением, чем бы вы ни занимались.
Имейте в виду, рассматривается ли 0x8000 как целое число или необработанное двоичное значение, зависит от используемого вами ассемблера. Lĩu Vĩnh Phúc указывает, что -0x8000 или -32768 должны работать. Я бы порекомендовал использовать -32768 вместо -0x8000, это, скорее всего, будет воспринято другими ассемблерами таким же образом. Извините, у меня нет удобных наборов инструментов для тестирования.