Instruction Operand Encoding

Op/En

Operand 0

Operand 1

Operand 2

Operand 3

A

NA

NA

ModRM:reg (r)

ModRM:r/m (r, w)

Description

Exchanges the first operand (destination operand) with the second operand (source operand), then loads the sum of the two values into the destination operand. The destination operand can be a register or a memory location; the source operand is a register.

In 64-bit mode, the instruction's default operation size is 32 bits. Using a REX prefix in the form of REX.R permits access to additional registers (R8-R15). Using a REX prefix in the form of REX.W promotes operation to 64 bits. See the summary chart at the beginning of this section for encoding data and limits.

This instruction can be used with a LOCK prefix to allow the instruction to be executed atomically.

Pseudo Code

TEMP = SRC + DEST;
SRC = DEST;
DEST = TEMP;

Flags Affected

The CF, PF, AF, SF, ZF, and OF flags are set according to the result of the addition, which is stored in the destination operand.

Exceptions

64-Bit Mode Exceptions

Exception

Description

#UD

If the LOCK prefix is used but the destination is not a memory operand.

#AC(0)

If alignment checking is enabled and an unaligned memory reference is made while the current privilege level is 3.

#PF(fault-code)

If a page fault occurs.

#GP(0)

If the memory address is in a non-canonical form.

#SS(0)

If a memory address referencing the SS segment is in a non-canonical form.

Compatibility Mode Exceptions

Same exceptions as in protected mode.

Virtual-8086 Mode Exceptions

Exception

Description

#UD

If the LOCK prefix is used but the destination is not a memory operand.

#AC(0)

If alignment checking is enabled and an unaligned memory reference is made.

#PF(fault-code)

If a page fault occurs.

#SS(0)

If a memory operand effective address is outside the SS segment limit.

Protected Mode Exceptions

If the LOCK prefix is used but the destination is not a memory operand.

#AC(0)

If alignment checking is enabled and an unaligned memory reference is made while the current privilege level is 3.

#PF(fault-code)

If a page fault occurs.

#SS(0)

If a memory operand effective address is outside the SS segment limit.

#GP(0)

If the destination is located in a non-writable segment. If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit. If the DS, ES, FS, or GS register contains a NULL segment selector.