Регістр EFLAGS
Регістр EFLAGS - це тридцятидвохрозрядний регістр стану, що містить групу позначок (англ. flags[1]) статусу, контролю, і групу системних позначок (бітів). Початкове значення регістра — 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 (Overflow Flag) Позначка переповнення(біт 11) — піднімається, якщо ціле число завелике додатне, чи замаленьке від'ємне (виключаючи біт знаку), щоб влізти в операнд призначення, в протилежному випадку опускається. Прапор сигналізує про стан переповнення, в знакововій цілій арифметиці.
Умовні інструкції Jcc (cc — condition code), SETcc, LOOPcc, і CMOVcc використовують ідентифікатори позначок статусу, як коди умов. Наприклад команда умовного переносу, яка виконує перенос якщо результат попередньої операції від'ємний:
CMOVSF eax,ebx;
DF (Direction Flag) — позначка напрямку. Знаходиться в біті 10. Контролює рядкові інструкції: (MOVS, CMPS, SCAS, LODS, і STOS). Якщо позначка піднята, то рядкові інструкції виконують автодекремент (рядки обробляються від більших адрес до менших). Якщо вона опущена, то відбувається автоінкремент.
Інструкція STD піднімає цю позначку, а CLD — опускає.
Системні позначки регістра 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.
- ↑ flag // Англійсько-український словник з математики та інформатики / уклад. Є. Мейнарович, М. Кратко. — 2010.