|
Ассемблер в примерах - флаги 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 как раз и предполагает то, что операнд знаковый.
| |