Введение

Регистр состояния архитектуры x86 Регистр FLAGS - это регистр состояния, который содержит текущее состояние процессора x86. Размер и значение битов флага зависят от архитектуры. Обычно он отражает результат арифметических операций, а также информацию о ограничениях, наложенных на работу процессора в текущее время. Некоторые из этих ограничений могут включать предотвращение запуска некоторых прерываний, запрещение выполнения класса "привилегированных" инструкций. Дополнительные флаги состояния могут обходить отображение памяти и определять, какие действия должен предпринять процессор при арифметическом переполнении. Флаги carry, parity, auxiliary carry (или half carry), zero и sign включены во многие архитектуры (многие современные (RISC) архитектуры не имеют флагов, таких как carry, и даже если они используют флаги, то half carry встречается редко, так как BCD математика больше не распространена, и она даже имеет ограниченную поддержку длинного режима на x86 64). В архитектуре i286 регистр имеет ширину 16 бит. Его преемники, регистры EFLAGS и RFLAGS (в современном x86 64), имеют 32 бит и 64 бит шириной соответственно. Более широкие реестры сохраняют совместимость со своими меньшими предшественниками.

ФЛАГЫ

Intel x86 FLAGS register Bit # Mask Abbreviation Description Category =1 =0 FLAGS 0 0x0001 CF Carry flag Status CY (Carry) NC (No Carry) 1 0x0002 Reserved, always 1 in EFLAGS 2 0x0004 PF Parity flag Status PE (Parity Even) PO (Parity Odd) 3 0x0008 Reserved Status AC (Auxiliary Carry) NA (No Auxiliary Carry) 5 0x0020 ReservedРезервирован на всех процессорах Intel. Всегда 1 на 8086/186, 0 на 286 и более поздние. Контроль (только NEC) Нативный режим (совместимый с NEC) (только NEC) Режим эмуляции (совместимый с 8080) EFLAGS 16 0x0001 0000 RF Флаг резюме (только с 86+) Система 17 0x0002 0000 VM Флаг виртуального режима 8086 (только с 386+) Система 18 0x0004 0000 Проверка выравнивания переменного тока (486+, кольцо 3), Проверка доступа SMAP (Broadwell+, кольцо 0 2) Система 19 0x0008 0000 VIF Флаг виртуального прерывания (Pentium+) Система 20 0x0010 0000 VIP Виртуальный прерывание в ожидании (Pentium+) Система 21 0x0020 0000 ID Способность использовать инструкцию CPUID (Pentium+) Система 22 0x293 0000FC0 Зарезервировано 30 0x4000 0000 (нет ключей AES) Флаг загруженный с VIALock Pad (только с VIA Pad) Система 318 0000 0000 0000 Альтернативный режим ВИИИИИИИИ) Система 19 0x0008 000000 Флаг VIF Включен в системе CLAGS (зарезер) Зарегистрированный в столбе Флаг впись значение в колонги и ФФФ (см.

Использование

Все регистры FLAGS содержат коды состояния, биты флага, которые позволяют результатам одной инструкции машинного языка влиять на другую инструкцию. Арифметические и логические инструкции устанавливают некоторые или все флаги, а инструкции условного прыжка принимают переменные действия на основе значения определенных флагов. Например, jz (Jump if Zero), jc (Jump if Carry) и jo (Jump if Overflow) зависят от конкретных флагов. Другие условно-пробные прыжки - это комбинации нескольких флагов. Регистры FLAGS могут быть перемещены из стека или в стек. Это часть работы по сохранению и восстановлению контекста процессора, в отличие от рутины, такой как рутина прерывания службы, изменения которой в регистрах не должны быть видны вызывающим кодом. Вот соответствующие инструкции: инструкции PUSHF и POPF передают 16-битовый регистр FLAGS. PUSHFD/POPFD (внедренный с архитектурой i386) передает 32-битный двойной регистр EFLAGS. PUSHFQ/POPFQ (внедренный с архитектурой x86 64) передает 64-битовый четырёхсловочный регистр RFLAGS. В 64-битном режиме доступны PUSHF/POPF и PUSHFQ/POPFQ, но не PUSHFD/POPFD. Нижние 8 битов в регистре FLAGS также открыты для прямой манипуляции нагрузкой/хранилищем SAHF и LAHF (нагрузка/хранилище AH в флаги).