17.3.D 'D' Instructions Prev: 17.3.C 'C' Instructions Next: 17.3.E 'E' Instructions 17.3.D 'D' Instructions DAA -- Decimal Adjust AL after Addition Opcode Instruction Clocks Description 27 DAA 4 Decimal adjust AL after addition Operation IF ((AL AND 0FH) > 9) OR (AF = 1) THEN AL <- AL + 6; AF <- 1; ELSE AF <- 0; FI; IF (AL > 9FH) OR (CF = 1) THEN AL <- AL + 60H; CF <- 1; ELSE CF <- 0; FI; Description Execute DAA only after executing an ADD instruction that leaves a two-BCD-digit byte result in the AL register. The ADD operands should consist of two packed BCD digits. The DAA instruction adjusts AL to contain the correct two-digit packed decimal result. Flags Affected AF and CF as described above; SF, ZF, PF, and CF as described in Appendix C. Protected Mode Exceptions None Real Address Mode Exceptions None Virtual 8086 Mode Exceptions None DAS -- Decimal Adjust AL after Subtraction Opcode Instruction Clocks Description 2F DAS 4 Decimal adjust AL after subtraction Operation IF (AL AND 0FH) > 9 OR AF = 1 THEN AL <- AL - 6; AF <- 1; ELSE AF <- 0; FI; IF (AL > 9FH) OR (CF = 1) THEN AL <- AL - 60H; CF <- 1; ELSE CF <- 0; FI; Description Execute DAS only after a subtraction instruction that leaves a two-BCD-digit byte result in the AL register. The operands should consist of two packed BCD digits. DAS adjusts AL to contain the correct packed two-digit decimal result. Flags Affected AF and CF as described above; SF, ZF, and PF as described in Appendix C. Protected Mode Exceptions None Real Address Mode Exceptions None Virtual 8086 Mode Exceptions None DEC -- Decrement by 1 Opcode Instruction Clocks Description FE /1 DEC r/m8 2/6 Decrement r/m byte by 1 FF /1 DEC r/m16 2/6 Decrement r/m word by 1 DEC r/m32 2/6 Decrement r/m dword by 1 48+rw DEC r16 2 Decrement word register by 1 48+rw DEC r32 2 Decrement dword register by 1 Operation DEST <- DEST - 1; Description DEC subtracts 1 from the operand. DEC does not change the carry flag. To affect the carry flag, use the SUB instruction with an immediate operand of 1. Flags Affected OF, SF, ZF, AF, and PF as described in Appendix C. Protected Mode Exceptions #GP(0) if the result is a nonwritable segment; #GP(0) for an illegal memory operand effective address in the CS, DS, ES, FS, or GS segments; #SS(0) for an illegal address in the SS segment; #PF(fault-code) for a page fault Real Address Mode Exceptions Interrupt 13 if any part of the operand would lie outside of the effective address space from 0 to 0FFFFH Virtual 8086 Mode Exceptions Same exceptions as in Real Address Mode; #PF(fault-code) for a page fault DIV -- Unsigned Divide Opcode Instruction Clocks Description F6 /6 DIV AL,r/m8 14/17 Unsigned divide AX by r/m byte (AL=Quo, AH=Rem) F7 /6 DIV AX,r/m16 22/25 Unsigned divide DX:AX by r/m word (AX=Quo, DX=Rem) F7 /6 DIV EAX,r/m32 38/41 Unsigned divide EDX:EAX by r/m dword (EAX=Quo, EDX=Rem) Operation temp <- dividend / divisor; IF temp does not fit in quotient THEN Interrupt 0; ELSE quotient <- temp; remainder <- dividend MOD (r/m); FI; €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ Note: Divisions are unsigned. The divisor is given by the r/m operand. The dividend, quotient, and remainder use implicit registers. Refer to the table under "Description." €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ Description DIV performs an unsigned division. The dividend is implicit; only the divisor is given as an operand. The remainder is always less than the divisor. The type of the divisor determines which registers to use as follows: Size Dividend Divisor Quotient Remainder byte AX r/m8 AL AH word DX:AX r/m16 AX DX dword EDX:EAX r/m32 EAX EDX Flags Affected OF, SF, ZF, AR, PF, CF are undefined. Protected Mode Exceptions Interrupt 0 if the quotient is too large to fit in the designated register (AL, AX, or EAX), or if the divisor is 0; #GP(0) for an illegal memory operand effective address in the CS, DS, ES, FS, or GS segments; #SS(0) for an illegal address in the SS segment; #PF(fault-code) for a page fault Real Address Mode Exceptions Interrupt 0 if the quotient is too big to fit in the designated register (AL, AX, or EAX), or if the divisor is 0; Interrupt 13 if any part of the operand would lie outside of the effective address space from 0 to 0FFFFH Virtual 8086 Mode Exceptions Same exceptions as in Real Address Mode; #PF(fault-code) for a page fault Prev: 17.3.C 'C' Instructions Next: 17.3.E 'E' Instructions