Сборка - флаг переноса несущего флага VS
У меня есть следующий код:
mov al, -5
add al, 132
add al, 1
Как я проверю, флаг переполнения и флаг переноса будут установлены в первой операции, а во втором - только переполнение.
Но я не понимаю, почему:
- В неподписанном номере результат равен 143 (8FH), и для этого подходит 8-битное беззнаковое число (меньше 255) = > флаг переноса не должен быть установлен. В подписанном числе результат равен 127, он подходит для 8-битной подписки, и переполнение не должно быть установлено.
Что не так? Спасибо.
Ответы
Ответ 1
В беззнаковой арифметике вы добавили 0xFB
в 0x84
, то есть 251 + 132, который действительно больше 8-бит, и поэтому установлен флаг переноса.
Во втором случае вы добавляете +127 в 1, что действительно превышает подписанный 8-битный диапазон, и поэтому установлен флаг переполнения.
Ответ 2
Переполнение происходит, когда результат добавления двух положительных чисел отрицательный или результат добавления двух отрицательных чисел положителен.
Например:
+127+1=?
+127=0111 1111
+1=0000 0001
---------
1000 0000
Как мы видим биты знака двух операндов и знаковый бит в результате мы обнаруживаем, что переполнение произошло, и ответ неверный.