MIPS Multu переполнения - PullRequest
       10

MIPS Multu переполнения

0 голосов
/ 18 ноября 2018

Как часть шестнадцатеричной и десятичной программы, которую я пишу в MIPS, используя QT spim, я загружаю значение 16 ^ 7 (268435456) в общий регистр.Затем я умножаю это число на 1-15 в зависимости от символа, добавляю результат к итоговой сумме и делю 16 ^ 7 на 16.

Однако при умножении 268435456 я сталкиваюсь с проблемами переполнения.Например, код

    li $t0, 10
    li $t1, 268435456
    multu $t0, $t1
    mflo $t2
    li $v0, 10
    syscall 

, который предназначен для умножения 268435456 на 10 и сохранения результата в $ t2 хранит -1610612736 вместо 2684354560. Любые идеи о том, как исправить этот код, чтобы сохранить правильное значение* * 1006

1 Ответ

0 голосов
/ 18 ноября 2018

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-битными числами, которые занимают два слова / регистра каждый и с которыми не будет легко иметь дело.

...