Результат — это больше, чем просто число
АЛУ выдаёт не только сумму или разность двух операндов — реальные процессоры также защёлкивают несколько однобитных флагов состояния, описывающих свойства этого результата, потому что программе постоянно нужно задавать о нём вопросы да/нет: был ли он нулевым, произошло ли переполнение, дало ли сложение перенос.
Нуль и перенос
Два флага покрывают основу:
- Нуль (Z) — 1, когда все биты результата равны 0. Блок ZERO_DET в Boolflow вычисляет это, объединяя все биты результата.
- Перенос (C) — собственный Cout сумматора, защёлкиваемый вместе с результатом. При вычитании перенос из A+(¬B)+1 по соглашению означает «заём не произошёл», то есть A≥B.
Переполнение: когда переноса недостаточно
Один только перенос не подскажет, что знаковый результат неверен — сложение двух больших положительных чисел в дополнительном коде может дать результат, внешне похожий на отрицательный, вообще без переноса. Стандартное решение — Overflow (V) = Cout XOR (перенос в знаковый разряд): эти два внутренних переноса совпадают при обычной работе и расходятся ровно тогда, когда знаковый результат «переполнился».
От флагов к переходам
Условный переход вроде «перейти, если равно» — это всего лишь проверка флага Zero, оставшегося после предшествующего компаратора или вычитания. Подключите CMP4 или вычитающее АЛУ к ZERO_DET в редакторе схем — и вы соберёте ту самую половину любого if-выражения процессора, что отвечает за проверку условия.