Сборка - Флаг переноса VS Флаг переполнения - PullRequest
15 голосов
/ 14 декабря 2011

У меня есть следующий код:

mov al, -5
add al, 132
add al, 1

Когда я проверяю это, флаг переполнения и флаг переноса будут установлены в первой операции, а во второй - только переполнение.

Но я не понимаю, почему:

  1. В случае числа без знака результат равен 143 (8FH), и для этого подходит 8-разрядное число без знака (меньше 255) => флаг переноса не должен быть установлен.В числовом знаке результат равен 127, он соответствует 8-разрядному знаку, и переполнение не должно устанавливаться.

Что не так?Спасибо.

Ответы [ 2 ]

24 голосов
/ 17 ноября 2012

Переполнение происходит, когда результат добавления двух положительных чисел отрицателен или результат добавления двух отрицательных чисел положителен.Например: +127+1=?

+127=0111 1111
  +1=0000 0001
     ---------
     1000 0000 

Когда мы смотрим на знаковые биты двух операндов и знаковый бит результата, мы обнаруживаем, что произошло переполнение, и ответ неправильный.

16 голосов
/ 14 декабря 2011

В арифметике без знака вы добавили 0xFB к 0x84, то есть 251 + 132, что на самом деле больше 8 бит, и поэтому установлен флаг переноса.

Во втором случае, вы добавляете +127 к 1, что действительно превышает 8-битный диапазон со знаком, и поэтому устанавливается флаг переполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...