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