Plan 9 from Bell Labs’s /sys/src/pub/doc/intel/386/d.htm

Copyright © 2021 Plan 9 Foundation
Distributed under the MIT License.
Download the Plan 9 distribution.


<html>
<head>
<title>
17.3.D  'D' Instructions 
</title>
<body>
<pre>
<a name="17-03-D"></a>
Prev: <a href="chp17-c3.htm">17.3.C  'C' Instructions </a>
Next: <a href="chp17-e3.htm">17.3.E  'E' Instructions </a>
<hr>
<h2>
17.3.D  'D' Instructions 
</h2>

<a name="17-03-DAA"></a>
<h3>DAA -- Decimal Adjust AL after Addition</h3>

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;

<b>Description</b>

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.

<b>Flags Affected</b>

AF and CF as described above; SF, ZF, PF, and CF as described in
Appendix C.

<b>Protected Mode Exceptions</b>

None

<b>Real Address Mode Exceptions</b>

None

<b>Virtual 8086 Mode Exceptions</b>

None


<a name="17-03-DAS"></a>
<h3>DAS -- Decimal Adjust AL after Subtraction</h3>

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;

<b>Description</b>

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.

<b>Flags Affected</b>

AF and CF as described above; SF, ZF, and PF as described in Appendix C.

<b>Protected Mode Exceptions</b>

None

<b>Real Address Mode Exceptions</b>

None

<b>Virtual 8086 Mode Exceptions</b>

None


<a name="17-03-DEC"></a>
<h3>DEC -- Decrement by 1</h3>

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;

<b>Description</b>

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.

<b>Flags Affected</b>

OF, SF, ZF, AF, and PF as described in Appendix C.

<b>Protected Mode Exceptions</b>

#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

<b>Real Address Mode Exceptions</b>

Interrupt 13 if any part of the operand would lie outside of the effective
address space from 0 to 0FFFFH

<b>Virtual 8086 Mode Exceptions</b>

Same exceptions as in Real Address Mode; #PF(fault-code) for a page
fault


<a name="17-03-DIV"></a>
<h3>DIV -- Unsigned Divide</h3>

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."
��������������������������������������

<b>Description</b>

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

<b>Flags Affected</b>

OF, SF, ZF, AR, PF, CF are undefined.

<b>Protected Mode Exceptions</b>

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

<b>Real Address Mode Exceptions</b>

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

<b>Virtual 8086 Mode Exceptions</b>

Same exceptions as in Real Address Mode; #PF(fault-code) for a page
fault


<hr>
Prev: <a href="chp17-c3.htm">17.3.C  'C' Instructions </a>
Next: <a href="chp17-e3.htm">17.3.E  'E' Instructions </a>
</pre>
</body>
</html>

Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to webmaster@plan9.bell-labs.com.