Регистр состояния , регистр флагов или регистр кода состояния ( CCR ) представляет собой набор битов флага состояния процессора . Примеры таких регистров включают регистр FLAGS в архитектуре x86 , флаги в регистре слова состояния программы (PSW) в архитектуре IBM System/360 через z/Architecture и регистр состояния прикладной программы (APSR) в архитектуре ARM Cortex-A. . [1]
Регистр состояния — это аппаратный регистр , содержащий информацию о состоянии процессора . Отдельные биты неявно или явно считываются и/или записываются инструкциями машинного кода , выполняющимися на процессоре. Регистр состояния позволяет команде выполнять действие в зависимости от результата предыдущей инструкции.
Обычно флаги в регистре состояния изменяются в результате арифметических и битовых операций. Например, бит Z может быть установлен, если результат операции равен нулю, и сброшен, если он не равен нулю. Другие классы инструкций также могут изменять флаги для обозначения статуса. Например, строковая инструкция может делать это, чтобы указать, завершилась ли инструкция из-за того, что она обнаружила совпадение/несовпадение, или потому, что она обнаружила конец строки. Флаги считываются последующей условной инструкцией, так что указанное действие (в зависимости от процессора, переход, вызов, возврат и т. д.) происходит только в том случае, если флаги указывают на указанный результат предыдущей инструкции.
Некоторые архитектуры ЦП, такие как MIPS и Alpha , не используют выделенный регистр флагов. Другие не устанавливают и/или не читают флаги неявно. Такие машины либо вообще не передают неявную информацию о состоянии между инструкциями, либо передают ее в явно выбранном регистре общего назначения.
Регистр состояния часто может иметь и другие поля, такие как более специализированные флаги, биты разрешения прерывания и аналогичные типы информации. Во время прерывания состояние выполняющегося в данный момент потока может быть сохранено (а позже вызвано) путем сохранения текущего значения регистра состояния вместе со счетчиком программы и другими активными регистрами в машинном стеке или какой-либо другой зарезервированной области памяти.
Это список наиболее распространенных флагов регистров состояния ЦП, реализованных почти во всех современных процессорах.
На некоторых процессорах регистр состояния также содержит такие флаги:
Флаги состояния позволяют инструкции действовать на основе результата предыдущей инструкции. В конвейерных процессорах, таких как суперскалярные и спекулятивные процессоры, это может создавать опасности , которые замедляют обработку или требуют дополнительного оборудования для их обхода. [4]
Некоторые текстовые процессоры с очень длинными командами обходятся без флагов состояния. Одна инструкция одновременно выполняет тест и указывает, по какому результату этого теста следует выполнить действие, например «Сравнить a с b» и «Перейти к c , если равно». Результат теста не сохраняется для последующих инструкций.
Другая альтернатива регистру состояния заключается в том, что инструкции процессора помещают информацию о состоянии в регистр общего назначения, когда программа ее запрашивает. MIPS , AMD 29000 , DEC Alpha и RISC-V являются примерами архитектур, которые предоставляют инструкции сравнения, которые сохраняют результат сравнения в регистре общего назначения в виде одного бита или числового значения 0 или 1. Условные переходы действуют на основе значение в регистре общего назначения.
Обычно инструкции сравнения проверяют равенство или величину со знаком/без знака. Для проверки других условий программа использует формулу эквивалентности. Например, в MIPS нет «бита переноса», но программа, выполняющая сложение нескольких слов, может проверить, не произошло ли переполнение регистров при сложении одного слова, проверив, меньше ли сумма, чем операнд: [4]
# alow = Blow + Clow addu Alow , Blow , Clow # Установить tmp = 1 if alow < Clow, else 0 sltu tmp , alow , clow addu ahigh , bhigh , chigh addu ahigh , ahigh , tmp
Инструкция sltu
устанавливает tmp
значение 1 или 0 на основе заданного сравнения двух других операндов. (Здесь регистр общего назначения tmp
не используется в качестве регистра состояния для управления условным переходом; вместо этого к старшему слову добавляется возможное значение 1, указывающее на перенос из сложения младшего порядка.)
Эта схема становится менее удобной при добавлении трех и более слов, так как при вычислении происходит два сложения b + c + tmp
, любое из которых может генерировать перенос, который необходимо обнаружить двумя sltu
инструкциями. К счастью, эти два переноса можно добавлять друг к другу без риска переполнения, поэтому ситуация стабилизируется при добавлении пяти инструкций на слово.