Регистр состояния , регистр флага или регистр кода состояния ( CCR ) — это набор битов флага состояния для процессора . Примерами таких регистров являются регистр FLAGS в архитектуре x86 , флаги в регистре слова состояния программы (PSW) в архитектуре IBM System/360 через z/Architecture и регистр состояния прикладной программы (APSR) в архитектуре ARM Cortex-A . [1]
Регистр состояния — это аппаратный регистр , содержащий информацию о состоянии процессора . Отдельные биты явно или неявно считываются и/или записываются инструкциями машинного кода, выполняемыми на процессоре. Регистр состояния позволяет инструкции выполнять действие в зависимости от результата предыдущей инструкции.
Обычно флаги в регистре состояния изменяются в результате арифметических операций и операций битовой манипуляции. Например, бит Z может быть установлен, если результат операции равен нулю, и очищен, если он не равен нулю. Другие классы инструкций также могут изменять флаги для указания статуса. Например, строковая инструкция может сделать это, чтобы указать, была ли инструкция завершена из-за того, что она нашла совпадение/несовпадение или потому, что она нашла конец строки. Флаги считываются последующей условной инструкцией, так что указанное действие (в зависимости от процессора, переход, вызов, возврат или т. д.) происходит только в том случае, если флаги указывают на указанный результат предыдущей инструкции.
Некоторые архитектуры ЦП, такие как MIPS и Alpha , не используют выделенный регистр флагов. Другие неявно не устанавливают и/или не считывают флаги. Такие машины либо вообще не передают неявную информацию о состоянии между инструкциями, либо передают ее в явно выбранном регистре общего назначения.
Регистр состояния часто может иметь и другие поля, такие как более специализированные флаги, биты разрешения прерывания и подобные типы информации. Во время прерывания состояние текущего потока может быть сохранено (и позже вызвано) путем сохранения текущего значения регистра состояния вместе со счетчиком программ и другими активными регистрами в машинном стеке или какой-либо другой зарезервированной области памяти.
Это список наиболее распространенных флагов регистров состояния ЦП, реализованных почти во всех современных процессорах.
Флаг | Имя | Описание |
---|---|---|
З | Нулевой флаг | Указывает, что результат арифметической или логической операции (или, иногда, загрузки) был равен нулю. |
С | Нести флаг | Позволяет складывать/вычитать числа, превышающие одно слово, перенося двоичную цифру из менее значимого слова в наименее значимый бит более значимого слова по мере необходимости. Он также используется для расширения битовых сдвигов и вращается аналогичным образом на многих процессорах (иногда выполняется с помощью выделенного флага X ). |
Серийный номер | Знак флага Отрицательный флаг | Указывает, что результат математической операции отрицательный. В некоторых процессорах [2] флаги N и S различаются по значению и использованию: один указывает, был ли последний результат отрицательным, тогда как другой указывает, имело ли место вычитание или сложение. |
В / О / Б | Флаг переполнения | Указывает, что знаковый результат операции слишком велик для размещения в регистре с использованием представления в виде дополнения до двух . |
На некоторых процессорах регистр состояния также содержит такие флаги:
Флаг | Имя | Описание |
---|---|---|
Н / А / DC | Флаг полупереноса Вспомогательный флаг Перенос цифр Флаг корректировки десятичных дробей | Указывает, что был произведен перенос бита между полубайтами (обычно между 4-битными половинами байтового операнда) в результате последней арифметической операции. Такой флаг обычно полезен для реализации арифметических операций BCD на двоичном оборудовании. |
П | Флаг паритета | Указывает, является ли число установленных битов последнего результата четным или нечетным. |
я | Флаг прерывания | На некоторых процессорах этот бит указывает, включены или замаскированы прерывания. [3] Если процессор имеет несколько уровней приоритета прерываний , например PDP-11 , несколько бит могут использоваться для указания приоритета текущего потока, позволяя прерывать его только оборудованием, установленным на более высокий приоритет. На других архитектурах бит может указывать на то, что прерывание в данный момент активно, и что текущий поток является частью обработчика прерываний . |
С | Флаг супервайзера | На процессорах, которые предоставляют два или более защитных колец , один или несколько битов в регистре состояния указывают кольцо текущего потока (насколько он доверен или должен ли он использовать операционную систему для запросов, которые могут помешать другим потокам). На процессоре только с двумя кольцами один бит может отличать режим Supervisor от режима User. |
Флаги состояния позволяют инструкции действовать на основе результата предыдущей инструкции. В конвейерных процессорах, таких как суперскалярные и спекулятивные процессоры, это может создавать опасности, которые замедляют обработку или требуют дополнительного оборудования для их обхода. [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
инструкциями. К счастью, эти два переноса могут быть добавлены друг к другу без риска переполнения, поэтому ситуация стабилизируется при пяти инструкциях на добавленное слово.