В процессорах используются флаги (специальные биты которые устанавливаются в зависимости от результата операции).
Флаги переноса и знака
Рассмотрим сумматор (на примере 4 бит): Операции: Сложение A+B A+B Вычитание A+B#+1 A-B Negate 0+B#+1 -B +-----+ C0 -| SUM | A0 -| |-- S0 B0 -| |--+ +-----+ | C1 +-----------+ | +-----+ +--| SUM | A1 -| |-- S1 B1 -| |--+ +-----+ | C2 +-----------+ | +-----+ +--| SUM | A2 -| |-- S2 B2 -| |--+ +-----+ | C3 +-----------+ | +-----+ +--| SUM | A3 -| |-- S3 (Sign Flag) знак числа результата SF B3 -| |-- C4 (Carry Flag) самый старший перенос CF +-----+ Carry - флаг переноса Sign - флаг знака
Флаг переполнения
При работе со знаковыми числами у нас может возникнуть ситуация выхода чисел из диапазона (переполнение): ------------------------------------------------------- Carry Carry Overflow 8/7 7/6 A + B = N+1/N N/N-1 Переполнение ------------------------------------------------------- 02 + 04 = 06 0 0 0 80 + 12 = 92 0 0 0 80 + FF = 7F 1 0 1 7F + 02 = 81 0 1 1 FF + FF = FE 1 1 0 ------------------------------------------------------- перепонение возникает когда у нас: Carry (N+1/N) != Carry(N/N-1) при операции на N разрядах и не возникает когда: Carry (N+1/N) == Carry(N/N-1)
таким образом флаг переполнения Overflow Flag: OF = Carry(N+1/N) XOR Carry(N/N-1) пример для четырехбитного сумматора: +-----+ C0 -| SUM | A0 -| |-- S0 B0 -| |--+ +-----+ | C1 +-----------+ | +-----+ +--| SUM | A1 -| |-- S1 B1 -| |--+ +-----+ | C2 +-----------+ | +-----+ +--| SUM | A2 -| |-- S2 +-----+ B2 -| |--+-----------------------|(+) |----- OF +-----+ | C3 +--| XOR | флаг +-----------+ | +-----+ переполнения | +-----+ | +--| SUM | | A3 -| |-- S3 (SF) | B3 -| |------+-- C4 (CF) | +-----+ | | +----------------+
Флаг нуля
Zero flag: Если результат операции равен нулю, то флаг нуля = 1. +-----+ C0 -| SUM | S0 A0 -| |----------------------+ B0 -| |--+ | +-----+ | C1 | +-----------+ | | +-----+ | +--| SUM | S1 | A1 -| |------------------+ | +-----+ B1 -| |--+ | +---| NOR | +-----+ | C2 +-------| |---- ZF (Zero flag) +-----------+ +-------| | флаг нуля | +-----+ | +---| | +--| SUM | S2 | | +-----+ A2 -| |------------------+ | B2 -| |--+ | +-----+ | C3 | +-----------+ | | +-----+ | +--| SUM | S3 | A3 -| |----------------------+ B3 -| |-- C4 +-----+
схема сложения: Все вместе
схема вычитания:
схема сложения и вычитания:
результат симуляции схемы сложения/вычинания:
Флаг четности
PF (Parity Flag) = 0 Parity Even (число единичных битов четное) = 1 Parity Odd (число единичных битов нечетное)
Вспомогательный Carry флаг
HF (Half Carry Flag) или AF (Auxillary Carry Flag) = 1 если есть перенос между 3 и 4 разрядом = 0 если нету переноса между 3 и 4 разрядом
HF используется для поддержки BCD-арифметики Инструкции типа DAA и DAS используют этот флаг.