Регистр ФЛАГОВ - FLAGS register

В ФЛАГИ регистр это регистр статуса в Intel x86 микропроцессоры который содержит текущее состояние процессора. Этот регистр 16 бит широкий. Его преемники, EFLAGS и РФЛАГС регистры, являются 32 бит и 64 бит широкий соответственно. Более широкие регистры сохраняют совместимость со своими меньшими предшественниками.

Фиксированные биты в битовых позициях 1, 3 и 5, а также флаги переноса, четности, настройки, нуля и знака унаследованы от еще более ранней архитектуры, 8080 и 8085. Флаг настройки раньше назывался вспомогательным битом переноса в 8080 и битом половинного переноса в Зилог Z80 архитектура.

ФЛАГИ

Регистр Intel x86 FLAGS[1]
Кусочек #МаскаСокращениеОписаниеКатегория=1=0
ФЛАГИ
00x0001CFПеренести флагПоложение делCY (перенос)NC (без переноса)
10x0002Зарезервировано, всегда 1 дюйм EFLAGS [2][3] 
20x0004ПФФлаг четностиПоложение делPE (четность)PO (четность нечетная)
30x0008Зарезервированный[3] 
40x0010AFОтрегулировать флагПоложение делAC (вспомогательная переноска)NA (нет дополнительных носителей)
50x0020Зарезервированный[3] 
60x0040ZFНулевой флагПоложение делZR (ноль)NZ (не ноль)
70x0080SFПодписать флагПоложение делNG (отрицательный)PL (положительный)
80x0100TFФлаг ловушки (один шаг)Контроль
90x0200ЕСЛИФлаг разрешения прерыванияКонтрольEI (разрешить прерывание)DI (Отключить прерывание)
100x0400DFФлаг направленияКонтрольDN (вниз)Вверх вверх)
110x0800ИЗФлаг переполненияПоложение делOV (переполнение)NV (без переполнения)
12-130x3000IOPLУровень привилегий ввода-вывода (Только 286+),
всегда 1[требуется разъяснение ] на 8086 и 186
Система
140x4000NTФлаг вложенной задачи (только 286+),
всегда 1 на 8086 и 186
Система
150x8000Зарезервированный,
всегда 1 на 8086 и 186,
всегда 0 на более поздних моделях
 
EFLAGS
160x0001 0000РФФлаг резюме (Только 386+)Система
170x0002 0000ВМВиртуальный режим 8086 флаг (только 386+)Система
180x0004 0000ACПроверка центровки (только 486SX +)Система
190x0008 0000VIFФлаг виртуального прерывания (Pentium +)Система
200x0010 0000VIPОжидание виртуального прерывания (Pentium +)Система
210x0020 0000Я БЫВозможность использовать инструкцию CPUID (Pentium +)Система
22‑310xFFC0 0000ЗарезервированныйСистема
РФЛАГС
32‑630xFFFF 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 инструкция сообщает модель процессора. Однако описанный выше метод остается полезным для различения более ранних моделей.

Смотрите также

Рекомендации

  1. ^ Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32 (PDF). 1. Май 2012. С. 3–21.
  2. ^ Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32 (PDF). 1. Декабрь 2016. с. 78.
  3. ^ а б c «Кремниевый обратный инжиниринг: недокументированные флаги 8085». www.righto.com. Получено 2018-10-21.
  4. ^ Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32 (PDF). 2B. Май 2012 г.