Внутрішні регістри регістр прапорів
Регістр прапорів EFLAGS відображає поточний стан процесора, багато хто з його бітів встановлюються після виконання операцій і индицируют тип, отриманого результату. Формат регістра прапорів наведено на рис. 1.3.
Прапор перенесення фіксує значення перенесення (позики), що виникає при додаванні (відніманні). Іноді використовується і в інших ситуаціях.
Прапор парності фіксує наявність парного числа одиниць в молодшому байті результату операції, може бути використаний, наприклад, для контролю правильності передачі даних.
AF (Прапор допоміжного переносу, біт 4)
Прапор допоміжного переносу фіксує перенесення (позика) з молодшої тетради, тобто з біта 3 в старшу тетраду при додаванні (відніманні). Використовується тільки для двійковій-десяткового арифметики, яка оперує виключно молодшими байтами.
Прапор нуля сигналізує про отримання нульового (ZF = 1) або ненульового (ZF = 0) результату операції.
Прапор знака дублює значення старшого біта результату, який при використанні додаткового коду відповідає знаку числа (0 - позитивне число, 1 - негативне).
При установці прапора трассіровкіTF = 1, мікропроцесор переходить в покроковий режим роботи. застосовуваний при налагодженні програм, коли автоматично генерується особлива ситуація налагодження (#DB) після виконання кожної команди. Переривання налагодження почне генеруватися, якщо прикладна програма встановить прапор TF за допомогою команд POPF / POPFD або IRET / IRETD.
IF (Прапор дозволу переривань, біт 9)
При установці прапора дозволу прериванійIF = 1, мікропроцесор сприймає (розпізнає) і відповідно реагує на запит переривання по входу INTR # (зовнішні маскіруемие переривання). При IF = 0, переривання з цього входу забороняються і мікропроцесор ігнорує запити, що надходять переривань.
Зміна цього прапора командами CLI. STI. POPF / POPFD і IRET / IRETD можливо не завжди і визначається поточними:
Коли ж віртуальні переривання ініціалізовані (CR4.PVI = 1 в захищеному режимі або CR4.VME = 1 в режимі V86) при виконанні того ж умови IOPL Прапор переповнення сигналізує про втрату старшого біта результату в зв'язку з переповненням розрядної сітки при роботі зі знаковими числами. При додаванні цей прапор встановлюється в 1, якщо відбувається перенесення в старший біт і немає перенесення з старшого біта, або є перенесення з старшого біта, але відсутня перенесення в нього; в іншому випадку, прапор OF встановлюється в 0. При відніманні він встановлюється в 1, коли виникає позику з старшого біта, але позику в старший біт відсутня, або є позику в старший біт, але відсутній позику з нього. IOPL (Рівень привілеїв введення / виведення, біти 13 і 12: Intel286 ...) У захищеному режимі команда POPF / POPFD є одночасно залежною і від рівня привілеїв введення / виводаIOPL. і від поточного рівня привілеїв (CPL), дозволяючи змінювати поле IOPL тільки при виконанні на нульовому рівні привілеїв (CPL = 0), а прапор дозволу переривань IF - тільки за умови CPL ≤ IOPL. Однак, якщо ця команда не може змінити вказане поле або прапор через недостатність поточних привілеїв. то генерації особливої ситуації загального захисту (#GP) не відбувається - триває виконання наступних команд. Це поведінка змінюється в режимі V86 - тут спроба використання команди POPF / POPFD при IOPL <3 (кроме режима EV86 ) всегда вызывает генерацию особой ситуации общей защиты (#GP) . У процесорах, починаючи з Pentium, є спеціальний режим EV86 (включається установкою прапора CR4.VME = 1 в режимі V86), в якому виникає додаткова специфіка для IOPL-чутливих команд. По-перше, команда IRET в цьому режимі взагалі перестає бути IOPL-чутливої і не генерує особливу ситуацію загального захисту (#GP) при IOPL <3. Команды CLI. STI при IOPL <3, вместо генерации указанной особой ситуации. оказывают влияние на флаг виртуального прерывания VIF (также как и команда POPF ), а для команды INT n вообще возникает несколько режимов. которые зависят от текущего контекста конкретной задачи V86. И наконец, команда PUSHF (16-битная), выполняемая в режиме EV86 при IOPL <3, также не генериует особую ситуацию общей защиты (#GP). а записывает в стек образ регистра флаговFLAGS. у которого биты, соответствующие полю IOPL. устанавливаются равными 3, а бит IF записывается из текущего значения флага VIF . NT (Вкладена завдання, біт 14: Intel286 ...) Процесор встановлює і перевіряє прапор вкладеної завдання для контролю за перерваними завданнями (завдання, під час виконання яких мало місце переривання) і при виклику процедур. Прапор NT впливає на дії, вироблені командою IRET / IRETD. Цей прапор може бути змінений командою POPF / POPFD і IRET / IRETD. Некоректні зміни цього прапора можуть привести до виникнення різних особливих ситуацій в прикладних програмах. RF (Прапор відновлення, біт 16: Intel386 ...) Прапор возобновленіяRF тимчасово вимикає обробку особливих ситуацій налагодження (DB #) для того, щоб команда, яка викликала таку ситуацію, могла бути перезапущено і не стала б причиною нової особливої ситуації. Отладчик встановлює цей прапор командою IRETD при поверненні в перервану програму. Команди POPF. POPFD (в режимі V86) і IRET на цей прапор не впливають. VM (Віртуальний режим, біт 17: Intel386 ...) AC (Режим контролю вирівнювання, біт 18: Intel486 ...) Таблиця 3.5. Умови контролю вирівнювання VIF (Віртуальне переривання, біт 19: Pentium ...) Прапор віртуального прериваніяVIF використовується спільно з прапором VIP і дозволяє забезпечити нормальне виконання старого ПО, що використовує команди управління зовнішніми маскованими переривань (вектори від 32 до 255), в сучасній мультипроцессорной і мультизадачной програмно-апаратної середовищі. Для цього в процесорах, починаючи з Pentium, підтримуються спеціальні розширені режими обробки переривань: У цих режимах прапор віртуального переривання VIF виступає віртуальним подобою прапора IF. За умови, що віртуальні переривання ініціалізовані (CR4.PVI = 1 в захищеному режимі. CR4.VME = 1 в режимі V86), команди CLI і STI впливають на прапор EFLAGS.VIF. а прапор IF при цьому залишається незмінним. При надходженні зовнішнього замаскованого переривання процесор виробляє стандартне звернення до обробника переривань захищеного режиму через таблицю дескрипторів переривань (IDT). При цьому, під час запису в стек значення регістра EFLAGS процесор записує поле IOPL рівним 3 і прапор IF рівним VIF. VIP (Очікування віртуального переривання, біт 20: Pentium ...) Прапор очікування віртуального прериваніяVIP використовується спільно з прапором VIF і дозволяє прикладним програмам в режимі підтримки віртуальних переривань відстежувати зовнішні виклики переривань навіть тоді, коли програма замаскує їх виконання (індикація відкладених віртуальних переривань). За додатковою інформацією щодо використання цих прапорів зверніться до опису переривань і особливих ситуацій. ID (Прапор ідентифікації, біт 21: Pentium ...) Прапор ідентіфікацііID призначений для перевірки - чи підтримується процесором команда CPUID. Якщо в програмі можна встановити і скинути цей прапор, значить команда CPUID даним процесором підтримується.