multu
- это unsigned
версия mult
, что означает, что она не будет генерировать overflow
, потому что результат принимается как число без знака.Когда вы показываете значение через syscall
, оно принимается как signed
число, поэтому отображается значение со знаком (которое в данном случае является отрицательным).
Вы не дали много информации о том, чтовы пытаетесь достичь этого, но если вы хотите выполнить умножение со знаком (то есть вы хотите сохранить знак результата) и сохранить результат в 32-битном регистре, тогда вы столкнетесь с ограничениями.В этом случае перед печатью результатов вам нужно будет проверить, возможна ли операция в этих пределах, то есть вам нужно проверить, произошло ли переполнение:
li $t0, 10
li $t1, 268435456
multu $t0, $t1
mflo $t2
li $t3, 31
srl $t0, $t0, $t3
srl $t1, $t1, $t3
srl $t2, $t2, $t3
xor $t0, $t0, $t1
xor $t0, $t0, $t2
bgtz $t0, noOperationRoutine
li $v0, 10
syscall
noOperationRoutine:
....
То, что выполняет приведенный выше код, является проверкойкрайний левый бит (полученный путем смещения вправо на 31 бит), который указывает на знак (1 для отрицательного и 0 для положительного).Если один и только один из операндов отрицателен, то результат должен быть отрицательным.Если оба являются отрицательными или положительными, то результат должен быть положительным.Я думаю, что вы можете видеть, как два xors выполняют эту проверку.
Если вы хотите работать с результатами, которые больше, чем максимальное измерение для числа со знаком, то вы должны иметь в виду, что mult
хранитнижняя часть результата в LO
и верхняя часть в HI
.На этом этапе вы будете иметь дело с 64-битными числами, которые занимают два слова / регистра каждый и с которыми не будет легко иметь дело.