Я изучаю компьютерную арифметику. В книге, которую я использую (Паттерсон и Хеннесси), перечислены вопросы, приведенные ниже.
Напишите код mips для вычитания целых чисел двойной точности для 64-битных данных. Предположим, что первый операнд находится в регистрах $ t4 (hi) и $ t5 (lo), второй - в $ t6 (hi) и $ t7 (lo).
Мое решение ответа
sub $t3, $t5, $t7 # Subtract lo parts of operands. t3 = t5 - t7
sltu $t2, $t5, $t7 # If the lo part of the 1st operand is less than the 2nd,
# it means a borrow must be made from the hi part
add $t6, $t6, $t2 # Simulate the borrow of the msb-of-low from lsb-of-high
sub $t2, $t4, $t6 # Subtract the hi's. t2 = t4 - t6
Однако автор дал решения этой проблемы, как показано ниже.
Для целых чисел двойной точности со знаком
subu $t3, $t5, $t7
sltu $t2, $t5, $t7
add $t6, $t6, $t2
sub $t2, $t4, $t6
Для беззнаковых целых чисел двойной точности
subu $t3, $t5, $t7
sltu $t2, $t5, $t7
addu $t6, $t6, $t2
subu $t2, $t4, $t6
Насколько я понимаю, разница в работе sub/add
и subu/addu
заключается в том, что исключение переполнения создается в sub/add
, а не в subu/addu
. Оба sub/add
и subu/addu
вычитают / добавляют биты операндов, и интерпретация операндов со знаком или без знака не влияет на результат, в отличие от инструкций slt
и sltu
.
Вопрос 1
Я делаю вывод из предоставленных автором решений, что обнаружение переполнения обрабатывается, тогда как я не думал об этом в своем решении. Я прав? Есть ли что-нибудь еще, чего мне не хватает?
Вопрос 2
Если мой вывод верен, почему обнаружение переполнения отключено для предоставленных автором решений в случае вычитания беззнаковой двойной точности с помощью addu
и subu
?