Регістр прапорів, osdev wiki, fandom powered by wikia
Історія Правити
Регістр прапорів був уже в першому 16-розрядному мікропроцесорі Intel - 8086. Він носив ім'я FLAGS і мав довжину 16 біт. Поява мікропроцесора 80286 додало в регістр FLAGS біт NT і бітове поле IOPL, проте сам регістр залишався 16-розрядних.
З виходом мікропроцесора 80386 регістр було розширено до 32 біт і став називатися EFLAGS. У ньому з'явилися ще два додаткових біти: VM і RF. У наступних поколіннях 32-розрядних мікропроцесорів були додані біти AC, VIF, VIP і ID. Проте, зберігалася повна сумісність «знизу вгору»: будь-яка стара програма, яка коректно працювала з регістром EFLAGS, що не модифікуючи «невідомі» їй біти, залишалася працездатною і на наступних процесорах.
Розширення розрядності процесора до 64 біт, спочатку вироблене компанією AMD (технологія AMD64) і пізніше скопійоване Intel (EM64T), подвоїло і розмір регістра прапорів, що отримав назву RFLAGS. Однак його старша половина (біти з 32-го по 63-й включно) поки не використовується і є зарезервованої, тому формат «значущою» частини RFLAGS повністю збігається з форматом EFLAGS.
Призначення розрядів Правити
Формат регістра EFLAGS виглядає наступним чином:
Зауважимо, що всі невикористовувані біти дорівнюють нулю. Винятком є біт 1, який завжди має одиничне значення.
Далі описується призначення кожного біта, що входить до складу регістра прапорів.
Прапори стану Правити
Ці прапори відображають результат, отриманий в попередньому арифметико-логічного операції. Багато з них можуть використовуватися в подальшому для виконання умовних переходів або умовних пересилань.
Прапори цієї групи можуть змінюватися будь-якими програмами за допомогою команд, приносять в регістр прапорів нове значення (SAHF. POPF / POPFD / POPFQ).
Прапор переносу (біт 0). Насправді він має різне призначення залежно від виконуваної інструкції. В арифметичних операціях над цілими числами цей прапор, будучи встановленим, показує наявність перенесення або позику (це можна розглядати як «беззнаковое переповнення»), а будучи сброшеннм - відсутність перенесення або позику. Крім того, цей прапор застосовується в деяких інших інструкціях і тим або іншим чином характеризує отриманий результат. Детально використання цього прапора в кожній конкретній інструкції вказується в її описі
Прапор парності (біт 2). Встановлюється, якщо молодший байт результату містить парне число одиничних бітів, в іншому випадку скидається
Прапор допоміжного переносу (біт 4). Встановлюється при виникненні переносу або позику з 4-го раззряда в 3-ий розряд. Скидається при відсутності такого. Використовується командами десяткового корекції.
Прапор нуля (біт 6). Встановлюється при отриманні нульового результату, скидається в іншому випадку.
Прапор знака (біт 7). Встановлюється, якщо в результаті операції отримано від'ємне число, тобто якщо старший розряд результату дорівнює одиниці. В іншому випадку скидається
Прапор переповнення (біт 11). Встановлюється, якщо в результаті арифметичної операції зафіксовано знакова переповнення, тобто якщо результат, що розглядається як число зі знаком, що не поміщається в операнд-приймач. Якщо знакового переповнення немає, цей прапор скидається
Прапор напрямки Правити
Цей прапор може змінюватися будь-якими програмами за допомогою спеціальних інструкцій CLD і STD. а також завантаженням нового вмісту регістра прапорів.
Системні прапори Правити
Ці прапори можуть змінюватися тільки системним програмним забезпеченням, що працює при нульовому (найвищому) поточному рівні привілеїв (CPL). Винятком є прапор IF, стан якого в певних умовах може змінюватися менш привілейованим кодом. Завантаження регістрів прапорів програмами, що виконуються нема на нульовому рівні привілеїв, не змінює значення системних прапорів.
Прапор пастки (біт 8). Коли встановлено, викликає переривання #DB (вектор 1) після виконання кожної команди процесора за винятком тієї, яка здійснила установку цього прапора
Прапор дозволу переривання (біт 9). Коли встановлено, процесор обробляє маскіруемие переривання, запити на які надходять від контролера переривань або поліпшеного контролера переривань. Коли скинутий, масковані переривання процесором ігноруються (знаходяться в очікуванні обробки). Можливістю установки і скидання прапора IF програмами, що виконуються нема на нульовому рівні привілеїв. керують поле IOPL регістра прапорів і біт VE керуючого регістра CR3 (Може біт VME регістра CR4?)
Поле рівня привілеїв введення / виведення (біти 12 і 13). Містить рівень привілеїв введення-виведення для виконуваної в даний момент програми. Якщо поточний рівень привілеїв (CPL) програми чисельно менше або дорівнює значенню, що знаходиться в полі IOPL, програма може використовувати інструкції введення-виведення, а також змінювати стан прапора IF. Поле IOPL доповнюється картою дозволу введення-виведення в TSS. а також бітом VME в регістрі CR4
Вкладена завдання (біт 14). Цей прапор встановлюється процесором автоматично при перемиканні на нове завдання. Перемикання на завдання відбувається при використанні її в якості обробника переривання через шлюз завдання в IDT або при її виклику командою CALL, зверненої до TSS або шлюзу завдання. знаходяться в GDT або LDT
Прапор поновлення (біт 16). Управляє реакцією процесора на точки зупинки. Коли встановлено, забороняє генерацію налагоджувальних переривань (#DB). Основною функцією прапора RF є забезпечення повторного виконання інструкції після виникнення отладочного переривання, викликаного точкою зупинки. Для цього відладчик перед поверненням до перерваної програми повинен встановити цей біт в регістрі прапорів перерваної програми, збереженому в стеці, що забезпечить нормальне виконання інструкції, до якої відбудеться повернення з відладчика. Після її виконання процесор автоматично скине прапор RF, що забезпечить нормальне функціонування встановлених точок зупину
Режим віртуального процесора 8086 (біт 17). Коли цей прапор встановлений, процесор працює в режимі віртуального процесора 8086
Перевірка вирівнювання (біт 18). Коли одночасно встановлені цей прапор і біт AC керуючого регістра CR0. а програма виконується на третьому рівні привілеїв. активізується перевірка вирівнювання операндів, розташованих в пам'яті. При спробі доступу до невирівняні операнду виникає виняток #AC (вектор 17)
Віртуальний прапор дозволу переривання (біт 19). Цей прапор використовується спільно з прапором VIP, якщо в регістрі CR4 встановлений біт VME, що дозволяє використання розширень режиму віртуального процесора 8086
Що очікує віртуальне переривання (біт 20). Цей прапор використовується спільно з прапором VIF, якщо в регістрі CR4 встановлений біт VME, що дозволяє використання розширень режиму віртуального процесора 8086
Ідентифікація (біт 21). Можливість програмно встановлювати і скидати цей прапор є ознакою того, що процесор підтримує інструкцію CPUID