Регістр 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.
