cmpxchg486
Compare and exchange, 486 opcode
Performs the cmpxchg compare-and-exchange under a non-standard opcode that some 486 processors accepted.
486 and latertakes lockremoved from the architectureNot available in 64-bit mode
- ● set from the result
- – not changed
Forms
Operands
r/m- A general-purpose register or memory location matching the operation’s size, for example
raxorqword [rbp-8]. The byte registersah,bh,chanddhcannot be used with a REX prefix, including when the memory address usesr8–r15. reg- A general-purpose register matching the operation’s size, for example
al,ax,eaxorrax. The byte registersah,bh,chanddhcannot be used with a REX prefix, which is required byspl,bpl,sil,dilandr8–r15.
CMPXCHG compares its destination (first) operand to the value in
AL, AX or EAX (depending on the operand size of the
instruction). If they are equal, it copies its source (second)
operand into the destination and sets the zero flag. Otherwise, it
clears the zero flag and copies the destination register to AL, AX or EAX.
The destination can be either a register or a memory location. The source is a register.
CMPXCHG is intended to be used for atomic operations in
multitasking or multiprocessor environments. To safely update a
value in shared memory, for example, you might load the value into
EAX, load the updated value into EBX, and then execute the
instruction LOCK CMPXCHG [value],EBX. If value has not
changed since being loaded, it is updated with your desired new
value, and the zero flag is set to let you know it has worked. (The
LOCK prefix prevents another processor doing anything in the
middle of this operation: it guarantees atomicity.) However, if
another processor has modified the value in between your load and
your attempted store, the store does not happen, and you are
notified of the failure by a cleared zero flag, so you can go round
and try again.