| Opcode | Encoding | 16-bit | 32-bit | 64-bit | Description |
|---|---|---|---|---|---|
27DAA | zo | Valid | Valid | Invalid | Decimal adjust AL after addition. |
Encoding
| Encoding | Operand |
|---|---|
zo | None |
Description
The DAA instruction converts the result of an addition of two (packed) BCD digits to a valid 2-digit BCD number.
An "packed" BCD number is one where each byte contains two digits – one in each nibble. In contrast, an unpacked BCD number is one where each byte contains a single digit. The AAA (ASCII Adjust AL After Addition) instruction handles that case.
This instruction is not valid in Long Mode.
Operation
public void DAA()
{
byte oldAL = AL;
bool oldCF = EFLAGS.CF; // CF could be set in the ones place adjustment
// adjust ones place
if ((AL & 0xF) > 9 || EFLAGS.AF)
AL += 6;
// adjust tens place
if (oldAL > 0x99 || oldCF)
AL += 0x60;
}Example
mov al, 0x79 ; 79 (decimal) in packed BCD
add al, 0x35 ; AL == 0xAE
daa ; AL == 0x14 with carry set (giving 0x114)Flags Affected
CF(carry flag)- Set if an adjustment results in a decimal carry in either digit. Cleared otherwise.
PF(parity flag)- Set according to the result.
AF(auxiliary flag)- Set if an adjustment results in a decimal carry in either digit. Cleared otherwise.
ZF(zero flag)- Set according to the result.
SF(sign flag)- Set according to the result.
OF(overflow flag)- Undefined.
Exceptions
Real-Address Mode
#UD- If the
LOCK- prefix is used.
Virtual-8086 Mode
#UD- If the
LOCK- prefix is used.
Protected Mode
#UD- If the
LOCK- prefix is used.
Compatibility Mode
#UD- If the
LOCK- prefix is used.
Long Mode
#UD- If in Long Mode.