| Opcode | Encoding | 16-bit | 32-bit | 64-bit | Description |
|---|---|---|---|---|---|
2FDAS | zo | Valid | Valid | Invalid | Decimal adjust AL after subtraction. |
Encoding
| Encoding | Operand |
|---|---|
zo | None |
Description
The DAS instruction converts the result of a subtraction 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 AAS (ASCII Adjust AL After Subtraction) instruction handles that case.
This instruction is not valid in Long Mode.
Operation
public void DAS()
{
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, 0x35 ; 35 (decimal) in packed BCD
sub al, 0x79 ; AL == 0xBC
das ; AL == 0x56 with carry set (giving -0x44)Flags Affected
CF(carry flag)- Set if an adjustment results in a decimal borrow into either digit. Cleared otherwise.
PF(parity flag)- Set according to the result.
AF(auxiliary flag)- Set if an adjustment results in a decimal borrow into 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.