Учебник по ассемблеру (ASM)
 

Ассемблер в примерах - флаги of и cf

Вопрос:
Почему последовательность команд
mov al, -128
neg al
одновременно устанавливает флаги of и cf???
Ответ:
Команда neg al выполняется как инверсия битов исходного операнда и последующего прибавления 1

Флаг CF устанавливается в случае переноса из старшего разряда
Флаг OF устанавливается в случае переполнения (Фиксирует арифметическое переполнение, т.е. перенос в/из старшего (знакового) бита при знаковых арифметических операциях)

-128 представляется в двоичном коде как 10000000
После выполнения инверсии получаем: 01111111 - положительное число
Прибавляя 1 получаем 10000000 - отрицательное число

В результате будут установлены флаги SF и OF (можно проверить в отладчике результат выполнения команд:
mov al, -128
not al
inc al или add al, 1
)

При этом, при замене neg al на эквивалентную последовательность команд флаг переноса установлен не будет.
А происходит это из-за отличий выполнения команд.
Как сказано в статье, указанной в приложении:
ПЕРЕПОЛНЕНИЕ БЕЗ ПЕРЕНОСА (OF=1, CF=0) - тогда, когда производится ТОЛЬКО перенос единицы в знаковый разряд.
ПЕРЕНОС С ПЕРЕПОЛНЕНИЕМ (CF=1, OF=1) - тогда,когда производится ТОЛЬКО перенос единицы из разрядной сетки.

При выполнении последовательности команд not al, inc al получается первый случай.
В случае же команды NEG нет, мы не получаем второй случай, просто, по-видимому, учитывается, что числа знаковые.
Потому что команда NEG как раз и предполагает то, что операнд знаковый.


   Вперёд
   Содержание