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

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.

Примітки

  1. flag // Англійсько-український словник з математики та інформатики / уклад. Є. Мейнарович, М. Кратко. — 2010.

Література

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.