Почему операции MIPS с неподписанными номерами дают подписанные результаты?

Когда я пытаюсь работать с целыми числами без знака в MIPS, результат каждой операции, которую я делаю, остается подписанным (т.е. целые числа находятся в 2 дополнениях), хотя каждая выполняемая операция является неподписанной: addu, multu и так далее...

Когда я печатаю числа в диапазоне [2^31, 2^32 - 1], я получаю их "переполненное" отрицательное значение, как будто они были подписаны (я думаю, что они есть).

Хотя, когда я пробую что-то вроде этого:

li $v0, 1
li $a0, 2147483648                # or any bigger number
syscall

напечатанное число всегда 2147483647 (2^31 - 1)

Я в замешательстве... Что мне не хватает?

PS: Я не включил свой код, поскольку он не очень читабельен (такой код сборки) и отложил эту проблему, кажется, работает нормально. Если кто-то почувствует, что это необходимо, я включу его прямо сейчас!

Ответ 1

От Wikipedia:

В MIPS32 Instruction Set указано, что слово unsigned как часть инструкций Add и Subtract является неправильным. Разница между подписанными и неподписанными версиями команд не является расширением знака (или отсутствием) этих операндов, но контролирует, выполняется ли ловушка при переполнении (например, "Добавить" ) или переполнение игнорируется ( "Добавить без знака" ). Непосредственный операнд CONST к этим инструкциям всегда расширяется.

В Справочник по MIPS Инструкции:

ВСЕ арифметические немедленные значения расширены знаками [...] Единственное различие между подписанными и неподписанными инструкциями заключается в том, что подписанные инструкции могут генерировать исключение переполнения и неподписанные инструкции не могут.

Ответ 2

Мне кажется, что реальная проблема - это syscall, который вы используете для печати чисел. Он кажется и всегда интерпретирует то, что вы передаете, как подписанное, и, возможно, связанное с ним.