Введение
Регистр состояния архитектуры 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 бит шириной соответственно. Более широкие реестры сохраняют совместимость со своими меньшими предшественниками.
The FLAGS register is the status register that contains the current state of an x86 CPU. The size and meanings of the flag bits are architecture dependent. It usually reflects the result of arithmetic operations as well as information about restrictions placed on the CPU operation at the current time. Some of those restrictions may include preventing some interrupts from triggering, prohibition of execution of a class of "privileged" instructions. Additional status flags may bypass memory mapping and define what action the CPU should take on arithmetic overflow. The carry, parity, auxiliary carry (or half carry), zero and sign flags are included in many architectures (many modern (RISC) architectures do not have flags, such as carry, and even if they do use flags, then half carry is rare, since BCD math no longer common, and it even has limited support on long mode on x86 64). In the i286 architecture, the register is 16 bits wide. Its successors, the EFLAGS and RFLAGS registers (in modern x86 64), are 32 bits and 64 bits wide, respectively. The wider registers retain compatibility with their smaller predecessors.
ФЛАГЫ
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 (зарезер) Зарегистрированный в столбе Флаг впись значение в колонги и ФФФ (см.
Note: The mask column in the table is the AND bitmask (as hexadecimal value) to query the flag(s) within FLAGS register value.
Использование
Все регистры 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 в флаги).
The PUSHF and POPF instructions transfer the 16 bit FLAGS register. PUSHFD/POPFD (introduced with the i386 architecture) transfer the 32 bit double register EFLAGS. PUSHFQ/POPFQ (introduced with the x86 64 architecture) transfer the 64 bit quadword register RFLAGS. In 64 bit mode, PUSHF/POPF and PUSHFQ/POPFQ are available but PUSHFD/POPFD are not. The lower 8 bits of the FLAGS register is also open to direct load/store manipulation by SAHF and LAHF (load/store AH into flags).