Регістр EFLAGS

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Тридцятидвохрозрядний регістр EFLAGS містить групу прапорів статусу, контролю, і групу системних прапорів. Початкове значення регістра — 00000002h. Біти 1, 3, 5, 15, і всі з 22 до 31 зарезервовані для майбутнього використання. Робота програм не має залежати від тих біт.

Деякі з прапорів EFLAGS можна редагувати напряму, використовуюючи спеціальні інструкції. Немає інструкції яка б дозволяла відстежити, чи редагувати стан всього регістра прямо. Тим не менш, такі інструкції дають змогу переміщувати групи прапорів, в стек, і з нього, чи в регістр EAX: LAHF, SAHF, PUSHF, POPF, POPFD. Після того, як вміст EFLAGS переміщений в стек, чи EAX, прапори можуть бути відстежені, і змінені за допомогою інструкцій маніпулювання бітами (BT, BTS, BTR, BTC).

При призупиненні задачі (з допомогою засобів багатозадачності), процесор автоматично зберігає стан регістру EFLAGS в сегменті стану задачі (TSS). При переході до нової задачі, процесор завантажує регістр EFLAGS, з даними з TSS нової задачі.

При виконанні викликів переривань, чи процедур виключень, процесор автоматично зберігає стан регістру EFLAGS, в процедурний стек. Коли переривання, чи виключення обробляється переключенням на іншу задачу, прапори зберігаються в TSS.

При переході до 32 розрядної архітектури, були додані деякі прапори, але функції і розміщення старих не змінено. Як результат — зворотна сумісність з регістром архітектури x86 — FLAGS.

Прапори статусу[ред.ред. код]

Прапори статусу (біти 0, 2, 4, 6, 7, і 11) — індикатори результату роботи арифметичних інструкцій, таких як ADD, SUB, MUL, DIV. Функції прапорів статусу:

  • CF (Carry Flag) Прапор переносу (біт 0) — піднімається, якщо арифметична операція генерує перенос, чи виходить за межі значущих бітів результату. Показує переповнення при операціях з беззнаковими цілими.
  • PF (Parity Flag) Прапор парності (біт 2) — піднімається, якщо найменш значущий байт результату містить парне число одиничок. Інакше опускається.
  • AF (Adjust Flag) Прапор підстройки (біт 4) — піднімається, якщо арифметична операція спричинює перенос, чи виходить за межі на три біти. Цей прапор використовується в арифметиці з двійково-десятковим представленням (BCD).
  • ZF (Zero Flag) Прапор нуля (біт 6) — піднімається, якщо результат нуль.
  • SF (Sign Flag) Прапор знаку (біт 7) — встановлюється рівним найбільш значущому біту результату, який є бітом знаку в знакових цілих. 0 — вказує на додатнє значення, 1 — від'ємне.
  • OF (Owerflow Flag) Прапор переповнення(біт 11) — піднімається, якщо ціле число завелике додатнє, чи замаленьке від'ємне (виключаючи біт знаку), щоб влізти в операнд призначення, в протилежному випадку опускається. Прапор сигналізує про стан переповнення, в знакововій цілій арифметиці.

Умовні інструкції Jcc (cc — condition code), SETcc, LOOPcc, і CMOVcc використовують ідентифікатори прапорів статусу, як коди умов. Наприклад команда умовного переносу, яка виконує перенос якщо результат попередньої операції від'ємний:

CMOVSF eax,ebx;

Прапор DF[ред.ред. код]

DF (Direction Flag) — прапор напрямку. Знаходиться в біті 10. Контролює рядкові інструкції: (MOVS, CMPS, SCAS, LODS, і STOS). Якщо прапор піднято, то рядкові інструкції виконують авто-декремент (рядки обробляються від більших адрес до менших). Якщо він опущений, то відбувається авто-інкремент.

Інструкція STD піднімає цей прапор, а CLD — опускає.

Системні прапори і поле IOPL[ред.ред. код]

Системні прапори регістру EFLAGS контролюють операційну систему, і пристрої. Вони не мають змінюватись прикладною програмою. Функції системних прапорів:

  • IF (Interrupt enable flag) дозвіл переривання (біт 9)
  • TF (Trap flag) пастка (біт 8) Піднімається щоб дозволити покроковий режим зневадження. Інакше цей режим відключений.
  • IOPL (I/O priviledge level field) рівень пріорітету вводу-виводу. (біти 12 і 13). Чим менше рівень, тим більше повноважень має задача. Цей рівень можна модифікувати інструкціями POPF і IRET, викликаними на нульовому рівні.
  • NT (Nested task) вкладена задача (біт 14). Контролює зв'язок перерваної і викликаної задачі.
  • RF (Resume flag) продовження (біт 16). Контролює реакцію процесора на виключення зневадження.
  • VM (Virtual mode) віртуальний режим (біт 17) Піднімається щоб запустити режим віртуального 8086. Щоб повернутись в захищений режим, його опускають.
  • AC (Alignment check) перевірка вирівнювання (біт 18) Щоб ввімкнути перевірку вирівнювання підніміть цей прапор, і біт AM регістру CR0. Щоб вимкнути це, опустіть один з бітів.
  • VIF (Virtual interrupt flag) (біт 19)
  • VIP (Virtual interrupt pending) (біт 20)
  • ID (Identification) (біт 21). Здатність програми змітити цей прапор означає підтримку інструкцій CPUID.

Література[ред.ред. код]