Для чего нужен регистр флагов

Регистр флагов

Регистр флагов содержит различные биты, отражающие текущее состояние процессора и частично управляющие его работой.

Содержание

История

Регистр флагов был уже в первом 16-разрядном микропроцессоре Intel — 8086. Он носил имя FLAGS и имел длину 16 бит. Появление микропроцессора 80286 добавило в регистр FLAGS бит NT и битовое поле IOPL, однако сам регистр оставался 16-разрядным.

С выходом микропроцессора 80386 регистр был расширен до 32 бит и стал называться EFLAGS. В нём появились ещё два дополнительных бита: VM и RF. В последующих поколениях 32-разрядных микропроцессоров были добавлены биты AC, VIF, VIP и ID. Тем не менее, сохранялась полная совместимость «снизу вверх»: любая старая программа, которая корректно работала с регистром EFLAGS, не модифицируя «неизвестные» ей биты, оставалась работоспособной и на последующих процессорах.

Расширение разрядности процессора до 64 бит, первоначально произведённое компанией AMD (технология AMD64) и позже скопированное Intel (EM64T), удвоило и размер регистра флагов, получившего название RFLAGS. Однако его старшая половина (биты с 32-го по 63-й включительно) пока не используется и является зарезервированной, поэтому формат «значащей» части RFLAGS полностью совпадает с форматом EFLAGS.

Назначение разрядов

Формат регистра EFLAGS выглядит следующим образом:

Для чего нужен регистр флагов. Смотреть фото Для чего нужен регистр флагов. Смотреть картинку Для чего нужен регистр флагов. Картинка про Для чего нужен регистр флагов. Фото Для чего нужен регистр флагов

Заметим, что все неиспользуемые биты равны нулю. Исключением является бит 1, который всегда имеет единичное значение.

Далее описывается назначение каждого бита, входящего в состав регистра флагов.

Флаги состояния

Эти флаги отражают результат, полученный в предыдущей арифметико-логической операции. Многие из них могут использоваться в дальнейшем для выполнения условных переходов или условных пересылок.

Флаги этой группы могут изменяться любыми программами с помощью команд, заносящих в регистр флагов новое значение (SAHF, POPF/POPFD/POPFQ).

CFФлаг переноса (бит 0). На самом деле он имеет разное назначение в зависимости от выполняемой инструкции. В арифметических операциях над целыми числами этот флаг, будучи установленным, показывает наличие переноса или заёма (это можно рассматривать как «беззнаковое переполнение»), а будучи сброшеннм — отсутствие переноса или заёма. Кроме того, этот флаг применяется в некоторых других инструкциях и тем или иным образом характеризует полученный результат. Подробно использование этого флага в каждой конкретной инструкции указывается в её описании
PFФлаг чётности (бит 2). Устанавливается, если младший байт результата содержит чётное число единичных битов, в противном случае сбрасывается
AFФлаг вспомогательного переноса (бит 4). Устанавливается при возникновении переноса или заёма из 4-ого раззряда в 3-ий разряд. Сбрасывается при отсутствии такового. Используется командами десятичной коррекции.
ZFФлаг нуля (бит 6). Устанавливается при получении нулевого результата, сбрасывается в противном случае.
SFФлаг знака (бит 7). Устанавливается, если в результате операции получено отрицательное число, т.е. если старший разряд результата равен единице. В противном случае сбрасывается
OFФлаг переполнения (бит 11). Устанавливается, если в результате арифметической операции зафиксировано знаковое переполнение, то есть если результат, рассматриваемый как число со знаком, не помещается в операнд-приёмник. Если знакового переполнения нет, этот флаг сбрасывается

Флаг направления

Этот флаг может изменяться любыми программами с помощью специальных инструкций CLD и STD, а также загрузкой нового содержимого регистра флагов.

DFФлаг направления (бит 10). Когда этот флаг сброшен, строковые операции (MOVS, CMPS, SCAS, LODS и STOS) обрабатывают данные в порядке возрастания адресов (увеличивая содержимое регистров SI/ESI/RSI и DI/EDI/RDI после каждой итерации), а когда установлен — в порядке убывания адресов (уменьшая содержимое указанных регистров после каждой итерации)

Системные флаги

Источник

Регистр флагов

Регистр флагов – это очень важный регистр процессора, который используется при выполнении большинства команд. Регистр флагов носит название EFLAGS. Это 32-разрядный регистр. Однако старшие 16 разрядов используются при работе в защищённом режиме, и пока мы их рассматривать не будем. К младшим 16 разрядам этого регистра можно обращаться как к отдельному регистру с именем FLAGS. Именно этот регистр мы и рассмотрим в этом разделе.

Каждый бит в регистре FLAGS является флагом. Флаг – это один или несколько битов памяти, которые могут принимать двоичные значения (или комбинации значений) и характеризуют состояние какого-либо объекта. Обычно флаг может принимать одно из двух логических значений. Поскольку в нашем случае речь идёт о бите, то каждый флаг в регистре может принимать либо значение 0, либо значение 1. Флаги устанавливаются в 1 при определённых условиях, или установка флага в 1 изменяет поведение процессора. На рис. 2.4 показано, какие флаги находятся в разрядах регистра FLAGS.

Бит1514131211109876543210
Флаг0NTIOPLOFDFIFTFSFZF0AF0PF1CF

Рис. 2.4. Регистр флагов FLAGS.

Флаг установлен, если значение соответствующего ему бита равно 1.

Флаг сброшен, если значение соответствующего ему бита равно 0.

В таблице 2.6 приведено описание флагов регистра FLAGS.

Таблица 2.6. Описание флагов регистра FLAGS.

БитОбозначениеНазваниеОписание
0CFCarry FlagФлаг переноса. Устанавливается в 1, если результат предыдущей операции не уместился в приёмнике и произошёл перенос из старшего бита или если требуется заём (при вычитании). Иначе установлен в 0. Например, этот флаг будет установлен при переполнении, рассмотренном в предыдущем разделе.
11Зарезервирован.
2PFParity FlagФлаг чётности. Устанавливается в 1, если младший байт результата предыдущей команды содержит чётное количество битов, равных 1. Если количество единиц в младшем байте нечётное, то этот флаг равен 0.
30Зарезервирован.
4AFAuxiliary Carry FlagВспомогательный флаг переноса (или флаг полупереноса). Устанавливается в 1, если в результате предыдущей операции произошёл перенос (или заём) из третьего бита в четвёртый. Этот флаг используется автоматически командами двоично-десятичной коррекции.
50Зарезервирован.
6ZFZero FlagФлаг нуля. Устанавливается 1, если результат предыдущей команды равен 0.
7SFSign FlagФлаг знака. Этот флаг всегда равен старшему биту результата.
8TFTrap FlagФлаг трассировки (или флаг ловушки). Он был предусмотрен для работы отладчиков в пошаговом выполнении, которые не используют защищённый режим. Если этот флаг установить в 1, то после выполнения каждой программной команды управление временно передаётся отладчику (вызывается прерывание 1).
9IFInterrupt Enable FlagФлаг разрешения прерываний. Если сбросить этот флаг в 0, то процессор перестанет обрабатывать прерывания от внешних устройств. Обычно его сбрасывают на короткое время для выполнения критических участков программы.
10DFDirection FlagФлаг направления. Контролирует поведение команд обработки строк. Если установлен в 1, то строки обрабатываются в сторону уменьшения адресов, если сброшен в 0, то наоборот.
11OFOverflow FlagФлаг переполнения. Устанавливается в 1, если результат предыдущей арифметической операции над числами со знаком выходит за допустимые для них пределы. Например, если при сложении двух положительных чисел получается число со старшим битом, равным единице, то есть отрицательное. И наоборот.
12
13
IOPLI/O Privilege LevelУровень приоритета ввода/вывода.
14NTNested TaskФлаг вложенности задач.
150Зарезервирован.

Значения некоторых флагов можно изменять напрямую с помощью специальных команд. Однако нет инструкций, которые бы позволяли обращаться к регистру флагов как к обычному регистру по имени. Некоторые флаги устанавливаются автоматически и предназначены только для чтения.

Сейчас вам будет понятно далеко не всё из того, что описано в таблице 2.4. Например, вы пока не знаете, что такое прерывания. Но всему своё время. Пока просто запомните страницу с описанием регистра флагов и возвращайтесь к ней по мере необходимости.

Системные флаги IOPL предназначены для управления операционной средой в защищённом режиме. Они не используются в прикладных программах.

Источник

Регистр флагов

Регистр флагов — регистр процессора, отражающий текущее состояние процессора.

Содержание

Архитектура x86

В микропроцессорах Intel 8086 имеет название FLAGS и является 16-разрядным. Расширенные регистры EFLAGS и RFLAGS, введённые в архитектурах IA-32 (процессоры 80386) и x86-64, являются 32-битными и 64-битными соответственно. Расширенные регистры сохраняют обратную совместимость.

Регистр флагов содержит группу флагов состояния, управляющий флаг и группу системных флагов [1] :

Регистр флагов Intel x86
Бит, №ОбозначениеНазваниеОписаниеТип флагаКогда введён
FLAGS
0CFCarry FlagФлаг переносаСостояние
11Зарезервирован
2PFParity FlagФлаг чётностиСостояние
30Зарезервирован
4AFAuxiliary Carry FlagВспомогательный флаг переносаСостояние
50Зарезервирован
6ZFZero FlagФлаг нуляСостояние
7SFSign FlagФлаг знакаСостояние
8TFTrap FlagФлаг трассировки (пошаговое выполнение)Системный
9IFInterrupt Enable FlagФлаг разрешения прерыванийСистемный
10DFDirection FlagФлаг направленияУправляющий
11OFOverflow FlagФлаг переполненияСостояние
12IOPLI/O Privilege LevelУровень приоритета ввода-выводаСистемный80286
13
14NTNested TaskФлаг вложенности задачСистемный80286
150Зарезервирован
EFLAGS
16RFResume FlagФлаг возобновленияСистемный80386
17VMVirtual-8086 ModeРежим виртуального процессора 8086Системный80386
18ACAlignment CheckПроверка выравниванияСистемный80486SX
19VIFVirtual Interrupt FlagВиртуальный флаг разрешения прерыванияСистемныйPentium
20VIPVirtual Interrupt PendingОжидающее виртуальное прерываниеСистемныйPentium
21IDID FlagПроверка на доступность инструкции CPUIDСистемныйПоздние 80486 [2]
220Зарезервированы
31
RFLAGS
320Зарезервированы
63

При приостановке задачи (используя многозадачные возможности процессора), процессор автоматически сохраняет значение флага регистров в TSS (task state segment), при активизации новой задачи процессор загружает регистр флагов из TSS новой задачи.

Когда активизируется обработчик прерывания или обработчик исключительной ситуации, процессор автоматически сохраняет значение флага регистров в текущем стеке.

Флаги состояния

Флаги состояния позволяют одной и той же арифметической инструкции выдавать результат трёх различных типов: беззнаковое, знаковое и двоично-десятично кодированное (BCD) целое число. Если результат считать беззнаковым числом, то флаг CF показывает условие переполнения (перенос или заём), для знакового результата (в дополнительном коде) перенос или заём показывает флаг OF, а для BCD-результата перенос/заём показывает флаг AF. Флаг SF отражает знак знакового результата, флаг ZF отражает и беззнаковый, и знаковый нулевой результат.

В длинной целочисленной арифметике флаг CF используется совместно с инструкциями сложения с переносом ( ADC ) и вычитания с заёмом ( SBB ) для распространения переноса или заёма из одного вычисляемого разряда длинного числа в другой.

Инструкции условного перехода Jcc (переход по условию cc — например, JNZ для перехода, если результат не ноль), SETcc (установить значение байта-результата в зависимости от условия cc), LOOPcc (организация цикла) и CMOVcc (условное копирование) используют один или несколько флагов состояния для проверки условия. Например, инструкция перехода JLE (jump if less or equal — переход, если «меньше или равен», ≤) проверяет условие «ZF=1 или SF ≠ OF».

Управляющий флаг

Системные флаги и поле IOPL

Системные флаги и поле IOPL управляют операционной средой и не предназначены для использования в прикладных программах.

Идентификация процессора

В поздних версиях процессора 80486 появилась инструкция CPUID, позволяющая идентифицировать процессор, на котором работает программа. В более ранних процессорах для идентификации нужно анализировать особенности поведения инструкций и, в том числе, регистра флагов.

К примеру, в процессорах 8086 и 80186 биты 12-15 регистра флагов всегда установлены, в процессорах 80286 и новее биты 12-14 содержат поле IOPL и флаг NT и в реальном режиме всегда сброшены. Это позволяет в 16-битном коде различать процессоры 808x/8018x, 80286 и 80386 (и новее):

Источник

Внутренние регистры: Регистр флагов

Регистр флагов EFLAGS отражает текущее состояние процессора, многие из его битов устанавливаются после выполнения операций и индицируют тип, полученного результата. Формат регистра флагов приведен на рис. 1.3.

Для чего нужен регистр флагов. Смотреть фото Для чего нужен регистр флагов. Смотреть картинку Для чего нужен регистр флагов. Картинка про Для чего нужен регистр флагов. Фото Для чего нужен регистр флагов

Рис. 1.3. Формат регистра флагов

CF (Флаг переноса, бит 0)

Флаг переноса фиксирует значение переноса (заема), возникающего при сложении (вычитании). Иногда используется и в других ситуациях.

PF (Флаг четности, бит 2)

Флаг четности фиксирует наличие четного числа единиц в младшем байте результата операции, может быть использован, например, для контроля правильности передачи данных.

AF (Флаг вспомогательного переноса, бит 4)

Флаг вспомогательного переноса фиксирует перенос (заем) из младшей тетрады, т.е. из бита 3 в старшую тетраду при сложении (вычитании). Используется только для двоично-десятичной арифметики, которая оперирует исключительно младшими байтами.

ZF (Флаг нуля, бит 6)

Флаг нуля сигнализирует о получении нулевого (ZF = 1) или ненулевого (ZF = 0) результата операции.

SF (Флаг знака, бит 7)

Флаг знака дублирует значение старшего бита результата, который при использовании дополнительного кода соответствует знаку числа (0 – положительное число, 1 – отрицательное).

TF (Флаг трассировки, бит 8)

При установке флага трассировки TF = 1, микропроцессор переходит в пошаговый режим работы, применяемый при отладке программ, когда автоматически генерируется особая ситуация отладки (#DB) после выполнения каждой команды. Прерывание отладки начнет генерироваться, если прикладная программа установит флаг TF с помощью команд POPF/POPFD или IRET/IRETD.

IF (Флаг разрешения прерываний, бит 9)

При установке флага разрешения прерываний IF = 1, микропроцессор воспринимает (распознает) и соответственно реагирует на запрос прерывания по входу INTR# (внешние маскируемые прерывания). При IF = 0, прерывания по этому входу запрещаются и микропроцессор игнорирует поступающие запросы прерываний.

Значение флага IF не влияет на восприятие внешних немаскируемых прерываний по входу NMI#, а также внутренних программных прерываний, выполняемых по команде INT.

Изменение этого флага командами CLI, STI, POPF/POPFD и IRET/IRETD возможно не всегда и определяется текущими:

При обычной обработке прерываний (CR4.PVI = 0 в защищенном режиме или CR4.VME = 0 в режиме V86), когда IOPL IOPL в защищенном режиме (а также всегда в режиме V86), производится дополнительная проверка доступности соответствующего порта ввода/вывода при любых операциях с ним. Такая проверка использует специальную карту разрешения ввода/вывода, которая расположена в верхней части сегмента состояния задачи TSS и определяет доступность всех портов ввода/вывода. В случае недоступности порта или при попытках разрешения/запрещения прерываний командами CLI, STI, когда CPL > IOPL, процессор генерирует ошибку общей защиты (#GP).

Изменение уровня привилегий ввода/вывода IOPL возможно командами POPF/POPFD и IRET/IRETD в защищенном режиме и только при выполнении команды на уровне привилегий, по крайней мере таком же (а для команды POPF/POPFD только на нулевом), как и текущий уровень привилегий ввода/вывода (режим реальной адресации эквивалентен нулевому уровню привилегий).

При работе в режиме V86 (EFLAGS.VM = 1) IOPL-чувствительными являются команды CLI, STI, POPF/POPFD, PUSHF/PUSHFD, IRET/IRETD, INT n. У каждой из этих команд имеется аналогичная зависимость от текущего значения поля IOPL. Например, команда INT n вызывает генерацию особой ситуации общей защиты (#GP), если IOPL (включается установкой флага CR4.VME = 1 в режиме V86 ), в котором возникает дополнительная специфика для IOPL-чувствительных команд. Во-первых, команда IRET в этом режиме вообще перестает быть IOPL-чувствительной и не генерирует особую ситуацию общей защиты (#GP) при IOPL устанавливаются равными 3, а бит IF записывается из текущего значения флага VIF.

В ранних моделях процессоров до Intel286 (8086/8088, Intel186) биты 12 и 13 регистра флагов FLAGS, соответствующие полю IOPL, считались зарезервированными, а их значения всегда были равны единице. В процессоре Intel286 в режиме реальной адресации невозможно изменять значения этих битов — они всегда остаются нулевыми (они сбрасываются в момент инициализации процессора), а вот более поздние модели процессоров, начиная с Intel386, такого ограничения уже не имеют, то есть поле IOPL можно изменять и в режиме реальной адресации. Указанная особенность использовалась в процедурах идентификации процессоров вплоть до появления команды CPUID в процессоре Pentium.

NT (Вложенная задача, бит 14: Intel286 …)

Процессор устанавливает и проверяет флаг вложенной задачи для контроля за прерванными задачами (задачи, во время исполнения которых имело место прерывание) и при вызове процедур. Флаг NT влияет на действия, производимые командой IRET/IRETD. Этот флаг может быть изменен командой POPF/POPFD и IRET/IRETD. Некорректные изменения этого флага могут привести к возникновению различных особых ситуаций в прикладных программах.

RF (Флаг возобновления, бит 16: Intel386 …)

Флаг возобновления RF временно выключает обработку особых ситуаций отладки (DB#) для того, чтобы команда, вызвавшая такую ситуацию, могла быть перезапущена и не стала бы причиной новой особой ситуации. Отладчик устанавливает этот флаг командой IRETD при возврате в прерванную программу. Команды POPF, POPFD (в режиме V86) и IRET на этот флаг не влияют.

VM (Виртуальный режим, бит 17: Intel386 …)

Установка флага виртуального режима VM переключает процессор в режим виртуального-8086 (специальный случай защищенного режима).

AC (Режим контроля выравнивания, бит 18: Intel486 …)

Установка флага режима контроля выравнивания (AC = 1) и бита AM регистра CR0 (CR0.AM = 1) включает контроль выравнивания при обращении к памяти. При этом только при текущем уровне привилегий равном 3 (CPL = 3) генерируется особая ситуация контроля выравнивания (#AC), если происходит обращение к невыровненному операнду (например, к слову по нечетному адресу или к двойному слову по адресу не кратному четырем).

Таблица 3.5. Условия контроля выравнивания

Источник

Флаговый регистр (flags)

Для чего нужен регистр флагов. Смотреть фото Для чего нужен регистр флагов. Смотреть картинку Для чего нужен регистр флагов. Картинка про Для чего нужен регистр флагов. Фото Для чего нужен регистр флагов Для чего нужен регистр флагов. Смотреть фото Для чего нужен регистр флагов. Смотреть картинку Для чего нужен регистр флагов. Картинка про Для чего нужен регистр флагов. Фото Для чего нужен регистр флагов Для чего нужен регистр флагов. Смотреть фото Для чего нужен регистр флагов. Смотреть картинку Для чего нужен регистр флагов. Картинка про Для чего нужен регистр флагов. Фото Для чего нужен регистр флагов Для чего нужен регистр флагов. Смотреть фото Для чего нужен регистр флагов. Смотреть картинку Для чего нужен регистр флагов. Картинка про Для чего нужен регистр флагов. Фото Для чего нужен регистр флагов

Для чего нужен регистр флагов. Смотреть фото Для чего нужен регистр флагов. Смотреть картинку Для чего нужен регистр флагов. Картинка про Для чего нужен регистр флагов. Фото Для чего нужен регистр флагов

Для чего нужен регистр флагов. Смотреть фото Для чего нужен регистр флагов. Смотреть картинку Для чего нужен регистр флагов. Картинка про Для чего нужен регистр флагов. Фото Для чего нужен регистр флагов

Этот регистр содержит 16 бит. Регистр используется побитно, т.е. каждый бит имеет определенное функциональное назначение, который называется флагом. Флаги управляются различными командами для индикации состояния операции. Во всех случаях флаги сохраняют свое значение до тех пор, пока другая команда не изменит его.

Для чего нужен регистр флагов. Смотреть фото Для чего нужен регистр флагов. Смотреть картинку Для чего нужен регистр флагов. Картинка про Для чего нужен регистр флагов. Фото Для чего нужен регистр флагов

Рис. 7. 1. Флаговый регистр flags.

Рассмотрим флаги регистра flags в последовательности справа налево.

Два последних флага мы рассматривать не будем по той причине, что наши примеры выполняются не в защищенном режиме, а в режиме реальных адресов.

В качестве примера возьмем команду CMP, которая сравнивает два операнда и воздействует на флаги AF, CF, OF, PF, SF, ZF. Однако нет необходимости проверять все эти флаги по отдельности. В следующем примере проверяется, содержит ли регистр BX нулевое значение:

CMP BX,00 ;Сравнение BX с нулем

JZ B50 ;Переход на B50 если нуль

. (действия при не нуле)

Если BX содержит нулевое значение, команда CMP устанавливает флаг нуля ZF в единичное состояние, и возможно изменяет другие флаги. Команда JZ (переход, если нуль) проверяет только флаг ZF. При единичном значении ZF, обозначающее нулевой признак, команда передает управление на адрес, указанный в ее операнде, т.е. на метку B50.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *