User Guide
General-Purpose Programming 51
24592—Rev. 3.15—November 2009 AMD64 Technology
The MUL instruction performs multiplication of unsigned integer operands. The size of operands can
be byte, word, doubleword, or quadword. The product is stored in a destination which is double the
size of the source operands (multiplicand and factor).
The MUL instruction's mnemonic has only one operand, which is a factor. The multiplicand operand is
always assumed to be an accumulator register. For byte-sized multiplies, AL contains the multiplicand,
and the result is stored in AX. For word-sized, doubleword-sized, and quadword-sized multiplies, rAX
contains the multiplicand, and the result is stored in rDX and rAX.
The IMUL instruction performs multiplication of signed integer operands. There are forms of the
IMUL instruction with one, two, and three operands, and it is thus more powerful than the MUL
instruction. The one-operand form of the IMUL instruction behaves similarly to the MUL instruction,
except that the operands and product are signed integer values. In the two-operand form of IMUL, the
multiplicand and product use the same register (the first operand), and the factor is specified in the
second operand. In the three-operand form of IMUL, the product is stored in the first operand, the
multiplicand is specified in the second operand, and the factor is specified in the third operand.
The DIV instruction performs division of unsigned integers. The instruction divides a double-sized
dividend in AH:AL or rDX:rAX by the divisor specified in the operand of the instruction. It stores the
quotient in AL or rAX and the remainder in AH or rDX.
The IDIV instruction performs division of signed integers. It behaves similarly to DIV, with the
exception that the operands are treated as signed integer values.
Division is the slowest of all integer arithmetic operations and should be avoided wherever possible.
One possibility for improving performance is to replace division with multiplication, such as by
replacing i/j/k with i/(j*k). This replacement is possible if no overflow occurs during the computation
of the product. This can be determined by considering the possible ranges of the divisors.
Increment and Decrement
• DEC—Decrement by 1
• INC—Increment by 1
The INC and DEC instructions are used to increment and decrement, respectively, an integer operand
by one. For both instructions, an operand can be a byte, word, doubleword, or quadword register or
memory location.
These instructions behave in all respects like the corresponding ADD and SUB instructions, with the
second operand as an immediate value equal to 1. The only exception is that the carry flag (CF) is not
affected by the INC and DEC instructions.
Apart from their obvious arithmetic uses, the INC and DEC instructions are often used to modify
addresses of operands. In this case it can be desirable to preserve the value of the carry flag (to use it
later), so these instructions do not modify the carry flag.