WikiDer > Регистр ФЛАГОВ
В ФЛАГИ регистр это регистр статуса в Intel x86 микропроцессоры который содержит текущее состояние процессора. Этот регистр 16 бит широкий. Его преемники, EFLAGS и РФЛАГС регистры, являются 32 бит и 64 бит широкий соответственно. Более широкие регистры сохраняют совместимость со своими меньшими предшественниками.
Фиксированные биты в битовых позициях 1, 3 и 5, а также флаги переноса, четности, настройки, нуля и знака унаследованы от еще более ранней архитектуры, 8080 и 8085. Флаг настройки раньше назывался вспомогательным битом переноса в 8080 и битом половинного переноса в Зилог 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 битовая маска (в качестве шестнадцатеричный value) для запроса флага (ов) в значении регистра FLAGS.
использование
Все регистры FLAGS содержат коды состояния, флаговые биты, позволяющие результату одного машинный язык инструкция влияет на другую инструкцию. Арифметические и логические инструкции устанавливают некоторые или все флаги, а инструкции условного перехода выполняют переменные действия в зависимости от значений определенных флагов. Например, jz
(Перейти, если ноль), jc
(Прыгайте, если несете), и Джо
(Перейти при переполнении) зависит от конкретных флагов. Другие условные переходы проверяют комбинации нескольких флагов.
Регистры FLAGS можно перемещать из стека или в стек. Это часть работы по сохранению и восстановлению контекста процессора для подпрограммы, такой как подпрограмма обслуживания прерывания, изменения регистров которой не должны быть замечены вызывающим кодом. Вот соответствующие инструкции:
- Команды PUSHF и POPF передают 16-битный регистр FLAGS.
- ПУШФД / ПОПФД (введено с 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
и стандартное
инструкции очищают и устанавливают флаг направления (DF) соответственно; но инструкции по дополнению DF нет. Этого можно достичь с помощью следующих код сборки:
pushf ; Используйте стек для передачи ФЛАГОВпоп топор ; ... в регистр AXтолкать топор ; и скопируйте их обратно в стек для храненияxor топор, 400 ч ; Переключить (дополнить) только DF; другие биты неизменнытолкать топор ; Снова используйте стек, чтобы переместить измененное значениепопф ; ... в регистр ФЛАГОВ; Вставьте сюда код, который требовал дополнения флага DFпопф ; Восстановить исходное значение ФЛАГОВ
Управляя регистром 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.
- ^ а б c «Кремниевый обратный инжиниринг: недокументированные флаги 8085». www.righto.com. Получено 2018-10-21.
- ^ Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32 (PDF). 2B. Май 2012 г.