Главная /
Ассемблер /
Для чайников /
Введение /
Представление данных /
Регистр флагов
Регистр флагов – это очень важный
регистр
процессора, который используется при выполнении большинства команд. Регистр флагов носит
название EFLAGS. Это 32-разрядный регистр. Однако старшие 16 разрядов используются при работе в защищённом режиме, и пока мы их рассматривать не будем. К младшим 16 разрядам этого регистра можно обращаться как к отдельному регистру с именем FLAGS. Именно этот регистр мы и рассмотрим в этом разделе.
Каждый бит в регистре FLAGS является флагом. Флаг – это
один или несколько битов памяти, которые могут принимать двоичные значения
(или комбинации значений) и характеризуют состояние какого-либо объекта.
Обычно флаг может принимать одно из двух логических значений. Поскольку в нашем
случае речь идёт о бите, то каждый флаг в регистре может принимать либо значение 0,
либо значение 1. Флаги устанавливаются в 1 при определённых условиях, или установка
флага в 1 изменяет поведение процессора. На рис. 2.4 показано, какие флаги находятся
в разрядах регистра FLAGS.
Бит |
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Флаг |
0 | NT | IOPL | OF | DF | IF | TF | SF | ZF | 0 | AF | 0 | PF | 1 | CF |
Рис. 2.4. Регистр флагов FLAGS.
Флаг установлен, если значение соответствующего ему бита равно 1.
Флаг сброшен, если значение соответствующего ему бита равно 0.
В таблице 2.6 приведено описание флагов регистра FLAGS.
Таблица 2.6. Описание флагов регистра FLAGS.
Бит |
Обозначение |
Название |
Описание |
0 |
CF |
Carry Flag |
Флаг переноса. Устанавливается в 1, если результат предыдущей операции не уместился
в приёмнике и произошёл перенос из старшего бита или если требуется заём (при вычитании).
Иначе установлен в 0. Например, этот флаг будет установлен при переполнении, рассмотренном в
предыдущем разделе. |
1 |
1 |
- |
Зарезервирован. |
2 |
PF |
Parity Flag |
Флаг чётности. Устанавливается в 1, если младший байт результата предыдущей команды содержит чётное количество битов, равных 1. Если количество единиц в младшем байте нечётное, то этот флаг равен 0. |
3 |
0 |
- |
Зарезервирован. |
4 |
AF |
Auxiliary Carry Flag |
Вспомогательный флаг переноса (или флаг полупереноса). Устанавливается в 1, если в результате предыдущей операции произошёл перенос (или заём) из третьего бита в четвёртый. Этот флаг используется автоматически командами двоично-десятичной коррекции. |
5 |
0 |
- |
Зарезервирован. |
6 |
ZF |
Zero Flag |
Флаг нуля. Устанавливается 1, если результат предыдущей команды равен 0. |
7 |
SF |
Sign Flag |
Флаг знака. Этот флаг всегда равен старшему биту результата. |
8 |
TF |
Trap Flag |
Флаг трассировки (или флаг ловушки). Он был предусмотрен для работы отладчиков в пошаговом выполнении, которые не используют защищённый режим. Если этот флаг установить в 1, то после выполнения каждой программной команды управление временно передаётся отладчику (вызывается прерывание 1). |
9 |
IF |
Interrupt Enable Flag |
Флаг разрешения прерываний. Если сбросить этот флаг в 0, то процессор перестанет обрабатывать прерывания от внешних устройств. Обычно его сбрасывают на короткое время для выполнения критических участков программы. |
10 |
DF |
Direction Flag |
Флаг направления. Контролирует поведение команд обработки строк. Если установлен в 1, то строки обрабатываются в сторону уменьшения адресов, если сброшен в 0, то наоборот. |
11 |
OF |
Overflow Flag |
Флаг переполнения. Устанавливается в 1, если результат предыдущей арифметической операции над числами со знаком выходит за допустимые для них пределы. Например, если при сложении двух положительных чисел получается число со старшим битом, равным единице, то есть отрицательное. И наоборот. |
12 13 |
IOPL |
I/O Privilege Level |
Уровень приоритета ввода/вывода. |
14 |
NT |
Nested Task |
Флаг вложенности задач. |
15 |
0 |
- |
Зарезервирован. |
Значения некоторых флагов можно изменять напрямую с помощью специальных команд.
Однако нет инструкций, которые бы позволяли обращаться к регистру флагов как к
обычному регистру по имени. Некоторые флаги устанавливаются автоматически и предназначены
только для чтения.
Сейчас вам будет понятно далеко не всё из того, что описано в таблице 2.4. Например,
вы пока не знаете, что такое прерывания. Но всему своё время. Пока просто запомните
страницу с описанием регистра флагов и возвращайтесь к ней по мере необходимости.
Системные флаги IOPL предназначены для управления операционной средой в защищённом режиме.
Они не используются в прикладных программах.