Как проверить, вызывают ли два 32-битных целых числа со знаком переполнение в MIPS?

Я понял, что для двух целых чисел без знака я могу просто сделать это:

sll $a0, $a0, 31                          #a0 is integer 1 to be added

sll $a1, $a1, 31 #a1 is integer 2

add $t0, $a0, $a1 #result in $t0

addi $t1, $0, 2

beq $v0, $t0, $t1

Что это делает, так это сдвигает 32-й бит обоих целых чисел в первое битовое место и добавляет их. Если оба эти числа равны 1, то ответом в $t1 будет 2 (01+01=10). Следовательно, произошло переполнение.

Однако для целых чисел со знаком ведущее означает отрицательные целые числа. Я исключил возможность переполнения, если оба целых числа имеют противоположный знак, но предположим, что они имеют один и тот же знак. Тогда 010 + 011 (два положительных целых числа) дадут мне 101, но потому что это знаковое. Это становится отрицательным целым числом. Могу ли я просто проверить, изменило ли число знаки? А для двух отрицательных целых чисел я могу просто проверить, как если бы они были беззнаковыми?


person mamajava    schedule 08.03.2017    source источник
comment
Даже ваш неподписанный не работает слишком хорошо. Ваш beq имеет недопустимый синтаксис и использует $v0 без инициализации. Вы хотите сдвинуться вправо, поэтому вам нужно srl вместо sll. И тест провален. Если оба числа равны -1 (т. е. 0xFFFFFFFF), при их сложении получается -2 (т. е. 0xFFFFFFFE). Это не вызывает переполнение. Но, я думаю, ваш тест подумает, что да.   -  person Craig Estey    schedule 08.03.2017


Ответы (1)


Так вы говорите о подписанном переполнении? Если перенос не совпадает с переносом, то это переполнение со знаком.

abi or
000 00
001 01 signed overflow
010 01
011 10
100 01
101 10
110 10 signed overflow
111 11

a и b — операнды, i — перенос, o — перенос, r — результат.

заметили что-нибудь о связи между a, b и r? Вы можете определить переполнение со знаком, просто взглянув на msbits двух операндов и результат.

Это не имеет абсолютно никакого отношения к mips, это основное сложение (и вычитание) двух дополнений. Чтобы применить его к набору инструкций, вам нужно изолировать msbits операндов и если они соответствуют результату. Может использовать тест/и может использовать, сдвигая 31 бит, предполагая, что он дополняется чем-то известным (например, нулем, а не расширением знака, или, может быть, расширение знака помогает). добавить с нулем проверить флаг z. mips не использует флаги, поэтому и или сдвиньте, чтобы изолировать, а затем сравните, если они равны или нет, это хорошее общее решение. также можно проверить перенос и перенос (и оба операнда с 0x7FFFFFFF, затем добавить, затем сдвинуть вправо на 31 и/или изолировать перенос и два msbit операнда, затем добавить эти три элемента и посмотреть, является ли перенос одинаковым или отличается, требует гораздо больше инструкций).

person old_timer    schedule 08.03.2017