Флаги состояния и коды условий
← Все статьи

Флаги состояния и коды условий

6 мин

Результат — это больше, чем просто число

АЛУ выдаёт не только сумму или разность двух операндов — реальные процессоры также защёлкивают несколько однобитных флагов состояния, описывающих свойства этого результата, потому что программе постоянно нужно задавать о нём вопросы да/нет: был ли он нулевым, произошло ли переполнение, дало ли сложение перенос.

Нуль и перенос

Два флага покрывают основу:

  • Нуль (Z) — 1, когда все биты результата равны 0. Блок ZERO_DET в Boolflow вычисляет это, объединяя все биты результата.
  • Перенос (C) — собственный Cout сумматора, защёлкиваемый вместе с результатом. При вычитании перенос из A+(¬B)+1 по соглашению означает «заём не произошёл», то есть A≥B.

Переполнение: когда переноса недостаточно

Один только перенос не подскажет, что знаковый результат неверен — сложение двух больших положительных чисел в дополнительном коде может дать результат, внешне похожий на отрицательный, вообще без переноса. Стандартное решение — Overflow (V) = Cout XOR (перенос в знаковый разряд): эти два внутренних переноса совпадают при обычной работе и расходятся ровно тогда, когда знаковый результат «переполнился».

От флагов к переходам

Условный переход вроде «перейти, если равно» — это всего лишь проверка флага Zero, оставшегося после предшествующего компаратора или вычитания. Подключите CMP4 или вычитающее АЛУ к ZERO_DET в редакторе схем — и вы соберёте ту самую половину любого if-выражения процессора, что отвечает за проверку условия.

Подключить флаги нуля и переноса в редакторе схем →