Регистр состояния , регистр флага или регистр кода состояния ( 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, если alow < clow, иначе 0 sltu tmp , alow , clow addu ahigh , bhigh , chigh addu ahigh , ahigh , tmp
Инструкция sltu
устанавливает tmp
значение 1 или 0 на основе указанного сравнения двух других ее операндов. (Здесь регистр общего назначения tmp
не используется в качестве регистра состояния для управления условным переходом; вместо этого возможное значение 1, указывающее на перенос из сложения младшего разряда, добавляется к слову старшего разряда.)
Эта схема становится менее удобной при добавлении трех или более слов, поскольку при вычислении происходит два сложения b + c + tmp
, каждое из которых может генерировать перенос, который должен быть обнаружен двумя sltu
инструкциями. К счастью, эти два переноса могут быть добавлены друг к другу без риска переполнения, поэтому ситуация стабилизируется при пяти инструкциях на добавленное слово.