11.7. ОТКУДА БЕРУТСЯ ФЛАГИ?
В процессорах используются флаги (специальные биты которые устанавливаются
в зависимости от результата операции).
Флаги переноса и знака
Рассмотрим сумматор (на примере 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 используют этот флаг.
Index Prev Next