Об инструкции 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, это, скорее всего, будет воспринято другими ассемблерами таким же образом. Извините, у меня нет удобных наборов инструментов для тестирования.

Другие вопросы по тегам