Описание регистра RFLAGS

Верхние 32 бита регистра RFLAGS зарезервированы, а нижние соответствуют 32-битному регистру EFLAGS. Поэтому я буду рассматривать только биты регистра EFLAGS.

Регистр EFLAGS содержит группу статусных флагов, контрольный флаг и группу системных флагов. На рисунке указаны флаги данного регистра. После инициализации процессора (при задействовании пина RESET или пина INIT), значение регистра EFLAGS устанавливается в значение 00000002h. Биты 1, 3, 5, 15 и с 22 по 31 данного регистра зарезервированы. ПО не должно их использовать или зависеть от состояния этих битов.

Некоторые из флагов регистра EFLAGS могут быть изменены непосредственно, при помощи специальных инструкций. Не существует инструкций, которые могли бы просмотреть или изменить сразу все флаги регистра.

Следующие инструкции могут быть использованы для перемещения группы флагов в или из процедурного стека или регистра EAX: lahf, sahf, pushf, pushfd, popf и popfd. После перемещения содержимого регистра EFLAGS в процедурный стек или регистр EAX, флаги могут быть просмотрены или изменены используя инструкции манипуляции битами процессора (bt, bts, btr и btc).


Статусные флаги

Статусные флаги (биты 0, 2, 4, 6, 7 и 11) регистра EFLAGS отображают результаты арифметических инструкций, таких как add, sub, mul и div.

Флаг CF, Carry Flag (бит 0) устанавливается, если (для беззнаковых чисел) произошёл перенос из старшего разряда, либо произошёл заём из несуществующего разряда. По смыслу этот флаг является аналогом OF в применении к беззнаковым числам (результат не поместился в размер операнда, либо получился отрицательным). Для знаковых чисел этот флаг смысла не имеет.

Флаг PF, Parity Flag (бит 2) устанавливается в единицу, если у значения чётное количество выставленных единиц, иначе ноль.

Флаг AF, Auxiliary Carry Flag (бит 4) Set if an arithmetic operation generates a carry or a borrow out of bit 3 of the result; cleared otherwise. This flag is used in binary-coded decimal (BCD) arithmetic.

Флаг ZF, Zero Flag (бит 6) устанавливается в единицу, если в результате последней операции получился ноль, в противном случае флаг сбрасывается; ясно, что значение этого флага осмысленно как для знаковых, так и для беззнаковых чисел.

Флаг SF, Sign Flag (бит 7) устанавливается в единицу, если получено отрицательное число, иначе он сбрасывается в ноль. Процессор производит установку этого флага, попросту копируя в него старший бит результата; для знаковых чисел этот бит действительно означет знак числа, но для беззнаковых значение флага SF не имеет никакого смысла.

Флаг OF, Overflow Flag (бит 11) устанавливается, есл произошло переполнение, что означает, что в результате сложения двух положительных получилось отрицательное, либо, наоборот, в результате сложения двух отрицательных получилось положительное. Этот флаг не имеет никакого смысла для беззнаковых чисел.


Контрольный флаг

Флаг DF, Direction Flag (бит 10) управляет строковыми инструкциями (movs, cmps, scas, lods и stos). Установка флага означает для строковых инструкций авто-декремент (обрабатывать строки от верхнего адреса к нижнему). Очистка флага означает для строковых инструкций авто-инкремент (обрабатывать строки от нижнего адреса к верхнему).

Инструкции std и cld соответственно устанавливают и очищают флаг DF.


Системные флаги и поле IOPL

Системные флаги и поле IOPL контролируются работой ОС. Они не должны изменяться прикладными программами.

Флаг TF, Trap Flag (бит 8) Set to enable single-step mode for debugging; clear to disable single-step mode.

Флаг IF, Interrupt enable flag (бит 9) Controls the response of the processor to maskable interrupt requests. Set to respond to maskable interrupts; cleared to inhibit maskable interrupts.

Поле IOPL, I/O privilege level field (биты 12 и 13) Indicates the I/O privilege level of the currently running program or task. The current privilege level (CPL) of the currently running program or task must be less than or equal to the I/O privilege level to access the I/O address space. The POPF and IRET instructions can modify this field only when operating at a CPL of 0.

Флаг NT, Nested task flag (бит 14) Controls the chaining of interrupted and called tasks. Set when the current task is linked to the previously executed task; cleared when the current task is not linked to another task.

Флаг RF, Resume Flag (бит 16) Controls the processor’s response to debug exceptions.

Флаг VM, Virtual-8086 mode flag (бит 17) Set to enable virtual-8086 mode; clear to return to protected mode without virtual-8086 mode semantics.

Флаг AC, Alignment check (or access control) flag (бит 18) If the AM bit is set in the CR0 register, align- ment checking of user-mode data accesses is enabled if and only if this flag is 1.

Флаг VIF, Virtual interrupt flag (бит 19) Virtual image of the IF flag. Used in conjunction with the VIP flag. (To use this flag and the VIP flag the virtual mode extensions are enabled by setting the VME flag in control register CR4.)

Флаг VIP, Virtual interrupt pending flag (бит 20) Set to indicate that an interrupt is pending; clear when no interrupt is pending. (Software sets and clears this flag; the processor only reads it.) Used in conjunction with the VIF flag.

Флаг ID, Identification flag (бит 21) The ability of a program to set or clear this flag indicates support for the CPUID instruction.