Smart ASM Програми Реєстр EFLAGS

32-розрядний регістр EFLAGS містить деякі прапори стану та управління процесором, а також деякі системні прапори (див. рисунок). Після ініціалізації процесора регістр прапорів містить значення 00000002h, його біти 1, 3, 5, 15 і 22..31 зарезервовані і програми не повинні їх використовувати. Деякі прапори регістру EFLAGS можна змінювати безпосередньо за допомогою спеціальних команд (вони описані нижче). Для завантаження значень прапорів у регістр EFLAGS та зчитувань із нього призначені команди LAHF, SAHF, PUSHF, PUSHFD, POPF та POPFD. Значення будь-якого прапора завжди можна перевірити, для цього потрібно зберегти вміст регістру EFLAGS у стек, потім витягнути його в регістр загального призначення та перевірити командами TEST та BT. Змінити значення прапорів можна шляхом завантаження його через стек із регістра загального призначення, але деякі прапори таким чином не можна змінити (наприклад, двобітове поле IOPL у захищеному режимі). Регістр EFLAGS автоматично зберігається процесором у стек при далеких дзвінках і відновлюється з нього при дальніх поверненнях; при перемиканні завдань процесор зберігає вміст EFLAGS у TSS старої задачі та завантажує значення з TSS нової.

До появи 32-розрядного процесора Intel386, регістр прапорів був 16-розрядним і називався FLAGS. Починаючи з процесора Intel386, регістр прапорів – 32-розрядний і називається EFLAGS (Extended FLAGS – розширений FLAGS); при цьому регістр FLAGS є молодшою ​​половиною регістру EFLAGS, всі прапори, які використовують процесори 8086 і Intel286 знаходяться якраз у молодшій половині EFLAGS (тобто FLAGS), тому можна розглядати регістр прапорів як єдиний і називати його EFLAGS. Говорячи про прапори використовують два термінипрапор встановлений- це означає, що біт, який відповідає цьому прапору, прийнявзначення 1;прапор скинутий- значення 0. Прапори зустрічаються не тільки в регістрі EFLAGS, в 32-розрядному процесорі є багато регістрів, що повністю або частково складаються з прапорів - регістри управління, налагодження, тестування, MSR і т.д., тому терміни " скидання " і " встановлення " прапора використовуються скрізь, де йдеться про зміну прапорів.

Формат регістру прапорів EFLAGS

Прапори стану відображають результати цілих арифметичних операцій (ADD, SUB, MUL та ін.), цими прапорами є біти 0, 2, 4, 6, 7 і 11 регістра EFLAGS.

З цих прапорів тільки CF можна міняти безпосередньо (командами STC, CLC та CMC). Також цей прапор використовують команди BT, BTS, BTR, BTC, зберігаючи в нього результат. Прапори стану використовуються командами цілочисленної арифметики трьох типів - знакової, беззнакової та BCD. При переповненні індикатором є:

Команди умовного розгалуження Jcc, SETcc, LOOPcc та CMOVcc використовують один або кілька прапорів стану, перевіряючи різні умови.

Системні прапори та поле IOPL

Ці прапори призначені для використання на системному рівні і мається на увазі, що прикладні програми не повинні змінювати значення (а в захищеному режимі - не можуть).