Регистр состояния
Регистр состояния , регистр флагов или регистр кода состояния ( CCR собой набор флага битов состояния процессора ) представляет . Примеры таких регистров включают регистр FLAGS в архитектуре x86 , флаги в регистре слова состояния программы (PSW) в архитектуре IBM System/360 через z/Architecture и регистр состояния прикладной программы (APSR) в ARM Cortex-A архитектуре . . [1]
Регистр состояния — это аппаратный регистр , содержащий информацию о состоянии процессора . Отдельные биты неявно или явно считываются и/или записываются инструкциями машинного кода , выполняющимися на процессоре. Регистр состояния позволяет команде выполнять действие в зависимости от результата предыдущей инструкции.
Обычно флаги в регистре состояния изменяются в результате арифметических и битовых операций. Например, бит Z может быть установлен, если результат операции равен нулю, и сброшен, если он не равен нулю. Другие классы инструкций также могут изменять флаги для обозначения статуса. Например, строковая инструкция может делать это, чтобы указать, завершилась ли инструкция из-за того, что она обнаружила совпадение/несовпадение, или потому, что она обнаружила конец строки. Флаги считываются последующей условной инструкцией, так что указанное действие (в зависимости от процессора, переход, вызов, возврат и т. д.) происходит только в том случае, если флаги указывают на указанный результат предыдущей инструкции.
Некоторые архитектуры ЦП, такие как MIPS и Alpha , не используют выделенный регистр флагов. Другие не устанавливают и/или не читают флаги неявно. Такие машины либо вообще не передают неявную информацию о состоянии между инструкциями, либо передают ее в явно выбранном регистре общего назначения.
Регистр состояния часто может иметь и другие поля, такие как более специализированные флаги, биты разрешения прерывания и аналогичные типы информации. Во время прерывания состояние выполняющегося в данный момент потока может быть сохранено (а позже вызвано) путем сохранения текущего значения регистра состояния вместе со счетчиком программы и другими активными регистрами в машинном стеке или какой-либо другой зарезервированной области памяти.
Общие флаги
[ редактировать ]Это список наиболее распространенных флагов регистров состояния ЦП, реализованных почти во всех современных процессорах.
Флаг | Имя | Описание |
---|---|---|
С | Нулевой флаг | Указывает, что результат арифметической или логической операции (или, иногда, загрузки) равен нулю. |
С | Нести флаг | Позволяет складывать/вычитать числа, превышающие одно слово, путем переноса двоичной цифры от менее значимого слова к наименее значимому биту более значимого слова по мере необходимости. Он также используется для расширения битовых сдвигов и ротации аналогичным образом на многих процессорах (иногда это делается с помощью специального флага X ). |
С / Н | Знак флага Отрицательный флаг |
Указывает, что результат математической операции отрицательный. В некоторых процессорах [2] Флаги N и S имеют разные значения и способы использования: один указывает, был ли последний результат отрицательным, тогда как другой указывает, имело ли место вычитание или сложение. |
В / О / Вт | Флаг переполнения | Указывает, что результат операции со знаком слишком велик, чтобы поместиться в ширину регистра с использованием представления дополнения до двух . |
Другие флаги
[ редактировать ]На некоторых процессорах регистр состояния также содержит такие флаги:
Флаг | Имя | Описание |
---|---|---|
Г / А / ДК | Флаг полупереноса Вспомогательный флаг Цифровой перенос Флаг десятичной корректировки |
(обычно между 4-битными половинами байтового операнда) произошел перенос битов Указывает, что между полубайтами в результате последней арифметической операции. Такой флаг обычно полезен для реализации арифметических операций BCD на двоичном оборудовании. |
П | Флаг паритета | Указывает, является ли количество установленных битов последнего результата нечетным или четным. |
я | Флаг прерывания | На некоторых процессорах этот бит указывает, разрешены или замаскированы прерывания. [3] Если процессор имеет несколько уровней приоритета прерываний , например PDP-11 , несколько битов могут использоваться для указания приоритета текущего потока, что позволяет прерывать его только аппаратно, установленным на более высокий приоритет. В других архитектурах бит может указывать, что в данный момент активно прерывание и что текущий поток является частью обработчика прерывания . |
С | Флаг супервизора | На процессорах, которые обеспечивают два или более колец защиты , один или несколько битов в регистре состояния указывают кольцо текущего потока (насколько ему доверяют или должен ли он использовать операционную систему для запросов, которые могут помешать другим потокам). На процессоре только с двумя кольцами один бит может отличить режим супервизора от режима пользователя. |
Архитектуры ЦП без арифметических флагов
[ редактировать ]Флаги состояния позволяют инструкции действовать на основе результата предыдущей инструкции. В конвейерных процессорах, таких как суперскалярные и спекулятивные процессоры, это может создавать опасности , которые замедляют обработку или требуют дополнительного оборудования для их обхода. [4]
Некоторые текстовые процессоры с очень длинными командами обходятся без флагов состояния. Одна инструкция одновременно выполняет тест и указывает, по какому результату этого теста следует выполнить действие, например «Сравнить a с b» и «Перейти к c, если равно». Результат теста не сохраняется для последующих инструкций.
Другая альтернатива регистру состояния заключается в том, что инструкции процессора помещают информацию о состоянии в регистр общего назначения, когда программа ее запрашивает. MIPS , AMD 29000 , DEC Alpha и RISC-V являются примерами архитектур, которые предоставляют инструкции сравнения, которые сохраняют результат сравнения в регистре общего назначения в виде одного бита или числового значения 0 или 1. Условные переходы действуют на основе значение в регистре общего назначения.
Обычно инструкции сравнения проверяют равенство или величину со знаком/без знака. Для проверки других условий программа использует формулу эквивалентности. Например, в MIPS нет «бита переноса», но программа, выполняющая сложение нескольких слов, может проверить, не произошло ли переполнение регистров при сложении одного слова, проверив, меньше ли сумма, чем операнд: [4]
# alow = blow + clow
addu alow, blow, clow
# set tmp = 1 if alow < clow, else 0
sltu tmp, alow, clow
addu ahigh, bhigh, chigh
addu ahigh, ahigh, tmp
The sltu
наборы команд tmp
до 1 или 0 на основе указанного сравнения двух других операндов. (Здесь регистр общего назначения tmp
не используется в качестве регистра состояния для управления условным переходом; скорее, к старшему слову добавляется возможное значение 1, указывающее на перенос от сложения младшего порядка.)
Эта схема становится менее удобной при сложении трех и более слов, так как при вычислении происходит два сложения. b + c + tmp
, любой из которых может генерировать перенос, который должен быть обнаружен с помощью двух sltu
инструкции. К счастью, эти два переноса можно добавлять друг к другу без риска переполнения, поэтому ситуация стабилизируется при добавлении пяти инструкций на слово.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Информационный центр АРМ» . infocenter.arm.com . Проверено 18 мая 2019 г.
- ^ «Руководство по эксплуатации Toshiba 900, глава 3» (PDF) . Архивировано из оригинала (PDF) 15 января 2006 г.
- ^ «8-битный микроконтроллер Atmel со встроенной программируемой флэш-памятью 4/8/16/32 КБ — техническое описание» (PDF) . Микрочиповая технология .
- ^ Перейти обратно: а б Маши, Джон (4 июня 1996 г.). «Носите биты; ловушка архитектора» . Проверено 5 октября 2013 г.