Регистр FLAGS

редактировать

Регистр FLAGS - это регистр состояния в Intel x86 микропроцессоры, которые содержат текущее состояние процессора. Этот регистр имеет ширину 16 бит. Его преемники, регистры EFLAGS и RFLAGS, имеют ширину 32 бита и 64 бита соответственно. Более широкие регистры сохраняют совместимость со своими меньшими предшественниками.

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

Содержание

  • 1 ФЛАГИ
  • 2 Использование
    • 2.1 Пример
  • 3 См. Также
  • 4 Ссылки

ФЛАГИ

Регистр Intel x86 FLAGS
Бит №МаскаАббревиатураОписаниеКатегория=1= 0
ФЛАГИ
00x0001CFФлаг переноса СтатусCY (перенос)NC (без переноса)
10x0002Зарезервировано, всегда 1 в EFLAGS
20x0004PFФлаг четности СостояниеPE (четность)PO (четность нечетная)
30x0008Зарезервировано
40x0010AFФлаг настройки СтатусAC (вспомогательный перенос)NA (без вспомогательного переноса)
50x0020Зарезервировано
60x0040ZFФлаг нуля СостояниеZR (ноль)NZ (Not Zero)
70x0080SFSign flag StatusNG (Negative)PL (Positive)
80x0100TFФлаг прерывания ( пошагово)Управление
90x0200IFФлаг разрешения прерывания УправлениеEI (Разрешить прерывание)DI (Запретить прерывание)
100x0400DFФлаг направления УправлениеDN (вниз)UP (вверх)
110x080 0OFФлаг переполнения СтатусOV (переполнение)NV (не переполнение)
12-130x3000IOPLуровень привилегий ввода-вывода (только 286+),. всегда 1 на 8086 и 186System
140x4000NTФлаг вложенной задачи (только 286+),. всегда 1 на 8086 и 186Система
150x8000Зарезервировано,. всегда 1 на 8086 и 186,. всегда 0 на более поздних моделях
EFLAGS
160x0001 0000RF(только 386+)Система
170x0002 0000VMФлаг виртуального режима 8086 (только 386+)Система
180x0004 0000ACПроверка согласования (только 486SX +)Система
190x0008 0000VIFФлаг виртуального прерывания (Pentium +)Система
200x0010 0000VIPОжидание виртуального прерывания (Pentium +)System
210x0020 0000IDВозможность использования инструкции CPUID (Pentium +)System
22‑310xFFC0 0000ЗарезервированоСистема
RFLAGS
32‑630xFFFF 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 - нет.

Младшие 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 Инструкция сообщает модель процессора. Однако описанный выше метод остается полезным для различения более ранних моделей.

См. Также

Ссылки

  1. ^Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32 (PDF). 1 . Май 2012 г., стр. 3–21.
  2. ^Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32 (PDF). 1 . Декабрь 2016. с. 78.
  3. ^ «Кремниевый обратный инжиниринг: недокументированные флаги 8085». www.righto.com. Проверено 21 октября 2018 г.
  4. ^Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32 (PDF). 2B . Май 2012 г.
Последняя правка сделана 2021-05-20 07:56:24
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте