User Guide

General-Purpose Programming 35
24592—Rev. 3.15—November 2009 AMD64 Technology
The sections below describe each application-visible flag. All of these flags are readable and writable.
For example, the POPF, POPFD, POPFQ, IRET, IRETD, and IRETQ instructions write all flags. The
carry and direction flags are writable by dedicated application instructions. Other application-visible
flags are written indirectly by specific instructions. Reserved bits and bits whose writability is
prevented by the current values of system flags, current privilege level (CPL), or the current operating
mode, are unaffected by the POPFx instructions.
Carry Flag (CF). Bit 0. Hardware sets the carry flag to 1 if the last integer addition or subtraction
operation resulted in a carry (for addition) or a borrow (for subtraction) out of the most-significant bit
position of the result. Otherwise, hardware clears the flag to 0.
The increment and decrement instructions—unlike the addition and subtraction instructions—do not
affect the carry flag. The bit shift and bit rotate instructions shift bits of operands into the carry flag.
Logical instructions like AND, OR, XOR clear the carry flag. Bit-test instructions (BTx) set the value
of the carry flag depending on the value of the tested bit of the operand.
Software can set or clear the carry flag with the STC and CLC instructions, respectively. Software can
complement the flag with the CMC instruction.
Parity Flag (PF). Bit 2. Hardware sets the parity flag to 1 if there is an even number of 1 bits in the
least-significant byte of the last result of certain operations. Otherwise (i.e., for an odd number of 1
bits), hardware clears the flag to 0. Software can read the flag to implement parity checking.
Auxiliary Carry Flag (AF). Bit 4. Hardware sets the auxiliary carry flag if an arithmetic operation or
a binary-coded decimal (BCD) operation generates a carry (in the case of an addition) or a borrow (in
the case of a subtraction) out of bit 3 of the result. Otherwise, AF is cleared to zero.
The main application of this flag is to support decimal arithmetic operations. Most commonly, this flag
is used internally by correction commands for decimal addition (AAA) and subtraction (AAS).
Zero Flag (ZF). Bit 6. Hardware sets the zero flag to 1 if the last arithmetic operation resulted in a
value of zero. Otherwise (for a non-zero result), hardware clears the flag to 0. The compare and test
instructions also affect the zero flag.
The zero flag is typically used to test whether the result of an arithmetic or logical operation is zero, or
to test whether two operands are equal.
Sign Flag (SF). Bit 7. Hardware sets the sign flag to 1 if the last arithmetic operation resulted in a
negative value. Otherwise (for a positive-valued result), hardware clears the flag to 0. Thus, in such
operations, the value of the sign flag is set equal to the value of the most-significant bit of the result.
Depending on the size of operands, the most-significant bit is bit 7 (for bytes), bit 15 (for words), bit 31
(for doublewords), or bit 63 (for quadwords).
Direction Flag (DF). Bit 10. The direction flag determines the order in which strings are processed.
Software can set the direction flag to 1 to specify decrementing the data pointer for the next string
instruction (LODSx, STOSx, MOVSx, SCASx, CMPSx, OUTSx, or INSx). Clearing the direction flag