Регистр FLAGS - это регистр состояния в Intel x86 микропроцессоры, которые содержат текущее состояние процессора. Этот регистр имеет ширину 16 бит. Его преемники, регистры EFLAGS и RFLAGS, имеют ширину 32 бита и 64 бита соответственно. Более широкие регистры сохраняют совместимость со своими меньшими предшественниками.
Фиксированные биты в битовых позициях 1, 3 и 5, а также флаги переноса, четности, настройки, нуля и знака унаследованы от еще более ранней архитектуры, 8080 и 8085. Флаг настройки раньше назывался вспомогательным битом переноса в 8080 и битом половинного переноса в архитектуре Zilog Z80.
Регистр Intel x86 FLAGS | ||||||
---|---|---|---|---|---|---|
Бит № | Маска | Аббревиатура | Описание | Категория | =1 | = 0 |
ФЛАГИ | ||||||
0 | 0x0001 | CF | Флаг переноса | Статус | CY (перенос) | NC (без переноса) |
1 | 0x0002 | Зарезервировано, всегда 1 в EFLAGS | ||||
2 | 0x0004 | PF | Флаг четности | Состояние | PE (четность) | PO (четность нечетная) |
3 | 0x0008 | Зарезервировано | ||||
4 | 0x0010 | AF | Флаг настройки | Статус | AC (вспомогательный перенос) | NA (без вспомогательного переноса) |
5 | 0x0020 | Зарезервировано | ||||
6 | 0x0040 | ZF | Флаг нуля | Состояние | ZR (ноль) | NZ (Not Zero) |
7 | 0x0080 | SF | Sign flag | Status | NG (Negative) | PL (Positive) |
8 | 0x0100 | TF | Флаг прерывания ( пошагово) | Управление | ||
9 | 0x0200 | IF | Флаг разрешения прерывания | Управление | EI (Разрешить прерывание) | DI (Запретить прерывание) |
10 | 0x0400 | DF | Флаг направления | Управление | DN (вниз) | UP (вверх) |
11 | 0x080 0 | OF | Флаг переполнения | Статус | OV (переполнение) | NV (не переполнение) |
12-13 | 0x3000 | IOPL | уровень привилегий ввода-вывода (только 286+),. всегда 1 на 8086 и 186 | System | ||
14 | 0x4000 | NT | Флаг вложенной задачи (только 286+),. всегда 1 на 8086 и 186 | Система | ||
15 | 0x8000 | Зарезервировано,. всегда 1 на 8086 и 186,. всегда 0 на более поздних моделях | ||||
EFLAGS | ||||||
16 | 0x0001 0000 | RF | (только 386+) | Система | ||
17 | 0x0002 0000 | VM | Флаг виртуального режима 8086 (только 386+) | Система | ||
18 | 0x0004 0000 | AC | Проверка согласования (только 486SX +) | Система | ||
19 | 0x0008 0000 | VIF | Флаг виртуального прерывания (Pentium +) | Система | ||
20 | 0x0010 0000 | VIP | Ожидание виртуального прерывания (Pentium +) | System | ||
21 | 0x0020 0000 | ID | Возможность использования инструкции CPUID (Pentium +) | System | ||
22‑31 | 0xFFC0 0000 | Зарезервировано | Система | |||
RFLAGS | ||||||
32‑63 | 0xFFFF FFFF…. … 0000 0000 | Зарезервировано |
Примечание: столбец маски в таблице есть битовая маска AND (как шестнадцатеричное значение) для запроса флага (ов) в значении регистра FLAGS.
Все регистры FLAGS содержат коды условий, биты флагов, которые позволяют результатам одной инструкции машинного языка влиять на другую инструкцию. Арифметические и логические инструкции устанавливают некоторые или все флаги, а инструкции условного перехода выполняют переменные действия в зависимости от значений определенных флагов. Например, jz
(переход, если ноль), jc
(переход при переносе) и jo
(переход при переполнении) зависят от конкретных флагов. Другие условные переходы проверяют комбинации нескольких флагов.
Регистры FLAGS можно перемещать из стека или в стек. Это часть работы по сохранению и восстановлению контекста процессора для подпрограммы, такой как подпрограмма обслуживания прерывания, изменения регистров которой не должны быть замечены вызывающим кодом. Вот соответствующие инструкции:
В 64-битном режиме PUSHF / POPF и PUSHFQ / POPFQ доступны, но PUSHFD / POPFD - нет.
Младшие 8 бит регистра FLAGS также открыты для прямого управления загрузкой / сохранением с помощью SAHF и LAHF (загрузка / сохранение AH во флаги).
Возможность вставлять и извлекать регистры FLAGS позволяет программе манипулировать информацией во FLAGS способами, для которых не существует инструкций на машинном языке. Например, инструкции cld
и std
очищают и устанавливают флаг направления (DF) соответственно; но инструкции по дополнению DF нет. Это может быть достигнуто с помощью следующего кода сборки :
pushf; Используйте стек, чтобы передать топор ФЛАГОВ;... в регистр AX нажимаем ax; и скопируйте их обратно в стек для хранения xor ax, 400h; Переключить (дополнить) только DF; остальные биты неизменны push ax; Снова используйте стек, чтобы переместить измененное значение popf;... в регистр ФЛАГОВ; Вставьте сюда код, который требовал дополнения флага DF popf; Восстановить исходное значение FLAGS
. Управляя регистром FLAGS, программа может определить модель установленного процессора. Например, флаг выравнивания можно изменить только на 486 и выше. Если программа пытается изменить этот флаг и обнаруживает, что изменение не сохраняется, это означает, что процессор более ранний, чем 486.
Начиная с Intel Pentium, CPUID Инструкция сообщает модель процессора. Однако описанный выше метод остается полезным для различения более ранних моделей.