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

Регистр состояния архитектуры x86

Регистр FLAGS — это регистр состояния , содержащий текущее состояние процессора x86 . Размер и значения битов флага зависят от архитектуры. Обычно он отражает результат арифметических операций, а также информацию об ограничениях, наложенных на работу процессора в текущий момент. Некоторые из этих ограничений могут включать предотвращение срабатывания некоторых прерываний, запрет на выполнение класса «привилегированных» инструкций. Дополнительные флаги состояния могут обходить отображение памяти и определять, какое действие процессор должен предпринять при арифметическом переполнении.

Флаги переноса, четности, вспомогательного переноса (или полупереноса ), нуля и знака включены во многие архитектуры (многие современные (RISC) архитектуры не имеют флагов, таких как перенос, и даже если они используют флаги, то полуперенос встречается редко, поскольку математика BCD больше не распространена, и даже имеет ограниченную поддержку в длинном режиме на x86-64 ).

В архитектуре i286 регистр имеет ширину 16 бит . Его последователи, регистры EFLAGS и RFLAGS (в современной x86-64 ), имеют ширину 32 и 64 бита соответственно. Более широкие регистры сохраняют совместимость со своими меньшими предшественниками.

ФЛАГИ

Регистр флагов Intel x86 [1]
Кусочек #МаскаАббревиатураОписаниеКатегория=1=0
ФЛАГИ
00x0001CFНести флагСтатусCY (переноска)NC (без переноски)
10x0002Зарезервировано, всегда 1 в EFLAGS [2] [3]
20x0004ПФФлаг паритетаСтатусPE (четность)PO (Четность нечетная)
30x0008Зарезервировано [3]
40x0010АФВспомогательный флаг для переноски [4]СтатусAC (вспомогательное снаряжение)NA (без вспомогательного переноса)
50x0020Зарезервировано [3]
60x0040ЗФНулевой флагСтатусZR (Ноль)NZ (не ноль)
70x0080СФФлаг знакаСтатусНГ (отрицательно)ПЛ (положительный)
80x0100ТФФлаг-ловушка (один шаг)Контроль
90x0200ЕСЛИФлаг разрешения прерыванияКонтрольEI (Включить прерывание)DI (Отключить прерывание)
100x0400ДФФлаг направленияКонтрольDN (вниз)ВВЕРХ (вверх)
110x0800ИЗФлаг переполненияСтатусOV (Переполнение)NV (не переполнение)
12–130x3000ИОПЛУровень привилегий ввода-вывода (только 286+),
всегда все единицы на 8086 и 186
Система
140x4000НТФлаг вложенной задачи (только 286+),
всегда 1 на 8086 и 186
Система
150x8000МДФлаг режима ( только для серии NEC V ), [5]
зарезервирован на всех процессорах Intel.
Всегда 1 на 8086/186, 0 ​​на 286 и более поздних.
Контроль(только NEC)
Основной режим
( совместим с 186 )
(только NEC)
Режим эмуляции
( совместим с 8080 )
ЭФЛАГИ
160x0001 0000РФФлаг возобновления (только 386+)Система
170x0002 0000ВМФлаг режима виртуального 8086 (только 386+)Система
180x0004 0000АСПроверка выравнивания (486+, кольцо 3), проверка доступа
SMAP ( Broadwell +, кольцо 0-2)
Система
190x0008 0000ВИФФлаг виртуального прерывания (Pentium+)Система
200x0010 0000ВИПОжидается виртуальное прерывание (Pentium+)Система
210x0020 0000ИДЕНТИФИКАТОРВозможность использования инструкции CPUID (Pentium+)Система
22–290x3FC0 0000Сдержанный
300x4000 0000(никто)Флаг загруженного расписания ключа AES [6]
(только для процессоров с VIA PadLock )
Система
310x8000 0000ИИАльтернативный набор инструкций включен
( только для процессоров VIA C5XL ) [7]
Система
РФЛАГС
32‑630xFFFF FFFF…
…0000 0000
Сдержанный

Примечание: Столбец маски в таблице представляет собой битовую маску AND (в шестнадцатеричном формате) для запроса флага(ов) в значении регистра FLAGS.

Использование

Все регистры FLAGS содержат коды условий , биты флагов, которые позволяют результатам одной инструкции машинного языка влиять на другую инструкцию. Арифметические и логические инструкции устанавливают некоторые или все флаги, а инструкции условных переходов выполняют переменные действия на основе значения определенных флагов. Например, jz(Jump if Zero), jc(Jump if Carry) и jo(Jump if Overflow) зависят от определенных флагов. Другие условные переходы проверяют комбинации нескольких флагов.

Регистры FLAGS можно перемещать из стека или в стек. Это часть работы по сохранению и восстановлению контекста ЦП, против такой процедуры, как процедура обслуживания прерываний, чьи изменения в регистрах не должны быть видны вызывающему коду. Вот соответствующие инструкции:

  • Инструкции PUSHF и POPF передают 16-битный регистр FLAGS.
  • PUSHFD/POPFD (введены в архитектуре i386 ) передают 32-битный двойной регистр EFLAGS.
  • PUSHFQ/POPFQ (введены в архитектуре x86-64 ) передают 64-битный учетверенный регистр RFLAGS.

В 64-битном режиме доступны PUSHF/POPF и PUSHFQ/POPFQ, но не PUSHFD/POPFD. [8] : 4–349, 4–432 

Нижние 8 бит регистра FLAGS также открыты для прямой загрузки/сохранения с помощью SAHF и LAHF (загрузка/сохранение AH во флаги).

Пример

Возможность вставлять и выталкивать регистры FLAGS позволяет программе манипулировать информацией во FLAGS способами, для которых не существует инструкций машинного языка. Например, инструкции cldи stdочищают и устанавливают флаг направления (DF) соответственно; но нет инструкции для дополнения DF. Этого можно добиться с помощью следующего ассемблерного кода :

 ; Это код 8086 с 16-битными регистрами, помещенными в стек, ; а регистр флагов в этом процессоре занимает всего 16 бит. pushf ; Используем стек для передачи FLAGS pop ax ; … в регистр AX push ax ; и копируем их обратно в стек для хранения xor ax , 400h ; Переключаем (инвертируем, «дополняем») только DF; остальные биты не изменяются push ax ; Снова используем стек для перемещения измененного значения popf ; … в регистр FLAGS ; Вставляем сюда код, требующий дополнения флага 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. ^ abc "Обратная разработка кремния: недокументированные флаги 8085". www.righto.com . Получено 21.10.2018 .
  4. Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32, том 1. Декабрь 2022 г. С.  3–16 .
  5. ^ NEC, Руководство пользователя 16-битной серии V, документ № U11301E, сентябрь 2000 г., стр. 186
  6. VIA, PadLock Programming Guide, v1.66, 4 августа 2005 г., стр. 7–8. Архивировано из оригинала 26 мая 2010 г.
  7. ^ VIA, Примечание к применению альтернативного набора инструкций процессора VIA C3, версия 0.24, 2002 г. — см. рисунок 2 на стр. 12 и главу 4 на стр. 21 для получения подробной информации о флаге EFLAGS.AI.
  8. ^ Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32 (PDF) . Том 2B. Май 2012 г.
Получено с "https://en.wikipedia.org/w/index.php?title=FLAGS_register&oldid=1213148123"