The Netwide Assembler: NASM

Previous Chapter | Contents | Index

Appendix B: Intel x86 Instruction Reference

This appendix provides a complete list of the machine instructions which NASM will assemble, and a short description of the function of each one.

It is not intended to be exhaustive documentation on the fine details of the instructions' function, such as which exceptions they can trigger: for such documentation, you should go to Intel's Web site, http://www.intel.com/.

Instead, this appendix is intended primarily to provide documentation on the way the instructions may be used within NASM. For example, looking up LOOP will tell you that NASM allows CX or ECX to be specified as an optional second argument to the LOOP instruction, to enforce which of the two possible counter registers should be used if the default is not the one desired.

The instructions are not quite listed in alphabetical order, since groups of instructions with similar functions are lumped together in the same entry. Most of them don't move very far from their alphabetic position because of this.

B.1 Key to Operand Specifications

The instruction descriptions in this appendix specify their operands using the following notation:

B.2 Key to Opcode Descriptions

This appendix also provides the opcodes which NASM will generate for each form of each instruction. The opcodes are listed in the following way:

B.2.1 Register Values

Where an instruction requires a register value, it is already implicit in the encoding of the rest of the instruction what type of register is intended: an 8-bit general-purpose register, a segment register, a debug register, an MMX register, or whatever. Therefore there is no problem with registers of different types sharing an encoding value.

The encodings for the various classes of register are:

(Note that wherever a register name contains a number, that number is also the register value for that register.)

B.2.2 Condition Codes

The available condition codes are given here, along with their numeric representations as part of opcodes. Many of these condition codes have synonyms, so several will be listed at a time.

In the following descriptions, the word `either', when applied to two possible trigger conditions, is used to mean `either or both'. If `either but not both' is meant, the phrase `exactly one of' is used.

Note that in all cases, the sense of a condition code may be reversed by changing the low bit of the numeric representation.

For details of when an instruction sets each of the status flags, see the individual instruction, plus the Status Flags reference in section B.2.4

B.2.3 SSE Condition Predicates

The condition predicates for SSE comparison instructions are the codes used as part of the opcode, to determine what form of comparison is being carried out. In each case, the imm8 value is the final byte of the opcode encoding, and the predicate is the code used as part of the mnemonic for the instruction (equivalent to the "cc" in an integer instruction that used a condition code). The instructions that use this will give details of what the various mnemonics are, this table is used to help you work out details of what is happening.

Predi- imm8 Description Relation where: Emula- Result if QNaN cate Encod- A Is 1st Operand tion NaN Signals ing B Is 2nd Operand Operand Invalid

EQ 000B equal A = B False No

LT 001B less-than A < B False Yes

LE 010B less-than- A <= B False Yes or-equal

--- ---- greater A > B Swap False Yes than Operands, Use LT

--- ---- greater- A >= B Swap False Yes than-or-equal Operands, Use LE

UNORD 011B unordered A, B = Unordered True No

NEQ 100B not-equal A != B True No

NLT 101B not-less- NOT(A < B) True Yes than

NLE 110B not-less- NOT(A <= B) True Yes than-or- equal

--- ---- not-greater NOT(A > B) Swap True Yes than Operands, Use NLT

--- ---- not-greater NOT(A >= B) Swap True Yes than- Operands, or-equal Use NLE

ORD 111B ordered A , B = Ordered False No

The unordered relationship is true when at least one of the two values being compared is a NaN or in an unsupported format.

Note that the comparisons which are listed as not having a predicate or encoding can only be achieved through software emulation, as described in the "emulation" column. Note in particular that an instruction such as greater-than is not the same as NLE, as, unlike with the CMP instruction, it has to take into account the possibility of one operand containing a NaN or an unsupported numeric format.

B.2.4 Status Flags

The status flags provide some information about the result of the arithmetic instructions. This information can be used by conditional instructions (such a Jcc and CMOVcc) as well as by some of the other instructions (such as ADC and INTO).

There are 6 status flags:

CF - Carry flag.

Set if an arithmetic operation generates a carry or a borrow out of the most-significant bit of the result; cleared otherwise. This flag indicates an overflow condition for unsigned-integer arithmetic. It is also used in multiple-precision arithmetic.

PF - Parity flag.

Set if the least-significant byte of the result contains an even number of 1 bits; cleared otherwise.

AF - Adjust flag.

Set if an arithmetic operation generates a carry or a borrow out of bit 3 of the result; cleared otherwise. This flag is used in binary-coded decimal (BCD) arithmetic.

ZF - Zero flag.

Set if the result is zero; cleared otherwise.

SF - Sign flag.

Set equal to the most-significant bit of the result, which is the sign bit of a signed integer. (0 indicates a positive value and 1 indicates a negative value.)

OF - Overflow flag.

Set if the integer result is too large a positive number or too small a negative number (excluding the sign-bit) to fit in the destina-tion operand; cleared otherwise. This flag indicates an overflow condition for signed-integer (two’s complement) arithmetic.

B.2.5 Effective Address Encoding: ModR/M and SIB

An effective address is encoded in up to three parts: a ModR/M byte, an optional SIB byte, and an optional byte, word or doubleword displacement field.

The ModR/M byte consists of three fields: the mod field, ranging from 0 to 3, in the upper two bits of the byte, the r/m field, ranging from 0 to 7, in the lower three bits, and the spare (register) field in the middle (bit 3 to bit 5). The spare field is not relevant to the effective address being encoded, and either contains an extension to the instruction opcode or the register value of another operand.

The ModR/M system can be used to encode a direct register reference rather than a memory access. This is always done by setting the mod field to 3 and the r/m field to the register value of the register in question (it must be a general-purpose register, and the size of the register must already be implicit in the encoding of the rest of the instruction). In this case, the SIB byte and displacement field are both absent.

In 16-bit addressing mode (either BITS 16 with no 67 prefix, or BITS 32 with a 67 prefix), the SIB byte is never used. The general rules for mod and r/m (there is an exception, given below) are:

However, there is a special case:

Therefore the effective address [BP] cannot be encoded as efficiently as [BX]; so if you code [BP] in a program, NASM adds a notional 8-bit zero displacement, and sets mod to 1, r/m to 6, and the one-byte displacement field to 0.

In 32-bit addressing mode (either BITS 16 with a 67 prefix, or BITS 32 with no 67 prefix) the general rules (again, there are exceptions) for mod and r/m are:

If the SIB byte is present, it describes the combination of registers (an optional base register, and an optional index register scaled by multiplication by 1, 2, 4 or 8) to be added to the displacement. The SIB byte is divided into the scale field, in the top two bits, the index field in the next three, and the base field in the bottom three. The general rules are:

The exceptions to the 32-bit encoding rules are:

B.3 Key to Instruction Flags

Given along with each instruction in this appendix is a set of flags, denoting the type of the instruction. The types are as follows:

B.4 AAA, AAS, AAM, AAD: ASCII Adjustments

AAA                           ; 37                   [8086]

AAS                           ; 3F                   [8086]

AAD                           ; D5 0A                [8086] 
AAD imm                       ; D5 ib                [8086]

AAM                           ; D4 0A                [8086] 
AAM imm                       ; D4 ib                [8086]

These instructions are used in conjunction with the add, subtract, multiply and divide instructions to perform binary-coded decimal arithmetic in unpacked (one BCD digit per byte - easy to translate to and from ASCII, hence the instruction names) form. There are also packed BCD instructions DAA and DAS: see section B.60.

B.5 ADC: Add with Carry

ADC r/m8,reg8                 ; 10 /r                [8086] 
ADC r/m16,reg16               ; o16 11 /r            [8086] 
ADC r/m32,reg32               ; o32 11 /r            [386]

ADC reg8,r/m8                 ; 12 /r                [8086] 
ADC reg16,r/m16               ; o16 13 /r            [8086] 
ADC reg32,r/m32               ; o32 13 /r            [386]

ADC r/m8,imm8                 ; 80 /2 ib             [8086] 
ADC r/m16,imm16               ; o16 81 /2 iw         [8086] 
ADC r/m32,imm32               ; o32 81 /2 id         [386]

ADC r/m16,imm8                ; o16 83 /2 ib         [8086] 
ADC r/m32,imm8                ; o32 83 /2 ib         [386]

ADC AL,imm8                   ; 14 ib                [8086] 
ADC AX,imm16                  ; o16 15 iw            [8086] 
ADC EAX,imm32                 ; o32 15 id            [386]

ADC performs integer addition: it adds its two operands together, plus the value of the carry flag, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

To add two numbers without also adding the contents of the carry flag, use ADD (section B.6).

B.6 ADD: Add Integers

ADD r/m8,reg8                 ; 00 /r                [8086] 
ADD r/m16,reg16               ; o16 01 /r            [8086] 
ADD r/m32,reg32               ; o32 01 /r            [386]

ADD reg8,r/m8                 ; 02 /r                [8086] 
ADD reg16,r/m16               ; o16 03 /r            [8086] 
ADD reg32,r/m32               ; o32 03 /r            [386]

ADD r/m8,imm8                 ; 80 /0 ib             [8086] 
ADD r/m16,imm16               ; o16 81 /0 iw         [8086] 
ADD r/m32,imm32               ; o32 81 /0 id         [386]

ADD r/m16,imm8                ; o16 83 /0 ib         [8086] 
ADD r/m32,imm8                ; o32 83 /0 ib         [386]

ADD AL,imm8                   ; 04 ib                [8086] 
ADD AX,imm16                  ; o16 05 iw            [8086] 
ADD EAX,imm32                 ; o32 05 id            [386]

ADD performs integer addition: it adds its two operands together, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

B.7 ADDPD: ADD Packed Double-Precision FP Values

ADDPD xmm1,xmm2/mem128        ; 66 0F 58 /r     [WILLAMETTE,SSE2]

ADDPD performs addition on each of two packed double-precision FP value pairs.

   dst[0-63]   := dst[0-63]   + src[0-63], 
   dst[64-127] := dst[64-127] + src[64-127].

The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

B.8 ADDPS: ADD Packed Single-Precision FP Values

ADDPS xmm1,xmm2/mem128        ; 0F 58 /r        [KATMAI,SSE]

ADDPS performs addition on each of four packed single-precision FP value pairs

   dst[0-31]   := dst[0-31]   + src[0-31], 
   dst[32-63]  := dst[32-63]  + src[32-63], 
   dst[64-95]  := dst[64-95]  + src[64-95], 
   dst[96-127] := dst[96-127] + src[96-127].

The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

B.9 ADDSD: ADD Scalar Double-Precision FP Values

ADDSD xmm1,xmm2/mem64         ; F2 0F 58 /r     [KATMAI,SSE]

ADDSD adds the low double-precision FP values from the source and destination operands and stores the double-precision FP result in the destination operand.

   dst[0-63]   := dst[0-63] + src[0-63], 
   dst[64-127) remains unchanged.

The destination is an XMM register. The source operand can be either an XMM register or a 64-bit memory location.

B.10 ADDSS: ADD Scalar Single-Precision FP Values

ADDSS xmm1,xmm2/mem32         ; F3 0F 58 /r     [WILLAMETTE,SSE2]

ADDSD adds the low single-precision FP values from the source and destination operands and stores the single-precision FP result in the destination operand.

   dst[0-31]   := dst[0-31] + src[0-31], 
   dst[32-127] remains unchanged.

The destination is an XMM register. The source operand can be either an XMM register or a 32-bit memory location.

B.11 AND: Bitwise AND

AND r/m8,reg8                 ; 20 /r                [8086] 
AND r/m16,reg16               ; o16 21 /r            [8086] 
AND r/m32,reg32               ; o32 21 /r            [386]

AND reg8,r/m8                 ; 22 /r                [8086] 
AND reg16,r/m16               ; o16 23 /r            [8086] 
AND reg32,r/m32               ; o32 23 /r            [386]

AND r/m8,imm8                 ; 80 /4 ib             [8086] 
AND r/m16,imm16               ; o16 81 /4 iw         [8086] 
AND r/m32,imm32               ; o32 81 /4 id         [386]

AND r/m16,imm8                ; o16 83 /4 ib         [8086] 
AND r/m32,imm8                ; o32 83 /4 ib         [386]

AND AL,imm8                   ; 24 ib                [8086] 
AND AX,imm16                  ; o16 25 iw            [8086] 
AND EAX,imm32                 ; o32 25 id            [386]

AND performs a bitwise AND operation between its two operands (i.e. each bit of the result is 1 if and only if the corresponding bits of the two inputs were both 1), and stores the result in the destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

The MMX instruction PAND (see section B.205) performs the same operation on the 64-bit MMX registers.

B.12 ANDNPD: Bitwise Logical AND NOT of Packed Double-Precision FP Values

ANDNPD xmm1,xmm2/mem128       ; 66 0F 55 /r     [WILLAMETTE,SSE2]

ANDNPD inverts the bits of the two double-precision floating-point values in the destination register, and then performs a logical AND between the two double-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

   dst[0-63]   := src[0-63]   AND NOT dst[0-63], 
   dst[64-127] := src[64-127] AND NOT dst[64-127].

The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

B.13 ANDNPS: Bitwise Logical AND NOT of Packed Single-Precision FP Values

ANDNPS xmm1,xmm2/mem128       ; 0F 55 /r        [KATMAI,SSE]

ANDNPS inverts the bits of the four single-precision floating-point values in the destination register, and then performs a logical AND between the four single-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

   dst[0-31]   := src[0-31]   AND NOT dst[0-31], 
   dst[32-63]  := src[32-63]  AND NOT dst[32-63], 
   dst[64-95]  := src[64-95]  AND NOT dst[64-95], 
   dst[96-127] := src[96-127] AND NOT dst[96-127].

The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

B.14 ANDPD: Bitwise Logical AND For Single FP

ANDPD xmm1,xmm2/mem128        ; 66 0F 54 /r     [WILLAMETTE,SSE2]

ANDPD performs a bitwise logical AND of the two double-precision floating point values in the source and destination operand, and stores the result in the destination register.

   dst[0-63]   := src[0-63]   AND dst[0-63], 
   dst[64-127] := src[64-127] AND dst[64-127].

The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

B.15 ANDPS: Bitwise Logical AND For Single FP

ANDPS xmm1,xmm2/mem128        ; 0F 54 /r        [KATMAI,SSE]

ANDPS performs a bitwise logical AND of the four single-precision floating point values in the source and destination operand, and stores the result in the destination register.

   dst[0-31]   := src[0-31]   AND dst[0-31], 
   dst[32-63]  := src[32-63]  AND dst[32-63], 
   dst[64-95]  := src[64-95]  AND dst[64-95], 
   dst[96-127] := src[96-127] AND dst[96-127].

The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

B.16 ARPL: Adjust RPL Field of Selector

ARPL r/m16,reg16              ; 63 /r                [286,PRIV]

ARPL expects its two word operands to be segment selectors. It adjusts the RPL (reque documented as such.

  • CYRIX indicates that the instruction is specific to Cyrix processors, for example the extra MMX instructions in the Cyrix extended MMX instruction set.
  • FPU indicates that the instruction is a floating-point one, and will only run on machines with a coprocessor (automatically including 486DX, Pentium and above).
  • KATMAI indicates that the instruction was introduced as part of the Katmai New Instruction set. These instructions are available on the Pentium III and later processors. Those which are not specifically SSE instructions are also available on the AMD Athlon.
  • MMX indicates that the instruction is an MMX one, and will run on MMX-capable Pentium processors and the Pentium II.
  • PRIV indicates that the instruction is a protected-mode management instruction. Many of these may only be used in protected mode, or only at privilege level zero.
  • SSE and SSE2 indicate that the instruction is a Streaming SIMD Extension instruction. These instructions operate on multiple values in a single operation. SSE was introduced with the Pentium III and SSE2 was introduced with the Pentium 4.
  • UNDOC indicates that the instruction is an undocumented one, and not part of the official Intel Architecture; it may or may not be supported on any given machine.
  • WILLAMETTE indicates that the instruction was introduced as part of the new instruction set in the Pentium 4 and Intel Xeon processors. These instructions are also known as SSE2 instructions.

    B.4 AAA, AAS, AAM, AAD: ASCII Adjustments

    AAA                           ; 37                   [8086]
    

    AAS                           ; 3F                   [8086]
    

    AAD                           ; D5 0A                [8086] 
    AAD imm                       ; D5 ib                [8086]
    

    AAM                           ; D4 0A                [8086] 
    AAM imm                       ; D4 ib                [8086]
    

    These instructions are used in conjunction with the add, subtract, multiply and divide instructions to perform binary-coded decimal arithmetic in unpacked (one BCD digit per byte - easy to translate to and from ASCII, hence the instruction names) form. There are also packed BCD instructions DAA and DAS: see section B.60.

    B.5 ADC: Add with Carry

    ADC r/m8,reg8                 ; 10 /r                [8086] 
    ADC r/m16,reg16               ; o16 11 /r            [8086] 
    ADC r/m32,reg32               ; o32 11 /r            [386]
    

    ADC reg8,r/m8                 ; 12 /r                [8086] 
    ADC reg16,r/m16               ; o16 13 /r            [8086] 
    ADC reg32,r/m32               ; o32 13 /r            [386]
    

    ADC r/m8,imm8                 ; 80 /2 ib             [8086] 
    ADC r/m16,imm16               ; o16 81 /2 iw         [8086] 
    ADC r/m32,imm32               ; o32 81 /2 id         [386]
    

    ADC r/m16,imm8                ; o16 83 /2 ib         [8086] 
    ADC r/m32,imm8                ; o32 83 /2 ib         [386]
    

    ADC AL,imm8                   ; 14 ib                [8086] 
    ADC AX,imm16                  ; o16 15 iw            [8086] 
    ADC EAX,imm32                 ; o32 15 id            [386]
    

    ADC performs integer addition: it adds its two operands together, plus the value of the carry flag, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    To add two numbers without also adding the contents of the carry flag, use ADD (section B.6).

    B.6 ADD: Add Integers

    ADD r/m8,reg8                 ; 00 /r                [8086] 
    ADD r/m16,reg16               ; o16 01 /r            [8086] 
    ADD r/m32,reg32               ; o32 01 /r            [386]
    

    ADD reg8,r/m8                 ; 02 /r                [8086] 
    ADD reg16,r/m16               ; o16 03 /r            [8086] 
    ADD reg32,r/m32               ; o32 03 /r            [386]
    

    ADD r/m8,imm8                 ; 80 /0 ib             [8086] 
    ADD r/m16,imm16               ; o16 81 /0 iw         [8086] 
    ADD r/m32,imm32               ; o32 81 /0 id         [386]
    

    ADD r/m16,imm8                ; o16 83 /0 ib         [8086] 
    ADD r/m32,imm8                ; o32 83 /0 ib         [386]
    

    ADD AL,imm8                   ; 04 ib                [8086] 
    ADD AX,imm16                  ; o16 05 iw            [8086] 
    ADD EAX,imm32                 ; o32 05 id            [386]
    

    ADD performs integer addition: it adds its two operands together, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    B.7 ADDPD: ADD Packed Double-Precision FP Values

    ADDPD xmm1,xmm2/mem128        ; 66 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDPD performs addition on each of two packed double-precision FP value pairs.

       dst[0-63]   := dst[0-63]   + src[0-63], 
       dst[64-127] := dst[64-127] + src[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.8 ADDPS: ADD Packed Single-Precision FP Values

    ADDPS xmm1,xmm2/mem128        ; 0F 58 /r        [KATMAI,SSE]
    

    ADDPS performs addition on each of four packed single-precision FP value pairs

       dst[0-31]   := dst[0-31]   + src[0-31], 
       dst[32-63]  := dst[32-63]  + src[32-63], 
       dst[64-95]  := dst[64-95]  + src[64-95], 
       dst[96-127] := dst[96-127] + src[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.9 ADDSD: ADD Scalar Double-Precision FP Values

    ADDSD xmm1,xmm2/mem64         ; F2 0F 58 /r     [KATMAI,SSE]
    

    ADDSD adds the low double-precision FP values from the source and destination operands and stores the double-precision FP result in the destination operand.

       dst[0-63]   := dst[0-63] + src[0-63], 
       dst[64-127) remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 64-bit memory location.

    B.10 ADDSS: ADD Scalar Single-Precision FP Values

    ADDSS xmm1,xmm2/mem32         ; F3 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDSD adds the low single-precision FP values from the source and destination operands and stores the single-precision FP result in the destination operand.

       dst[0-31]   := dst[0-31] + src[0-31], 
       dst[32-127] remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 32-bit memory location.

    B.11 AND: Bitwise AND

    AND r/m8,reg8                 ; 20 /r                [8086] 
    AND r/m16,reg16               ; o16 21 /r            [8086] 
    AND r/m32,reg32               ; o32 21 /r            [386]
    

    AND reg8,r/m8                 ; 22 /r                [8086] 
    AND reg16,r/m16               ; o16 23 /r            [8086] 
    AND reg32,r/m32               ; o32 23 /r            [386]
    

    AND r/m8,imm8                 ; 80 /4 ib             [8086] 
    AND r/m16,imm16               ; o16 81 /4 iw         [8086] 
    AND r/m32,imm32               ; o32 81 /4 id         [386]
    

    AND r/m16,imm8                ; o16 83 /4 ib         [8086] 
    AND r/m32,imm8                ; o32 83 /4 ib         [386]
    

    AND AL,imm8                   ; 24 ib                [8086] 
    AND AX,imm16                  ; o16 25 iw            [8086] 
    AND EAX,imm32                 ; o32 25 id            [386]
    

    AND performs a bitwise AND operation between its two operands (i.e. each bit of the result is 1 if and only if the corresponding bits of the two inputs were both 1), and stores the result in the destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    The MMX instruction PAND (see section B.205) performs the same operation on the 64-bit MMX registers.

    B.12 ANDNPD: Bitwise Logical AND NOT of Packed Double-Precision FP Values

    ANDNPD xmm1,xmm2/mem128       ; 66 0F 55 /r     [WILLAMETTE,SSE2]
    

    ANDNPD inverts the bits of the two double-precision floating-point values in the destination register, and then performs a logical AND between the two double-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-63]   := src[0-63]   AND NOT dst[0-63], 
       dst[64-127] := src[64-127] AND NOT dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.13 ANDNPS: Bitwise Logical AND NOT of Packed Single-Precision FP Values

    ANDNPS xmm1,xmm2/mem128       ; 0F 55 /r        [KATMAI,SSE]
    

    ANDNPS inverts the bits of the four single-precision floating-point values in the destination register, and then performs a logical AND between the four single-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-31]   := src[0-31]   AND NOT dst[0-31], 
       dst[32-63]  := src[32-63]  AND NOT dst[32-63], 
       dst[64-95]  := src[64-95]  AND NOT dst[64-95], 
       dst[96-127] := src[96-127] AND NOT dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.14 ANDPD: Bitwise Logical AND For Single FP

    ANDPD xmm1,xmm2/mem128        ; 66 0F 54 /r     [WILLAMETTE,SSE2]
    

    ANDPD performs a bitwise logical AND of the two double-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-63]   := src[0-63]   AND dst[0-63], 
       dst[64-127] := src[64-127] AND dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.15 ANDPS: Bitwise Logical AND For Single FP

    ANDPS xmm1,xmm2/mem128        ; 0F 54 /r        [KATMAI,SSE]
    

    ANDPS performs a bitwise logical AND of the four single-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-31]   := src[0-31]   AND dst[0-31], 
       dst[32-63]  := src[32-63]  AND dst[32-63], 
       dst[64-95]  := src[64-95]  AND dst[64-95], 
       dst[96-127] := src[96-127] AND dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.16 ARPL: Adjust RPL Field of Selector

    ARPL r/m16,reg16              ; 63 /r                [286,PRIV]
    

    ARPL expects its two word operands to be segment selectors. It adjusts the RPL (reque documented as such.

  • CYRIX indicates that the instruction is specific to Cyrix processors, for example the extra MMX instructions in the Cyrix extended MMX instruction set.
  • FPU indicates that the instruction is a floating-point one, and will only run on machines with a coprocessor (automatically including 486DX, Pentium and above).
  • KATMAI indicates that the instruction was introduced as part of the Katmai New Instruction set. These instructions are available on the Pentium III and later processors. Those which are not specifically SSE instructions are also available on the AMD Athlon.
  • MMX indicates that the instruction is an MMX one, and will run on MMX-capable Pentium processors and the Pentium II.
  • PRIV indicates that the instruction is a protected-mode management instruction. Many of these may only be used in protected mode, or only at privilege level zero.
  • SSE and SSE2 indicate that the instruction is a Streaming SIMD Extension instruction. These instructions operate on multiple values in a single operation. SSE was introduced with the Pentium III and SSE2 was introduced with the Pentium 4.
  • UNDOC indicates that the instruction is an undocumented one, and not part of the official Intel Architecture; it may or may not be supported on any given machine.
  • WILLAMETTE indicates that the instruction was introduced as part of the new instruction set in the Pentium 4 and Intel Xeon processors. These instructions are also known as SSE2 instructions.

    B.4 AAA, AAS, AAM, AAD: ASCII Adjustments

    AAA                           ; 37                   [8086]
    

    AAS                           ; 3F                   [8086]
    

    AAD                           ; D5 0A                [8086] 
    AAD imm                       ; D5 ib                [8086]
    

    AAM                           ; D4 0A                [8086] 
    AAM imm                       ; D4 ib                [8086]
    

    These instructions are used in conjunction with the add, subtract, multiply and divide instructions to perform binary-coded decimal arithmetic in unpacked (one BCD digit per byte - easy to translate to and from ASCII, hence the instruction names) form. There are also packed BCD instructions DAA and DAS: see section B.60.

    B.5 ADC: Add with Carry

    ADC r/m8,reg8                 ; 10 /r                [8086] 
    ADC r/m16,reg16               ; o16 11 /r            [8086] 
    ADC r/m32,reg32               ; o32 11 /r            [386]
    

    ADC reg8,r/m8                 ; 12 /r                [8086] 
    ADC reg16,r/m16               ; o16 13 /r            [8086] 
    ADC reg32,r/m32               ; o32 13 /r            [386]
    

    ADC r/m8,imm8                 ; 80 /2 ib             [8086] 
    ADC r/m16,imm16               ; o16 81 /2 iw         [8086] 
    ADC r/m32,imm32               ; o32 81 /2 id         [386]
    

    ADC r/m16,imm8                ; o16 83 /2 ib         [8086] 
    ADC r/m32,imm8                ; o32 83 /2 ib         [386]
    

    ADC AL,imm8                   ; 14 ib                [8086] 
    ADC AX,imm16                  ; o16 15 iw            [8086] 
    ADC EAX,imm32                 ; o32 15 id            [386]
    

    ADC performs integer addition: it adds its two operands together, plus the value of the carry flag, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    To add two numbers without also adding the contents of the carry flag, use ADD (section B.6).

    B.6 ADD: Add Integers

    ADD r/m8,reg8                 ; 00 /r                [8086] 
    ADD r/m16,reg16               ; o16 01 /r            [8086] 
    ADD r/m32,reg32               ; o32 01 /r            [386]
    

    ADD reg8,r/m8                 ; 02 /r                [8086] 
    ADD reg16,r/m16               ; o16 03 /r            [8086] 
    ADD reg32,r/m32               ; o32 03 /r            [386]
    

    ADD r/m8,imm8                 ; 80 /0 ib             [8086] 
    ADD r/m16,imm16               ; o16 81 /0 iw         [8086] 
    ADD r/m32,imm32               ; o32 81 /0 id         [386]
    

    ADD r/m16,imm8                ; o16 83 /0 ib         [8086] 
    ADD r/m32,imm8                ; o32 83 /0 ib         [386]
    

    ADD AL,imm8                   ; 04 ib                [8086] 
    ADD AX,imm16                  ; o16 05 iw            [8086] 
    ADD EAX,imm32                 ; o32 05 id            [386]
    

    ADD performs integer addition: it adds its two operands together, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    B.7 ADDPD: ADD Packed Double-Precision FP Values

    ADDPD xmm1,xmm2/mem128        ; 66 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDPD performs addition on each of two packed double-precision FP value pairs.

       dst[0-63]   := dst[0-63]   + src[0-63], 
       dst[64-127] := dst[64-127] + src[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.8 ADDPS: ADD Packed Single-Precision FP Values

    ADDPS xmm1,xmm2/mem128        ; 0F 58 /r        [KATMAI,SSE]
    

    ADDPS performs addition on each of four packed single-precision FP value pairs

       dst[0-31]   := dst[0-31]   + src[0-31], 
       dst[32-63]  := dst[32-63]  + src[32-63], 
       dst[64-95]  := dst[64-95]  + src[64-95], 
       dst[96-127] := dst[96-127] + src[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.9 ADDSD: ADD Scalar Double-Precision FP Values

    ADDSD xmm1,xmm2/mem64         ; F2 0F 58 /r     [KATMAI,SSE]
    

    ADDSD adds the low double-precision FP values from the source and destination operands and stores the double-precision FP result in the destination operand.

       dst[0-63]   := dst[0-63] + src[0-63], 
       dst[64-127) remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 64-bit memory location.

    B.10 ADDSS: ADD Scalar Single-Precision FP Values

    ADDSS xmm1,xmm2/mem32         ; F3 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDSD adds the low single-precision FP values from the source and destination operands and stores the single-precision FP result in the destination operand.

       dst[0-31]   := dst[0-31] + src[0-31], 
       dst[32-127] remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 32-bit memory location.

    B.11 AND: Bitwise AND

    AND r/m8,reg8                 ; 20 /r                [8086] 
    AND r/m16,reg16               ; o16 21 /r            [8086] 
    AND r/m32,reg32               ; o32 21 /r            [386]
    

    AND reg8,r/m8                 ; 22 /r                [8086] 
    AND reg16,r/m16               ; o16 23 /r            [8086] 
    AND reg32,r/m32               ; o32 23 /r            [386]
    

    AND r/m8,imm8                 ; 80 /4 ib             [8086] 
    AND r/m16,imm16               ; o16 81 /4 iw         [8086] 
    AND r/m32,imm32               ; o32 81 /4 id         [386]
    

    AND r/m16,imm8                ; o16 83 /4 ib         [8086] 
    AND r/m32,imm8                ; o32 83 /4 ib         [386]
    

    AND AL,imm8                   ; 24 ib                [8086] 
    AND AX,imm16                  ; o16 25 iw            [8086] 
    AND EAX,imm32                 ; o32 25 id            [386]
    

    AND performs a bitwise AND operation between its two operands (i.e. each bit of the result is 1 if and only if the corresponding bits of the two inputs were both 1), and stores the result in the destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    The MMX instruction PAND (see section B.205) performs the same operation on the 64-bit MMX registers.

    B.12 ANDNPD: Bitwise Logical AND NOT of Packed Double-Precision FP Values

    ANDNPD xmm1,xmm2/mem128       ; 66 0F 55 /r     [WILLAMETTE,SSE2]
    

    ANDNPD inverts the bits of the two double-precision floating-point values in the destination register, and then performs a logical AND between the two double-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-63]   := src[0-63]   AND NOT dst[0-63], 
       dst[64-127] := src[64-127] AND NOT dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.13 ANDNPS: Bitwise Logical AND NOT of Packed Single-Precision FP Values

    ANDNPS xmm1,xmm2/mem128       ; 0F 55 /r        [KATMAI,SSE]
    

    ANDNPS inverts the bits of the four single-precision floating-point values in the destination register, and then performs a logical AND between the four single-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-31]   := src[0-31]   AND NOT dst[0-31], 
       dst[32-63]  := src[32-63]  AND NOT dst[32-63], 
       dst[64-95]  := src[64-95]  AND NOT dst[64-95], 
       dst[96-127] := src[96-127] AND NOT dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.14 ANDPD: Bitwise Logical AND For Single FP

    ANDPD xmm1,xmm2/mem128        ; 66 0F 54 /r     [WILLAMETTE,SSE2]
    

    ANDPD performs a bitwise logical AND of the two double-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-63]   := src[0-63]   AND dst[0-63], 
       dst[64-127] := src[64-127] AND dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.15 ANDPS: Bitwise Logical AND For Single FP

    ANDPS xmm1,xmm2/mem128        ; 0F 54 /r        [KATMAI,SSE]
    

    ANDPS performs a bitwise logical AND of the four single-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-31]   := src[0-31]   AND dst[0-31], 
       dst[32-63]  := src[32-63]  AND dst[32-63], 
       dst[64-95]  := src[64-95]  AND dst[64-95], 
       dst[96-127] := src[96-127] AND dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.16 ARPL: Adjust RPL Field of Selector

    ARPL r/m16,reg16              ; 63 /r                [286,PRIV]
    

    ARPL expects its two word operands to be segment selectors. It adjusts the RPL (reque documented as such.

  • CYRIX indicates that the instruction is specific to Cyrix processors, for example the extra MMX instructions in the Cyrix extended MMX instruction set.
  • FPU indicates that the instruction is a floating-point one, and will only run on machines with a coprocessor (automatically including 486DX, Pentium and above).
  • KATMAI indicates that the instruction was introduced as part of the Katmai New Instruction set. These instructions are available on the Pentium III and later processors. Those which are not specifically SSE instructions are also available on the AMD Athlon.
  • MMX indicates that the instruction is an MMX one, and will run on MMX-capable Pentium processors and the Pentium II.
  • PRIV indicates that the instruction is a protected-mode management instruction. Many of these may only be used in protected mode, or only at privilege level zero.
  • SSE and SSE2 indicate that the instruction is a Streaming SIMD Extension instruction. These instructions operate on multiple values in a single operation. SSE was introduced with the Pentium III and SSE2 was introduced with the Pentium 4.
  • UNDOC indicates that the instruction is an undocumented one, and not part of the official Intel Architecture; it may or may not be supported on any given machine.
  • WILLAMETTE indicates that the instruction was introduced as part of the new instruction set in the Pentium 4 and Intel Xeon processors. These instructions are also known as SSE2 instructions.

    B.4 AAA, AAS, AAM, AAD: ASCII Adjustments

    AAA                           ; 37                   [8086]
    

    AAS                           ; 3F                   [8086]
    

    AAD                           ; D5 0A                [8086] 
    AAD imm                       ; D5 ib                [8086]
    

    AAM                           ; D4 0A                [8086] 
    AAM imm                       ; D4 ib                [8086]
    

    These instructions are used in conjunction with the add, subtract, multiply and divide instructions to perform binary-coded decimal arithmetic in unpacked (one BCD digit per byte - easy to translate to and from ASCII, hence the instruction names) form. There are also packed BCD instructions DAA and DAS: see section B.60.

    B.5 ADC: Add with Carry

    ADC r/m8,reg8                 ; 10 /r                [8086] 
    ADC r/m16,reg16               ; o16 11 /r            [8086] 
    ADC r/m32,reg32               ; o32 11 /r            [386]
    

    ADC reg8,r/m8                 ; 12 /r                [8086] 
    ADC reg16,r/m16               ; o16 13 /r            [8086] 
    ADC reg32,r/m32               ; o32 13 /r            [386]
    

    ADC r/m8,imm8                 ; 80 /2 ib             [8086] 
    ADC r/m16,imm16               ; o16 81 /2 iw         [8086] 
    ADC r/m32,imm32               ; o32 81 /2 id         [386]
    

    ADC r/m16,imm8                ; o16 83 /2 ib         [8086] 
    ADC r/m32,imm8                ; o32 83 /2 ib         [386]
    

    ADC AL,imm8                   ; 14 ib                [8086] 
    ADC AX,imm16                  ; o16 15 iw            [8086] 
    ADC EAX,imm32                 ; o32 15 id            [386]
    

    ADC performs integer addition: it adds its two operands together, plus the value of the carry flag, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    To add two numbers without also adding the contents of the carry flag, use ADD (section B.6).

    B.6 ADD: Add Integers

    ADD r/m8,reg8                 ; 00 /r                [8086] 
    ADD r/m16,reg16               ; o16 01 /r            [8086] 
    ADD r/m32,reg32               ; o32 01 /r            [386]
    

    ADD reg8,r/m8                 ; 02 /r                [8086] 
    ADD reg16,r/m16               ; o16 03 /r            [8086] 
    ADD reg32,r/m32               ; o32 03 /r            [386]
    

    ADD r/m8,imm8                 ; 80 /0 ib             [8086] 
    ADD r/m16,imm16               ; o16 81 /0 iw         [8086] 
    ADD r/m32,imm32               ; o32 81 /0 id         [386]
    

    ADD r/m16,imm8                ; o16 83 /0 ib         [8086] 
    ADD r/m32,imm8                ; o32 83 /0 ib         [386]
    

    ADD AL,imm8                   ; 04 ib                [8086] 
    ADD AX,imm16                  ; o16 05 iw            [8086] 
    ADD EAX,imm32                 ; o32 05 id            [386]
    

    ADD performs integer addition: it adds its two operands together, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    B.7 ADDPD: ADD Packed Double-Precision FP Values

    ADDPD xmm1,xmm2/mem128        ; 66 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDPD performs addition on each of two packed double-precision FP value pairs.

       dst[0-63]   := dst[0-63]   + src[0-63], 
       dst[64-127] := dst[64-127] + src[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.8 ADDPS: ADD Packed Single-Precision FP Values

    ADDPS xmm1,xmm2/mem128        ; 0F 58 /r        [KATMAI,SSE]
    

    ADDPS performs addition on each of four packed single-precision FP value pairs

       dst[0-31]   := dst[0-31]   + src[0-31], 
       dst[32-63]  := dst[32-63]  + src[32-63], 
       dst[64-95]  := dst[64-95]  + src[64-95], 
       dst[96-127] := dst[96-127] + src[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.9 ADDSD: ADD Scalar Double-Precision FP Values

    ADDSD xmm1,xmm2/mem64         ; F2 0F 58 /r     [KATMAI,SSE]
    

    ADDSD adds the low double-precision FP values from the source and destination operands and stores the double-precision FP result in the destination operand.

       dst[0-63]   := dst[0-63] + src[0-63], 
       dst[64-127) remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 64-bit memory location.

    B.10 ADDSS: ADD Scalar Single-Precision FP Values

    ADDSS xmm1,xmm2/mem32         ; F3 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDSD adds the low single-precision FP values from the source and destination operands and stores the single-precision FP result in the destination operand.

       dst[0-31]   := dst[0-31] + src[0-31], 
       dst[32-127] remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 32-bit memory location.

    B.11 AND: Bitwise AND

    AND r/m8,reg8                 ; 20 /r                [8086] 
    AND r/m16,reg16               ; o16 21 /r            [8086] 
    AND r/m32,reg32               ; o32 21 /r            [386]
    

    AND reg8,r/m8                 ; 22 /r                [8086] 
    AND reg16,r/m16               ; o16 23 /r            [8086] 
    AND reg32,r/m32               ; o32 23 /r            [386]
    

    AND r/m8,imm8                 ; 80 /4 ib             [8086] 
    AND r/m16,imm16               ; o16 81 /4 iw         [8086] 
    AND r/m32,imm32               ; o32 81 /4 id         [386]
    

    AND r/m16,imm8                ; o16 83 /4 ib         [8086] 
    AND r/m32,imm8                ; o32 83 /4 ib         [386]
    

    AND AL,imm8                   ; 24 ib                [8086] 
    AND AX,imm16                  ; o16 25 iw            [8086] 
    AND EAX,imm32                 ; o32 25 id            [386]
    

    AND performs a bitwise AND operation between its two operands (i.e. each bit of the result is 1 if and only if the corresponding bits of the two inputs were both 1), and stores the result in the destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    The MMX instruction PAND (see section B.205) performs the same operation on the 64-bit MMX registers.

    B.12 ANDNPD: Bitwise Logical AND NOT of Packed Double-Precision FP Values

    ANDNPD xmm1,xmm2/mem128       ; 66 0F 55 /r     [WILLAMETTE,SSE2]
    

    ANDNPD inverts the bits of the two double-precision floating-point values in the destination register, and then performs a logical AND between the two double-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-63]   := src[0-63]   AND NOT dst[0-63], 
       dst[64-127] := src[64-127] AND NOT dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.13 ANDNPS: Bitwise Logical AND NOT of Packed Single-Precision FP Values

    ANDNPS xmm1,xmm2/mem128       ; 0F 55 /r        [KATMAI,SSE]
    

    ANDNPS inverts the bits of the four single-precision floating-point values in the destination register, and then performs a logical AND between the four single-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-31]   := src[0-31]   AND NOT dst[0-31], 
       dst[32-63]  := src[32-63]  AND NOT dst[32-63], 
       dst[64-95]  := src[64-95]  AND NOT dst[64-95], 
       dst[96-127] := src[96-127] AND NOT dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.14 ANDPD: Bitwise Logical AND For Single FP

    ANDPD xmm1,xmm2/mem128        ; 66 0F 54 /r     [WILLAMETTE,SSE2]
    

    ANDPD performs a bitwise logical AND of the two double-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-63]   := src[0-63]   AND dst[0-63], 
       dst[64-127] := src[64-127] AND dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.15 ANDPS: Bitwise Logical AND For Single FP

    ANDPS xmm1,xmm2/mem128        ; 0F 54 /r        [KATMAI,SSE]
    

    ANDPS performs a bitwise logical AND of the four single-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-31]   := src[0-31]   AND dst[0-31], 
       dst[32-63]  := src[32-63]  AND dst[32-63], 
       dst[64-95]  := src[64-95]  AND dst[64-95], 
       dst[96-127] := src[96-127] AND dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.16 ARPL: Adjust RPL Field of Selector

    ARPL r/m16,reg16              ; 63 /r                [286,PRIV]
    

    ARPL expects its two word operands to be segment selectors. It adjusts the RPL (reque documented as such.

  • CYRIX indicates that the instruction is specific to Cyrix processors, for example the extra MMX instructions in the Cyrix extended MMX instruction set.
  • FPU indicates that the instruction is a floating-point one, and will only run on machines with a coprocessor (automatically including 486DX, Pentium and above).
  • KATMAI indicates that the instruction was introduced as part of the Katmai New Instruction set. These instructions are available on the Pentium III and later processors. Those which are not specifically SSE instructions are also available on the AMD Athlon.
  • MMX indicates that the instruction is an MMX one, and will run on MMX-capable Pentium processors and the Pentium II.
  • PRIV indicates that the instruction is a protected-mode management instruction. Many of these may only be used in protected mode, or only at privilege level zero.
  • SSE and SSE2 indicate that the instruction is a Streaming SIMD Extension instruction. These instructions operate on multiple values in a single operation. SSE was introduced with the Pentium III and SSE2 was introduced with the Pentium 4.
  • UNDOC indicates that the instruction is an undocumented one, and not part of the official Intel Architecture; it may or may not be supported on any given machine.
  • WILLAMETTE indicates that the instruction was introduced as part of the new instruction set in the Pentium 4 and Intel Xeon processors. These instructions are also known as SSE2 instructions.

    B.4 AAA, AAS, AAM, AAD: ASCII Adjustments

    AAA                           ; 37                   [8086]
    

    AAS                           ; 3F                   [8086]
    

    AAD                           ; D5 0A                [8086] 
    AAD imm                       ; D5 ib                [8086]
    

    AAM                           ; D4 0A                [8086] 
    AAM imm                       ; D4 ib                [8086]
    

    These instructions are used in conjunction with the add, subtract, multiply and divide instructions to perform binary-coded decimal arithmetic in unpacked (one BCD digit per byte - easy to translate to and from ASCII, hence the instruction names) form. There are also packed BCD instructions DAA and DAS: see section B.60.

    B.5 ADC: Add with Carry

    ADC r/m8,reg8                 ; 10 /r                [8086] 
    ADC r/m16,reg16               ; o16 11 /r            [8086] 
    ADC r/m32,reg32               ; o32 11 /r            [386]
    

    ADC reg8,r/m8                 ; 12 /r                [8086] 
    ADC reg16,r/m16               ; o16 13 /r            [8086] 
    ADC reg32,r/m32               ; o32 13 /r            [386]
    

    ADC r/m8,imm8                 ; 80 /2 ib             [8086] 
    ADC r/m16,imm16               ; o16 81 /2 iw         [8086] 
    ADC r/m32,imm32               ; o32 81 /2 id         [386]
    

    ADC r/m16,imm8                ; o16 83 /2 ib         [8086] 
    ADC r/m32,imm8                ; o32 83 /2 ib         [386]
    

    ADC AL,imm8                   ; 14 ib                [8086] 
    ADC AX,imm16                  ; o16 15 iw            [8086] 
    ADC EAX,imm32                 ; o32 15 id            [386]
    

    ADC performs integer addition: it adds its two operands together, plus the value of the carry flag, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    To add two numbers without also adding the contents of the carry flag, use ADD (section B.6).

    B.6 ADD: Add Integers

    ADD r/m8,reg8                 ; 00 /r                [8086] 
    ADD r/m16,reg16               ; o16 01 /r            [8086] 
    ADD r/m32,reg32               ; o32 01 /r            [386]
    

    ADD reg8,r/m8                 ; 02 /r                [8086] 
    ADD reg16,r/m16               ; o16 03 /r            [8086] 
    ADD reg32,r/m32               ; o32 03 /r            [386]
    

    ADD r/m8,imm8                 ; 80 /0 ib             [8086] 
    ADD r/m16,imm16               ; o16 81 /0 iw         [8086] 
    ADD r/m32,imm32               ; o32 81 /0 id         [386]
    

    ADD r/m16,imm8                ; o16 83 /0 ib         [8086] 
    ADD r/m32,imm8                ; o32 83 /0 ib         [386]
    

    ADD AL,imm8                   ; 04 ib                [8086] 
    ADD AX,imm16                  ; o16 05 iw            [8086] 
    ADD EAX,imm32                 ; o32 05 id            [386]
    

    ADD performs integer addition: it adds its two operands together, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    B.7 ADDPD: ADD Packed Double-Precision FP Values

    ADDPD xmm1,xmm2/mem128        ; 66 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDPD performs addition on each of two packed double-precision FP value pairs.

       dst[0-63]   := dst[0-63]   + src[0-63], 
       dst[64-127] := dst[64-127] + src[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.8 ADDPS: ADD Packed Single-Precision FP Values

    ADDPS xmm1,xmm2/mem128        ; 0F 58 /r        [KATMAI,SSE]
    

    ADDPS performs addition on each of four packed single-precision FP value pairs

       dst[0-31]   := dst[0-31]   + src[0-31], 
       dst[32-63]  := dst[32-63]  + src[32-63], 
       dst[64-95]  := dst[64-95]  + src[64-95], 
       dst[96-127] := dst[96-127] + src[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.9 ADDSD: ADD Scalar Double-Precision FP Values

    ADDSD xmm1,xmm2/mem64         ; F2 0F 58 /r     [KATMAI,SSE]
    

    ADDSD adds the low double-precision FP values from the source and destination operands and stores the double-precision FP result in the destination operand.

       dst[0-63]   := dst[0-63] + src[0-63], 
       dst[64-127) remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 64-bit memory location.

    B.10 ADDSS: ADD Scalar Single-Precision FP Values

    ADDSS xmm1,xmm2/mem32         ; F3 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDSD adds the low single-precision FP values from the source and destination operands and stores the single-precision FP result in the destination operand.

       dst[0-31]   := dst[0-31] + src[0-31], 
       dst[32-127] remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 32-bit memory location.

    B.11 AND: Bitwise AND

    AND r/m8,reg8                 ; 20 /r                [8086] 
    AND r/m16,reg16               ; o16 21 /r            [8086] 
    AND r/m32,reg32               ; o32 21 /r            [386]
    

    AND reg8,r/m8                 ; 22 /r                [8086] 
    AND reg16,r/m16               ; o16 23 /r            [8086] 
    AND reg32,r/m32               ; o32 23 /r            [386]
    

    AND r/m8,imm8                 ; 80 /4 ib             [8086] 
    AND r/m16,imm16               ; o16 81 /4 iw         [8086] 
    AND r/m32,imm32               ; o32 81 /4 id         [386]
    

    AND r/m16,imm8                ; o16 83 /4 ib         [8086] 
    AND r/m32,imm8                ; o32 83 /4 ib         [386]
    

    AND AL,imm8                   ; 24 ib                [8086] 
    AND AX,imm16                  ; o16 25 iw            [8086] 
    AND EAX,imm32                 ; o32 25 id            [386]
    

    AND performs a bitwise AND operation between its two operands (i.e. each bit of the result is 1 if and only if the corresponding bits of the two inputs were both 1), and stores the result in the destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    The MMX instruction PAND (see section B.205) performs the same operation on the 64-bit MMX registers.

    B.12 ANDNPD: Bitwise Logical AND NOT of Packed Double-Precision FP Values

    ANDNPD xmm1,xmm2/mem128       ; 66 0F 55 /r     [WILLAMETTE,SSE2]
    

    ANDNPD inverts the bits of the two double-precision floating-point values in the destination register, and then performs a logical AND between the two double-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-63]   := src[0-63]   AND NOT dst[0-63], 
       dst[64-127] := src[64-127] AND NOT dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.13 ANDNPS: Bitwise Logical AND NOT of Packed Single-Precision FP Values

    ANDNPS xmm1,xmm2/mem128       ; 0F 55 /r        [KATMAI,SSE]
    

    ANDNPS inverts the bits of the four single-precision floating-point values in the destination register, and then performs a logical AND between the four single-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-31]   := src[0-31]   AND NOT dst[0-31], 
       dst[32-63]  := src[32-63]  AND NOT dst[32-63], 
       dst[64-95]  := src[64-95]  AND NOT dst[64-95], 
       dst[96-127] := src[96-127] AND NOT dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.14 ANDPD: Bitwise Logical AND For Single FP

    ANDPD xmm1,xmm2/mem128        ; 66 0F 54 /r     [WILLAMETTE,SSE2]
    

    ANDPD performs a bitwise logical AND of the two double-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-63]   := src[0-63]   AND dst[0-63], 
       dst[64-127] := src[64-127] AND dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.15 ANDPS: Bitwise Logical AND For Single FP

    ANDPS xmm1,xmm2/mem128        ; 0F 54 /r        [KATMAI,SSE]
    

    ANDPS performs a bitwise logical AND of the four single-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-31]   := src[0-31]   AND dst[0-31], 
       dst[32-63]  := src[32-63]  AND dst[32-63], 
       dst[64-95]  := src[64-95]  AND dst[64-95], 
       dst[96-127] := src[96-127] AND dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.16 ARPL: Adjust RPL Field of Selector

    ARPL r/m16,reg16              ; 63 /r                [286,PRIV]
    

    ARPL expects its two word operands to be segment selectors. It adjusts the RPL (reque documented as such.

  • CYRIX indicates that the instruction is specific to Cyrix processors, for example the extra MMX instructions in the Cyrix extended MMX instruction set.
  • FPU indicates that the instruction is a floating-point one, and will only run on machines with a coprocessor (automatically including 486DX, Pentium and above).
  • KATMAI indicates that the instruction was introduced as part of the Katmai New Instruction set. These instructions are available on the Pentium III and later processors. Those which are not specifically SSE instructions are also available on the AMD Athlon.
  • MMX indicates that the instruction is an MMX one, and will run on MMX-capable Pentium processors and the Pentium II.
  • PRIV indicates that the instruction is a protected-mode management instruction. Many of these may only be used in protected mode, or only at privilege level zero.
  • SSE and SSE2 indicate that the instruction is a Streaming SIMD Extension instruction. These instructions operate on multiple values in a single operation. SSE was introduced with the Pentium III and SSE2 was introduced with the Pentium 4.
  • UNDOC indicates that the instruction is an undocumented one, and not part of the official Intel Architecture; it may or may not be supported on any given machine.
  • WILLAMETTE indicates that the instruction was introduced as part of the new instruction set in the Pentium 4 and Intel Xeon processors. These instructions are also known as SSE2 instructions.

    B.4 AAA, AAS, AAM, AAD: ASCII Adjustments

    AAA                           ; 37                   [8086]
    

    AAS                           ; 3F                   [8086]
    

    AAD                           ; D5 0A                [8086] 
    AAD imm                       ; D5 ib                [8086]
    

    AAM                           ; D4 0A                [8086] 
    AAM imm                       ; D4 ib                [8086]
    

    These instructions are used in conjunction with the add, subtract, multiply and divide instructions to perform binary-coded decimal arithmetic in unpacked (one BCD digit per byte - easy to translate to and from ASCII, hence the instruction names) form. There are also packed BCD instructions DAA and DAS: see section B.60.

    B.5 ADC: Add with Carry

    ADC r/m8,reg8                 ; 10 /r                [8086] 
    ADC r/m16,reg16               ; o16 11 /r            [8086] 
    ADC r/m32,reg32               ; o32 11 /r            [386]
    

    ADC reg8,r/m8                 ; 12 /r                [8086] 
    ADC reg16,r/m16               ; o16 13 /r            [8086] 
    ADC reg32,r/m32               ; o32 13 /r            [386]
    

    ADC r/m8,imm8                 ; 80 /2 ib             [8086] 
    ADC r/m16,imm16               ; o16 81 /2 iw         [8086] 
    ADC r/m32,imm32               ; o32 81 /2 id         [386]
    

    ADC r/m16,imm8                ; o16 83 /2 ib         [8086] 
    ADC r/m32,imm8                ; o32 83 /2 ib         [386]
    

    ADC AL,imm8                   ; 14 ib                [8086] 
    ADC AX,imm16                  ; o16 15 iw            [8086] 
    ADC EAX,imm32                 ; o32 15 id            [386]
    

    ADC performs integer addition: it adds its two operands together, plus the value of the carry flag, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    To add two numbers without also adding the contents of the carry flag, use ADD (section B.6).

    B.6 ADD: Add Integers

    ADD r/m8,reg8                 ; 00 /r                [8086] 
    ADD r/m16,reg16               ; o16 01 /r            [8086] 
    ADD r/m32,reg32               ; o32 01 /r            [386]
    

    ADD reg8,r/m8                 ; 02 /r                [8086] 
    ADD reg16,r/m16               ; o16 03 /r            [8086] 
    ADD reg32,r/m32               ; o32 03 /r            [386]
    

    ADD r/m8,imm8                 ; 80 /0 ib             [8086] 
    ADD r/m16,imm16               ; o16 81 /0 iw         [8086] 
    ADD r/m32,imm32               ; o32 81 /0 id         [386]
    

    ADD r/m16,imm8                ; o16 83 /0 ib         [8086] 
    ADD r/m32,imm8                ; o32 83 /0 ib         [386]
    

    ADD AL,imm8                   ; 04 ib                [8086] 
    ADD AX,imm16                  ; o16 05 iw            [8086] 
    ADD EAX,imm32                 ; o32 05 id            [386]
    

    ADD performs integer addition: it adds its two operands together, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    B.7 ADDPD: ADD Packed Double-Precision FP Values

    ADDPD xmm1,xmm2/mem128        ; 66 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDPD performs addition on each of two packed double-precision FP value pairs.

       dst[0-63]   := dst[0-63]   + src[0-63], 
       dst[64-127] := dst[64-127] + src[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.8 ADDPS: ADD Packed Single-Precision FP Values

    ADDPS xmm1,xmm2/mem128        ; 0F 58 /r        [KATMAI,SSE]
    

    ADDPS performs addition on each of four packed single-precision FP value pairs

       dst[0-31]   := dst[0-31]   + src[0-31], 
       dst[32-63]  := dst[32-63]  + src[32-63], 
       dst[64-95]  := dst[64-95]  + src[64-95], 
       dst[96-127] := dst[96-127] + src[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.9 ADDSD: ADD Scalar Double-Precision FP Values

    ADDSD xmm1,xmm2/mem64         ; F2 0F 58 /r     [KATMAI,SSE]
    

    ADDSD adds the low double-precision FP values from the source and destination operands and stores the double-precision FP result in the destination operand.

       dst[0-63]   := dst[0-63] + src[0-63], 
       dst[64-127) remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 64-bit memory location.

    B.10 ADDSS: ADD Scalar Single-Precision FP Values

    ADDSS xmm1,xmm2/mem32         ; F3 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDSD adds the low single-precision FP values from the source and destination operands and stores the single-precision FP result in the destination operand.

       dst[0-31]   := dst[0-31] + src[0-31], 
       dst[32-127] remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 32-bit memory location.

    B.11 AND: Bitwise AND

    AND r/m8,reg8                 ; 20 /r                [8086] 
    AND r/m16,reg16               ; o16 21 /r            [8086] 
    AND r/m32,reg32               ; o32 21 /r            [386]
    

    AND reg8,r/m8                 ; 22 /r                [8086] 
    AND reg16,r/m16               ; o16 23 /r            [8086] 
    AND reg32,r/m32               ; o32 23 /r            [386]
    

    AND r/m8,imm8                 ; 80 /4 ib             [8086] 
    AND r/m16,imm16               ; o16 81 /4 iw         [8086] 
    AND r/m32,imm32               ; o32 81 /4 id         [386]
    

    AND r/m16,imm8                ; o16 83 /4 ib         [8086] 
    AND r/m32,imm8                ; o32 83 /4 ib         [386]
    

    AND AL,imm8                   ; 24 ib                [8086] 
    AND AX,imm16                  ; o16 25 iw            [8086] 
    AND EAX,imm32                 ; o32 25 id            [386]
    

    AND performs a bitwise AND operation between its two operands (i.e. each bit of the result is 1 if and only if the corresponding bits of the two inputs were both 1), and stores the result in the destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    The MMX instruction PAND (see section B.205) performs the same operation on the 64-bit MMX registers.

    B.12 ANDNPD: Bitwise Logical AND NOT of Packed Double-Precision FP Values

    ANDNPD xmm1,xmm2/mem128       ; 66 0F 55 /r     [WILLAMETTE,SSE2]
    

    ANDNPD inverts the bits of the two double-precision floating-point values in the destination register, and then performs a logical AND between the two double-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-63]   := src[0-63]   AND NOT dst[0-63], 
       dst[64-127] := src[64-127] AND NOT dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.13 ANDNPS: Bitwise Logical AND NOT of Packed Single-Precision FP Values

    ANDNPS xmm1,xmm2/mem128       ; 0F 55 /r        [KATMAI,SSE]
    

    ANDNPS inverts the bits of the four single-precision floating-point values in the destination register, and then performs a logical AND between the four single-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-31]   := src[0-31]   AND NOT dst[0-31], 
       dst[32-63]  := src[32-63]  AND NOT dst[32-63], 
       dst[64-95]  := src[64-95]  AND NOT dst[64-95], 
       dst[96-127] := src[96-127] AND NOT dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.14 ANDPD: Bitwise Logical AND For Single FP

    ANDPD xmm1,xmm2/mem128        ; 66 0F 54 /r     [WILLAMETTE,SSE2]
    

    ANDPD performs a bitwise logical AND of the two double-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-63]   := src[0-63]   AND dst[0-63], 
       dst[64-127] := src[64-127] AND dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.15 ANDPS: Bitwise Logical AND For Single FP

    ANDPS xmm1,xmm2/mem128        ; 0F 54 /r        [KATMAI,SSE]
    

    ANDPS performs a bitwise logical AND of the four single-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-31]   := src[0-31]   AND dst[0-31], 
       dst[32-63]  := src[32-63]  AND dst[32-63], 
       dst[64-95]  := src[64-95]  AND dst[64-95], 
       dst[96-127] := src[96-127] AND dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.16 ARPL: Adjust RPL Field of Selector

    ARPL r/m16,reg16              ; 63 /r                [286,PRIV]
    

    ARPL expects its two word operands to be segment selectors. It adjusts the RPL (reque documented as such.

  • CYRIX indicates that the instruction is specific to Cyrix processors, for example the extra MMX instructions in the Cyrix extended MMX instruction set.
  • FPU indicates that the instruction is a floating-point one, and will only run on machines with a coprocessor (automatically including 486DX, Pentium and above).
  • KATMAI indicates that the instruction was introduced as part of the Katmai New Instruction set. These instructions are available on the Pentium III and later processors. Those which are not specifically SSE instructions are also available on the AMD Athlon.
  • MMX indicates that the instruction is an MMX one, and will run on MMX-capable Pentium processors and the Pentium II.
  • PRIV indicates that the instruction is a protected-mode management instruction. Many of these may only be used in protected mode, or only at privilege level zero.
  • SSE and SSE2 indicate that the instruction is a Streaming SIMD Extension instruction. These instructions operate on multiple values in a single operation. SSE was introduced with the Pentium III and SSE2 was introduced with the Pentium 4.
  • UNDOC indicates that the instruction is an undocumented one, and not part of the official Intel Architecture; it may or may not be supported on any given machine.
  • WILLAMETTE indicates that the instruction was introduced as part of the new instruction set in the Pentium 4 and Intel Xeon processors. These instructions are also known as SSE2 instructions.

    B.4 AAA, AAS, AAM, AAD: ASCII Adjustments

    AAA                           ; 37                   [8086]
    

    AAS                           ; 3F                   [8086]
    

    AAD                           ; D5 0A                [8086] 
    AAD imm                       ; D5 ib                [8086]
    

    AAM                           ; D4 0A                [8086] 
    AAM imm                       ; D4 ib                [8086]
    

    These instructions are used in conjunction with the add, subtract, multiply and divide instructions to perform binary-coded decimal arithmetic in unpacked (one BCD digit per byte - easy to translate to and from ASCII, hence the instruction names) form. There are also packed BCD instructions DAA and DAS: see section B.60.

    B.5 ADC: Add with Carry

    ADC r/m8,reg8                 ; 10 /r                [8086] 
    ADC r/m16,reg16               ; o16 11 /r            [8086] 
    ADC r/m32,reg32               ; o32 11 /r            [386]
    

    ADC reg8,r/m8                 ; 12 /r                [8086] 
    ADC reg16,r/m16               ; o16 13 /r            [8086] 
    ADC reg32,r/m32               ; o32 13 /r            [386]
    

    ADC r/m8,imm8                 ; 80 /2 ib             [8086] 
    ADC r/m16,imm16               ; o16 81 /2 iw         [8086] 
    ADC r/m32,imm32               ; o32 81 /2 id         [386]
    

    ADC r/m16,imm8                ; o16 83 /2 ib         [8086] 
    ADC r/m32,imm8                ; o32 83 /2 ib         [386]
    

    ADC AL,imm8                   ; 14 ib                [8086] 
    ADC AX,imm16                  ; o16 15 iw            [8086] 
    ADC EAX,imm32                 ; o32 15 id            [386]
    

    ADC performs integer addition: it adds its two operands together, plus the value of the carry flag, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    To add two numbers without also adding the contents of the carry flag, use ADD (section B.6).

    B.6 ADD: Add Integers

    ADD r/m8,reg8                 ; 00 /r                [8086] 
    ADD r/m16,reg16               ; o16 01 /r            [8086] 
    ADD r/m32,reg32               ; o32 01 /r            [386]
    

    ADD reg8,r/m8                 ; 02 /r                [8086] 
    ADD reg16,r/m16               ; o16 03 /r            [8086] 
    ADD reg32,r/m32               ; o32 03 /r            [386]
    

    ADD r/m8,imm8                 ; 80 /0 ib             [8086] 
    ADD r/m16,imm16               ; o16 81 /0 iw         [8086] 
    ADD r/m32,imm32               ; o32 81 /0 id         [386]
    

    ADD r/m16,imm8                ; o16 83 /0 ib         [8086] 
    ADD r/m32,imm8                ; o32 83 /0 ib         [386]
    

    ADD AL,imm8                   ; 04 ib                [8086] 
    ADD AX,imm16                  ; o16 05 iw            [8086] 
    ADD EAX,imm32                 ; o32 05 id            [386]
    

    ADD performs integer addition: it adds its two operands together, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    B.7 ADDPD: ADD Packed Double-Precision FP Values

    ADDPD xmm1,xmm2/mem128        ; 66 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDPD performs addition on each of two packed double-precision FP value pairs.

       dst[0-63]   := dst[0-63]   + src[0-63], 
       dst[64-127] := dst[64-127] + src[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.8 ADDPS: ADD Packed Single-Precision FP Values

    ADDPS xmm1,xmm2/mem128        ; 0F 58 /r        [KATMAI,SSE]
    

    ADDPS performs addition on each of four packed single-precision FP value pairs

       dst[0-31]   := dst[0-31]   + src[0-31], 
       dst[32-63]  := dst[32-63]  + src[32-63], 
       dst[64-95]  := dst[64-95]  + src[64-95], 
       dst[96-127] := dst[96-127] + src[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.9 ADDSD: ADD Scalar Double-Precision FP Values

    ADDSD xmm1,xmm2/mem64         ; F2 0F 58 /r     [KATMAI,SSE]
    

    ADDSD adds the low double-precision FP values from the source and destination operands and stores the double-precision FP result in the destination operand.

       dst[0-63]   := dst[0-63] + src[0-63], 
       dst[64-127) remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 64-bit memory location.

    B.10 ADDSS: ADD Scalar Single-Precision FP Values

    ADDSS xmm1,xmm2/mem32         ; F3 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDSD adds the low single-precision FP values from the source and destination operands and stores the single-precision FP result in the destination operand.

       dst[0-31]   := dst[0-31] + src[0-31], 
       dst[32-127] remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 32-bit memory location.

    B.11 AND: Bitwise AND

    AND r/m8,reg8                 ; 20 /r                [8086] 
    AND r/m16,reg16               ; o16 21 /r            [8086] 
    AND r/m32,reg32               ; o32 21 /r            [386]
    

    AND reg8,r/m8                 ; 22 /r                [8086] 
    AND reg16,r/m16               ; o16 23 /r            [8086] 
    AND reg32,r/m32               ; o32 23 /r            [386]
    

    AND r/m8,imm8                 ; 80 /4 ib             [8086] 
    AND r/m16,imm16               ; o16 81 /4 iw         [8086] 
    AND r/m32,imm32               ; o32 81 /4 id         [386]
    

    AND r/m16,imm8                ; o16 83 /4 ib         [8086] 
    AND r/m32,imm8                ; o32 83 /4 ib         [386]
    

    AND AL,imm8                   ; 24 ib                [8086] 
    AND AX,imm16                  ; o16 25 iw            [8086] 
    AND EAX,imm32                 ; o32 25 id            [386]
    

    AND performs a bitwise AND operation between its two operands (i.e. each bit of the result is 1 if and only if the corresponding bits of the two inputs were both 1), and stores the result in the destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    The MMX instruction PAND (see section B.205) performs the same operation on the 64-bit MMX registers.

    B.12 ANDNPD: Bitwise Logical AND NOT of Packed Double-Precision FP Values

    ANDNPD xmm1,xmm2/mem128       ; 66 0F 55 /r     [WILLAMETTE,SSE2]
    

    ANDNPD inverts the bits of the two double-precision floating-point values in the destination register, and then performs a logical AND between the two double-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-63]   := src[0-63]   AND NOT dst[0-63], 
       dst[64-127] := src[64-127] AND NOT dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.13 ANDNPS: Bitwise Logical AND NOT of Packed Single-Precision FP Values

    ANDNPS xmm1,xmm2/mem128       ; 0F 55 /r        [KATMAI,SSE]
    

    ANDNPS inverts the bits of the four single-precision floating-point values in the destination register, and then performs a logical AND between the four single-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-31]   := src[0-31]   AND NOT dst[0-31], 
       dst[32-63]  := src[32-63]  AND NOT dst[32-63], 
       dst[64-95]  := src[64-95]  AND NOT dst[64-95], 
       dst[96-127] := src[96-127] AND NOT dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.14 ANDPD: Bitwise Logical AND For Single FP

    ANDPD xmm1,xmm2/mem128        ; 66 0F 54 /r     [WILLAMETTE,SSE2]
    

    ANDPD performs a bitwise logical AND of the two double-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-63]   := src[0-63]   AND dst[0-63], 
       dst[64-127] := src[64-127] AND dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.15 ANDPS: Bitwise Logical AND For Single FP

    ANDPS xmm1,xmm2/mem128        ; 0F 54 /r        [KATMAI,SSE]
    

    ANDPS performs a bitwise logical AND of the four single-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-31]   := src[0-31]   AND dst[0-31], 
       dst[32-63]  := src[32-63]  AND dst[32-63], 
       dst[64-95]  := src[64-95]  AND dst[64-95], 
       dst[96-127] := src[96-127] AND dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.16 ARPL: Adjust RPL Field of Selector

    ARPL r/m16,reg16              ; 63 /r                [286,PRIV]
    

    ARPL expects its two word operands to be segment selectors. It adjusts the RPL (reque documented as such.

  • CYRIX indicates that the instruction is specific to Cyrix processors, for example the extra MMX instructions in the Cyrix extended MMX instruction set.
  • FPU indicates that the instruction is a floating-point one, and will only run on machines with a coprocessor (automatically including 486DX, Pentium and above).
  • KATMAI indicates that the instruction was introduced as part of the Katmai New Instruction set. These instructions are available on the Pentium III and later processors. Those which are not specifically SSE instructions are also available on the AMD Athlon.
  • MMX indicates that the instruction is an MMX one, and will run on MMX-capable Pentium processors and the Pentium II.
  • PRIV indicates that the instruction is a protected-mode management instruction. Many of these may only be used in protected mode, or only at privilege level zero.
  • SSE and SSE2 indicate that the instruction is a Streaming SIMD Extension instruction. These instructions operate on multiple values in a single operation. SSE was introduced with the Pentium III and SSE2 was introduced with the Pentium 4.
  • UNDOC indicates that the instruction is an undocumented one, and not part of the official Intel Architecture; it may or may not be supported on any given machine.
  • WILLAMETTE indicates that the instruction was introduced as part of the new instruction set in the Pentium 4 and Intel Xeon processors. These instructions are also known as SSE2 instructions.

    B.4 AAA, AAS, AAM, AAD: ASCII Adjustments

    AAA                           ; 37                   [8086]
    

    AAS                           ; 3F                   [8086]
    

    AAD                           ; D5 0A                [8086] 
    AAD imm                       ; D5 ib                [8086]
    

    AAM                           ; D4 0A                [8086] 
    AAM imm                       ; D4 ib                [8086]
    

    These instructions are used in conjunction with the add, subtract, multiply and divide instructions to perform binary-coded decimal arithmetic in unpacked (one BCD digit per byte - easy to translate to and from ASCII, hence the instruction names) form. There are also packed BCD instructions DAA and DAS: see section B.60.

    B.5 ADC: Add with Carry

    ADC r/m8,reg8                 ; 10 /r                [8086] 
    ADC r/m16,reg16               ; o16 11 /r            [8086] 
    ADC r/m32,reg32               ; o32 11 /r            [386]
    

    ADC reg8,r/m8                 ; 12 /r                [8086] 
    ADC reg16,r/m16               ; o16 13 /r            [8086] 
    ADC reg32,r/m32               ; o32 13 /r            [386]
    

    ADC r/m8,imm8                 ; 80 /2 ib             [8086] 
    ADC r/m16,imm16               ; o16 81 /2 iw         [8086] 
    ADC r/m32,imm32               ; o32 81 /2 id         [386]
    

    ADC r/m16,imm8                ; o16 83 /2 ib         [8086] 
    ADC r/m32,imm8                ; o32 83 /2 ib         [386]
    

    ADC AL,imm8                   ; 14 ib                [8086] 
    ADC AX,imm16                  ; o16 15 iw            [8086] 
    ADC EAX,imm32                 ; o32 15 id            [386]
    

    ADC performs integer addition: it adds its two operands together, plus the value of the carry flag, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    To add two numbers without also adding the contents of the carry flag, use ADD (section B.6).

    B.6 ADD: Add Integers

    ADD r/m8,reg8                 ; 00 /r                [8086] 
    ADD r/m16,reg16               ; o16 01 /r            [8086] 
    ADD r/m32,reg32               ; o32 01 /r            [386]
    

    ADD reg8,r/m8                 ; 02 /r                [8086] 
    ADD reg16,r/m16               ; o16 03 /r            [8086] 
    ADD reg32,r/m32               ; o32 03 /r            [386]
    

    ADD r/m8,imm8                 ; 80 /0 ib             [8086] 
    ADD r/m16,imm16               ; o16 81 /0 iw         [8086] 
    ADD r/m32,imm32               ; o32 81 /0 id         [386]
    

    ADD r/m16,imm8                ; o16 83 /0 ib         [8086] 
    ADD r/m32,imm8                ; o32 83 /0 ib         [386]
    

    ADD AL,imm8                   ; 04 ib                [8086] 
    ADD AX,imm16                  ; o16 05 iw            [8086] 
    ADD EAX,imm32                 ; o32 05 id            [386]
    

    ADD performs integer addition: it adds its two operands together, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    B.7 ADDPD: ADD Packed Double-Precision FP Values

    ADDPD xmm1,xmm2/mem128        ; 66 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDPD performs addition on each of two packed double-precision FP value pairs.

       dst[0-63]   := dst[0-63]   + src[0-63], 
       dst[64-127] := dst[64-127] + src[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.8 ADDPS: ADD Packed Single-Precision FP Values

    ADDPS xmm1,xmm2/mem128        ; 0F 58 /r        [KATMAI,SSE]
    

    ADDPS performs addition on each of four packed single-precision FP value pairs

       dst[0-31]   := dst[0-31]   + src[0-31], 
       dst[32-63]  := dst[32-63]  + src[32-63], 
       dst[64-95]  := dst[64-95]  + src[64-95], 
       dst[96-127] := dst[96-127] + src[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.9 ADDSD: ADD Scalar Double-Precision FP Values

    ADDSD xmm1,xmm2/mem64         ; F2 0F 58 /r     [KATMAI,SSE]
    

    ADDSD adds the low double-precision FP values from the source and destination operands and stores the double-precision FP result in the destination operand.

       dst[0-63]   := dst[0-63] + src[0-63], 
       dst[64-127) remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 64-bit memory location.

    B.10 ADDSS: ADD Scalar Single-Precision FP Values

    ADDSS xmm1,xmm2/mem32         ; F3 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDSD adds the low single-precision FP values from the source and destination operands and stores the single-precision FP result in the destination operand.

       dst[0-31]   := dst[0-31] + src[0-31], 
       dst[32-127] remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 32-bit memory location.

    B.11 AND: Bitwise AND

    AND r/m8,reg8                 ; 20 /r                [8086] 
    AND r/m16,reg16               ; o16 21 /r            [8086] 
    AND r/m32,reg32               ; o32 21 /r            [386]
    

    AND reg8,r/m8                 ; 22 /r                [8086] 
    AND reg16,r/m16               ; o16 23 /r            [8086] 
    AND reg32,r/m32               ; o32 23 /r            [386]
    

    AND r/m8,imm8                 ; 80 /4 ib             [8086] 
    AND r/m16,imm16               ; o16 81 /4 iw         [8086] 
    AND r/m32,imm32               ; o32 81 /4 id         [386]
    

    AND r/m16,imm8                ; o16 83 /4 ib         [8086] 
    AND r/m32,imm8                ; o32 83 /4 ib         [386]
    

    AND AL,imm8                   ; 24 ib                [8086] 
    AND AX,imm16                  ; o16 25 iw            [8086] 
    AND EAX,imm32                 ; o32 25 id            [386]
    

    AND performs a bitwise AND operation between its two operands (i.e. each bit of the result is 1 if and only if the corresponding bits of the two inputs were both 1), and stores the result in the destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    The MMX instruction PAND (see section B.205) performs the same operation on the 64-bit MMX registers.

    B.12 ANDNPD: Bitwise Logical AND NOT of Packed Double-Precision FP Values

    ANDNPD xmm1,xmm2/mem128       ; 66 0F 55 /r     [WILLAMETTE,SSE2]
    

    ANDNPD inverts the bits of the two double-precision floating-point values in the destination register, and then performs a logical AND between the two double-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-63]   := src[0-63]   AND NOT dst[0-63], 
       dst[64-127] := src[64-127] AND NOT dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.13 ANDNPS: Bitwise Logical AND NOT of Packed Single-Precision FP Values

    ANDNPS xmm1,xmm2/mem128       ; 0F 55 /r        [KATMAI,SSE]
    

    ANDNPS inverts the bits of the four single-precision floating-point values in the destination register, and then performs a logical AND between the four single-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-31]   := src[0-31]   AND NOT dst[0-31], 
       dst[32-63]  := src[32-63]  AND NOT dst[32-63], 
       dst[64-95]  := src[64-95]  AND NOT dst[64-95], 
       dst[96-127] := src[96-127] AND NOT dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.14 ANDPD: Bitwise Logical AND For Single FP

    ANDPD xmm1,xmm2/mem128        ; 66 0F 54 /r     [WILLAMETTE,SSE2]
    

    ANDPD performs a bitwise logical AND of the two double-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-63]   := src[0-63]   AND dst[0-63], 
       dst[64-127] := src[64-127] AND dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.15 ANDPS: Bitwise Logical AND For Single FP

    ANDPS xmm1,xmm2/mem128        ; 0F 54 /r        [KATMAI,SSE]
    

    ANDPS performs a bitwise logical AND of the four single-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-31]   := src[0-31]   AND dst[0-31], 
       dst[32-63]  := src[32-63]  AND dst[32-63], 
       dst[64-95]  := src[64-95]  AND dst[64-95], 
       dst[96-127] := src[96-127] AND dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.16 ARPL: Adjust RPL Field of Selector

    ARPL r/m16,reg16              ; 63 /r                [286,PRIV]
    

    ARPL expects its two word operands to be segment selectors. It adjusts the RPL (reque documented as such.

  • CYRIX indicates that the instruction is specific to Cyrix processors, for example the extra MMX instructions in the Cyrix extended MMX instruction set.
  • FPU indicates that the instruction is a floating-point one, and will only run on machines with a coprocessor (automatically including 486DX, Pentium and above).
  • KATMAI indicates that the instruction was introduced as part of the Katmai New Instruction set. These instructions are available on the Pentium III and later processors. Those which are not specifically SSE instructions are also available on the AMD Athlon.
  • MMX indicates that the instruction is an MMX one, and will run on MMX-capable Pentium processors and the Pentium II.
  • PRIV indicates that the instruction is a protected-mode management instruction. Many of these may only be used in protected mode, or only at privilege level zero.
  • SSE and SSE2 indicate that the instruction is a Streaming SIMD Extension instruction. These instructions operate on multiple values in a single operation. SSE was introduced with the Pentium III and SSE2 was introduced with the Pentium 4.
  • UNDOC indicates that the instruction is an undocumented one, and not part of the official Intel Architecture; it may or may not be supported on any given machine.
  • WILLAMETTE indicates that the instruction was introduced as part of the new instruction set in the Pentium 4 and Intel Xeon processors. These instructions are also known as SSE2 instructions.

    B.4 AAA, AAS, AAM, AAD: ASCII Adjustments

    AAA                           ; 37                   [8086]
    

    AAS                           ; 3F                   [8086]
    

    AAD                           ; D5 0A                [8086] 
    AAD imm                       ; D5 ib                [8086]
    

    AAM                           ; D4 0A                [8086] 
    AAM imm                       ; D4 ib                [8086]
    

    These instructions are used in conjunction with the add, subtract, multiply and divide instructions to perform binary-coded decimal arithmetic in unpacked (one BCD digit per byte - easy to translate to and from ASCII, hence the instruction names) form. There are also packed BCD instructions DAA and DAS: see section B.60.

    B.5 ADC: Add with Carry

    ADC r/m8,reg8                 ; 10 /r                [8086] 
    ADC r/m16,reg16               ; o16 11 /r            [8086] 
    ADC r/m32,reg32               ; o32 11 /r            [386]
    

    ADC reg8,r/m8                 ; 12 /r                [8086] 
    ADC reg16,r/m16               ; o16 13 /r            [8086] 
    ADC reg32,r/m32               ; o32 13 /r            [386]
    

    ADC r/m8,imm8                 ; 80 /2 ib             [8086] 
    ADC r/m16,imm16               ; o16 81 /2 iw         [8086] 
    ADC r/m32,imm32               ; o32 81 /2 id         [386]
    

    ADC r/m16,imm8                ; o16 83 /2 ib         [8086] 
    ADC r/m32,imm8                ; o32 83 /2 ib         [386]
    

    ADC AL,imm8                   ; 14 ib                [8086] 
    ADC AX,imm16                  ; o16 15 iw            [8086] 
    ADC EAX,imm32                 ; o32 15 id            [386]
    

    ADC performs integer addition: it adds its two operands together, plus the value of the carry flag, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    To add two numbers without also adding the contents of the carry flag, use ADD (section B.6).

    B.6 ADD: Add Integers

    ADD r/m8,reg8                 ; 00 /r                [8086] 
    ADD r/m16,reg16               ; o16 01 /r            [8086] 
    ADD r/m32,reg32               ; o32 01 /r            [386]
    

    ADD reg8,r/m8                 ; 02 /r                [8086] 
    ADD reg16,r/m16               ; o16 03 /r            [8086] 
    ADD reg32,r/m32               ; o32 03 /r            [386]
    

    ADD r/m8,imm8                 ; 80 /0 ib             [8086] 
    ADD r/m16,imm16               ; o16 81 /0 iw         [8086] 
    ADD r/m32,imm32               ; o32 81 /0 id         [386]
    

    ADD r/m16,imm8                ; o16 83 /0 ib         [8086] 
    ADD r/m32,imm8                ; o32 83 /0 ib         [386]
    

    ADD AL,imm8                   ; 04 ib                [8086] 
    ADD AX,imm16                  ; o16 05 iw            [8086] 
    ADD EAX,imm32                 ; o32 05 id            [386]
    

    ADD performs integer addition: it adds its two operands together, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    B.7 ADDPD: ADD Packed Double-Precision FP Values

    ADDPD xmm1,xmm2/mem128        ; 66 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDPD performs addition on each of two packed double-precision FP value pairs.

       dst[0-63]   := dst[0-63]   + src[0-63], 
       dst[64-127] := dst[64-127] + src[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.8 ADDPS: ADD Packed Single-Precision FP Values

    ADDPS xmm1,xmm2/mem128        ; 0F 58 /r        [KATMAI,SSE]
    

    ADDPS performs addition on each of four packed single-precision FP value pairs

       dst[0-31]   := dst[0-31]   + src[0-31], 
       dst[32-63]  := dst[32-63]  + src[32-63], 
       dst[64-95]  := dst[64-95]  + src[64-95], 
       dst[96-127] := dst[96-127] + src[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.9 ADDSD: ADD Scalar Double-Precision FP Values

    ADDSD xmm1,xmm2/mem64         ; F2 0F 58 /r     [KATMAI,SSE]
    

    ADDSD adds the low double-precision FP values from the source and destination operands and stores the double-precision FP result in the destination operand.

       dst[0-63]   := dst[0-63] + src[0-63], 
       dst[64-127) remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 64-bit memory location.

    B.10 ADDSS: ADD Scalar Single-Precision FP Values

    ADDSS xmm1,xmm2/mem32         ; F3 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDSD adds the low single-precision FP values from the source and destination operands and stores the single-precision FP result in the destination operand.

       dst[0-31]   := dst[0-31] + src[0-31], 
       dst[32-127] remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 32-bit memory location.

    B.11 AND: Bitwise AND

    AND r/m8,reg8                 ; 20 /r                [8086] 
    AND r/m16,reg16               ; o16 21 /r            [8086] 
    AND r/m32,reg32               ; o32 21 /r            [386]
    

    AND reg8,r/m8                 ; 22 /r                [8086] 
    AND reg16,r/m16               ; o16 23 /r            [8086] 
    AND reg32,r/m32               ; o32 23 /r            [386]
    

    AND r/m8,imm8                 ; 80 /4 ib             [8086] 
    AND r/m16,imm16               ; o16 81 /4 iw         [8086] 
    AND r/m32,imm32               ; o32 81 /4 id         [386]
    

    AND r/m16,imm8                ; o16 83 /4 ib         [8086] 
    AND r/m32,imm8                ; o32 83 /4 ib         [386]
    

    AND AL,imm8                   ; 24 ib                [8086] 
    AND AX,imm16                  ; o16 25 iw            [8086] 
    AND EAX,imm32                 ; o32 25 id            [386]
    

    AND performs a bitwise AND operation between its two operands (i.e. each bit of the result is 1 if and only if the corresponding bits of the two inputs were both 1), and stores the result in the destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    The MMX instruction PAND (see section B.205) performs the same operation on the 64-bit MMX registers.

    B.12 ANDNPD: Bitwise Logical AND NOT of Packed Double-Precision FP Values

    ANDNPD xmm1,xmm2/mem128       ; 66 0F 55 /r     [WILLAMETTE,SSE2]
    

    ANDNPD inverts the bits of the two double-precision floating-point values in the destination register, and then performs a logical AND between the two double-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-63]   := src[0-63]   AND NOT dst[0-63], 
       dst[64-127] := src[64-127] AND NOT dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.13 ANDNPS: Bitwise Logical AND NOT of Packed Single-Precision FP Values

    ANDNPS xmm1,xmm2/mem128       ; 0F 55 /r        [KATMAI,SSE]
    

    ANDNPS inverts the bits of the four single-precision floating-point values in the destination register, and then performs a logical AND between the four single-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-31]   := src[0-31]   AND NOT dst[0-31], 
       dst[32-63]  := src[32-63]  AND NOT dst[32-63], 
       dst[64-95]  := src[64-95]  AND NOT dst[64-95], 
       dst[96-127] := src[96-127] AND NOT dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.14 ANDPD: Bitwise Logical AND For Single FP

    ANDPD xmm1,xmm2/mem128        ; 66 0F 54 /r     [WILLAMETTE,SSE2]
    

    ANDPD performs a bitwise logical AND of the two double-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-63]   := src[0-63]   AND dst[0-63], 
       dst[64-127] := src[64-127] AND dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.15 ANDPS: Bitwise Logical AND For Single FP

    ANDPS xmm1,xmm2/mem128        ; 0F 54 /r        [KATMAI,SSE]
    

    ANDPS performs a bitwise logical AND of the four single-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-31]   := src[0-31]   AND dst[0-31], 
       dst[32-63]  := src[32-63]  AND dst[32-63], 
       dst[64-95]  := src[64-95]  AND dst[64-95], 
       dst[96-127] := src[96-127] AND dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.16 ARPL: Adjust RPL Field of Selector

    ARPL r/m16,reg16              ; 63 /r                [286,PRIV]
    

    ARPL expects its two word operands to be segment selectors. It adjusts the RPL (reque documented as such.

  • CYRIX indicates that the instruction is specific to Cyrix processors, for example the extra MMX instructions in the Cyrix extended MMX instruction set.
  • FPU indicates that the instruction is a floating-point one, and will only run on machines with a coprocessor (automatically including 486DX, Pentium and above).
  • KATMAI indicates that the instruction was introduced as part of the Katmai New Instruction set. These instructions are available on the Pentium III and later processors. Those which are not specifically SSE instructions are also available on the AMD Athlon.
  • MMX indicates that the instruction is an MMX one, and will run on MMX-capable Pentium processors and the Pentium II.
  • PRIV indicates that the instruction is a protected-mode management instruction. Many of these may only be used in protected mode, or only at privilege level zero.
  • SSE and SSE2 indicate that the instruction is a Streaming SIMD Extension instruction. These instructions operate on multiple values in a single operation. SSE was introduced with the Pentium III and SSE2 was introduced with the Pentium 4.
  • UNDOC indicates that the instruction is an undocumented one, and not part of the official Intel Architecture; it may or may not be supported on any given machine.
  • WILLAMETTE indicates that the instruction was introduced as part of the new instruction set in the Pentium 4 and Intel Xeon processors. These instructions are also known as SSE2 instructions.

    B.4 AAA, AAS, AAM, AAD: ASCII Adjustments

    AAA                           ; 37                   [8086]
    

    AAS                           ; 3F                   [8086]
    

    AAD                           ; D5 0A                [8086] 
    AAD imm                       ; D5 ib                [8086]
    

    AAM                           ; D4 0A                [8086] 
    AAM imm                       ; D4 ib                [8086]
    

    These instructions are used in conjunction with the add, subtract, multiply and divide instructions to perform binary-coded decimal arithmetic in unpacked (one BCD digit per byte - easy to translate to and from ASCII, hence the instruction names) form. There are also packed BCD instructions DAA and DAS: see section B.60.

    B.5 ADC: Add with Carry

    ADC r/m8,reg8                 ; 10 /r                [8086] 
    ADC r/m16,reg16               ; o16 11 /r            [8086] 
    ADC r/m32,reg32               ; o32 11 /r            [386]
    

    ADC reg8,r/m8                 ; 12 /r                [8086] 
    ADC reg16,r/m16               ; o16 13 /r            [8086] 
    ADC reg32,r/m32               ; o32 13 /r            [386]
    

    ADC r/m8,imm8                 ; 80 /2 ib             [8086] 
    ADC r/m16,imm16               ; o16 81 /2 iw         [8086] 
    ADC r/m32,imm32               ; o32 81 /2 id         [386]
    

    ADC r/m16,imm8                ; o16 83 /2 ib         [8086] 
    ADC r/m32,imm8                ; o32 83 /2 ib         [386]
    

    ADC AL,imm8                   ; 14 ib                [8086] 
    ADC AX,imm16                  ; o16 15 iw            [8086] 
    ADC EAX,imm32                 ; o32 15 id            [386]
    

    ADC performs integer addition: it adds its two operands together, plus the value of the carry flag, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    To add two numbers without also adding the contents of the carry flag, use ADD (section B.6).

    B.6 ADD: Add Integers

    ADD r/m8,reg8                 ; 00 /r                [8086] 
    ADD r/m16,reg16               ; o16 01 /r            [8086] 
    ADD r/m32,reg32               ; o32 01 /r            [386]
    

    ADD reg8,r/m8                 ; 02 /r                [8086] 
    ADD reg16,r/m16               ; o16 03 /r            [8086] 
    ADD reg32,r/m32               ; o32 03 /r            [386]
    

    ADD r/m8,imm8                 ; 80 /0 ib             [8086] 
    ADD r/m16,imm16               ; o16 81 /0 iw         [8086] 
    ADD r/m32,imm32               ; o32 81 /0 id         [386]
    

    ADD r/m16,imm8                ; o16 83 /0 ib         [8086] 
    ADD r/m32,imm8                ; o32 83 /0 ib         [386]
    

    ADD AL,imm8                   ; 04 ib                [8086] 
    ADD AX,imm16                  ; o16 05 iw            [8086] 
    ADD EAX,imm32                 ; o32 05 id            [386]
    

    ADD performs integer addition: it adds its two operands together, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    B.7 ADDPD: ADD Packed Double-Precision FP Values

    ADDPD xmm1,xmm2/mem128        ; 66 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDPD performs addition on each of two packed double-precision FP value pairs.

       dst[0-63]   := dst[0-63]   + src[0-63], 
       dst[64-127] := dst[64-127] + src[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.8 ADDPS: ADD Packed Single-Precision FP Values

    ADDPS xmm1,xmm2/mem128        ; 0F 58 /r        [KATMAI,SSE]
    

    ADDPS performs addition on each of four packed single-precision FP value pairs

       dst[0-31]   := dst[0-31]   + src[0-31], 
       dst[32-63]  := dst[32-63]  + src[32-63], 
       dst[64-95]  := dst[64-95]  + src[64-95], 
       dst[96-127] := dst[96-127] + src[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.9 ADDSD: ADD Scalar Double-Precision FP Values

    ADDSD xmm1,xmm2/mem64         ; F2 0F 58 /r     [KATMAI,SSE]
    

    ADDSD adds the low double-precision FP values from the source and destination operands and stores the double-precision FP result in the destination operand.

       dst[0-63]   := dst[0-63] + src[0-63], 
       dst[64-127) remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 64-bit memory location.

    B.10 ADDSS: ADD Scalar Single-Precision FP Values

    ADDSS xmm1,xmm2/mem32         ; F3 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDSD adds the low single-precision FP values from the source and destination operands and stores the single-precision FP result in the destination operand.

       dst[0-31]   := dst[0-31] + src[0-31], 
       dst[32-127] remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 32-bit memory location.

    B.11 AND: Bitwise AND

    AND r/m8,reg8                 ; 20 /r                [8086] 
    AND r/m16,reg16               ; o16 21 /r            [8086] 
    AND r/m32,reg32               ; o32 21 /r            [386]
    

    AND reg8,r/m8                 ; 22 /r                [8086] 
    AND reg16,r/m16               ; o16 23 /r            [8086] 
    AND reg32,r/m32               ; o32 23 /r            [386]
    

    AND r/m8,imm8                 ; 80 /4 ib             [8086] 
    AND r/m16,imm16               ; o16 81 /4 iw         [8086] 
    AND r/m32,imm32               ; o32 81 /4 id         [386]
    

    AND r/m16,imm8                ; o16 83 /4 ib         [8086] 
    AND r/m32,imm8                ; o32 83 /4 ib         [386]
    

    AND AL,imm8                   ; 24 ib                [8086] 
    AND AX,imm16                  ; o16 25 iw            [8086] 
    AND EAX,imm32                 ; o32 25 id            [386]
    

    AND performs a bitwise AND operation between its two operands (i.e. each bit of the result is 1 if and only if the corresponding bits of the two inputs were both 1), and stores the result in the destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    The MMX instruction PAND (see section B.205) performs the same operation on the 64-bit MMX registers.

    B.12 ANDNPD: Bitwise Logical AND NOT of Packed Double-Precision FP Values

    ANDNPD xmm1,xmm2/mem128       ; 66 0F 55 /r     [WILLAMETTE,SSE2]
    

    ANDNPD inverts the bits of the two double-precision floating-point values in the destination register, and then performs a logical AND between the two double-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-63]   := src[0-63]   AND NOT dst[0-63], 
       dst[64-127] := src[64-127] AND NOT dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.13 ANDNPS: Bitwise Logical AND NOT of Packed Single-Precision FP Values

    ANDNPS xmm1,xmm2/mem128       ; 0F 55 /r        [KATMAI,SSE]
    

    ANDNPS inverts the bits of the four single-precision floating-point values in the destination register, and then performs a logical AND between the four single-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-31]   := src[0-31]   AND NOT dst[0-31], 
       dst[32-63]  := src[32-63]  AND NOT dst[32-63], 
       dst[64-95]  := src[64-95]  AND NOT dst[64-95], 
       dst[96-127] := src[96-127] AND NOT dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.14 ANDPD: Bitwise Logical AND For Single FP

    ANDPD xmm1,xmm2/mem128        ; 66 0F 54 /r     [WILLAMETTE,SSE2]
    

    ANDPD performs a bitwise logical AND of the two double-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-63]   := src[0-63]   AND dst[0-63], 
       dst[64-127] := src[64-127] AND dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.15 ANDPS: Bitwise Logical AND For Single FP

    ANDPS xmm1,xmm2/mem128        ; 0F 54 /r        [KATMAI,SSE]
    

    ANDPS performs a bitwise logical AND of the four single-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-31]   := src[0-31]   AND dst[0-31], 
       dst[32-63]  := src[32-63]  AND dst[32-63], 
       dst[64-95]  := src[64-95]  AND dst[64-95], 
       dst[96-127] := src[96-127] AND dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.16 ARPL: Adjust RPL Field of Selector

    ARPL r/m16,reg16              ; 63 /r                [286,PRIV]
    

    ARPL expects its two word operands to be segment selectors. It adjusts the RPL (reque documented as such.

  • CYRIX indicates that the instruction is specific to Cyrix processors, for example the extra MMX instructions in the Cyrix extended MMX instruction set.
  • FPU indicates that the instruction is a floating-point one, and will only run on machines with a coprocessor (automatically including 486DX, Pentium and above).
  • KATMAI indicates that the instruction was introduced as part of the Katmai New Instruction set. These instructions are available on the Pentium III and later processors. Those which are not specifically SSE instructions are also available on the AMD Athlon.
  • MMX indicates that the instruction is an MMX one, and will run on MMX-capable Pentium processors and the Pentium II.
  • PRIV indicates that the instruction is a protected-mode management instruction. Many of these may only be used in protected mode, or only at privilege level zero.
  • SSE and SSE2 indicate that the instruction is a Streaming SIMD Extension instruction. These instructions operate on multiple values in a single operation. SSE was introduced with the Pentium III and SSE2 was introduced with the Pentium 4.
  • UNDOC indicates that the instruction is an undocumented one, and not part of the official Intel Architecture; it may or may not be supported on any given machine.
  • WILLAMETTE indicates that the instruction was introduced as part of the new instruction set in the Pentium 4 and Intel Xeon processors. These instructions are also known as SSE2 instructions.

    B.4 AAA, AAS, AAM, AAD: ASCII Adjustments

    AAA                           ; 37                   [8086]
    

    AAS                           ; 3F                   [8086]
    

    AAD                           ; D5 0A                [8086] 
    AAD imm                       ; D5 ib                [8086]
    

    AAM                           ; D4 0A                [8086] 
    AAM imm                       ; D4 ib                [8086]
    

    These instructions are used in conjunction with the add, subtract, multiply and divide instructions to perform binary-coded decimal arithmetic in unpacked (one BCD digit per byte - easy to translate to and from ASCII, hence the instruction names) form. There are also packed BCD instructions DAA and DAS: see section B.60.

    B.5 ADC: Add with Carry

    ADC r/m8,reg8                 ; 10 /r                [8086] 
    ADC r/m16,reg16               ; o16 11 /r            [8086] 
    ADC r/m32,reg32               ; o32 11 /r            [386]
    

    ADC reg8,r/m8                 ; 12 /r                [8086] 
    ADC reg16,r/m16               ; o16 13 /r            [8086] 
    ADC reg32,r/m32               ; o32 13 /r            [386]
    

    ADC r/m8,imm8                 ; 80 /2 ib             [8086] 
    ADC r/m16,imm16               ; o16 81 /2 iw         [8086] 
    ADC r/m32,imm32               ; o32 81 /2 id         [386]
    

    ADC r/m16,imm8                ; o16 83 /2 ib         [8086] 
    ADC r/m32,imm8                ; o32 83 /2 ib         [386]
    

    ADC AL,imm8                   ; 14 ib                [8086] 
    ADC AX,imm16                  ; o16 15 iw            [8086] 
    ADC EAX,imm32                 ; o32 15 id            [386]
    

    ADC performs integer addition: it adds its two operands together, plus the value of the carry flag, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    To add two numbers without also adding the contents of the carry flag, use ADD (section B.6).

    B.6 ADD: Add Integers

    ADD r/m8,reg8                 ; 00 /r                [8086] 
    ADD r/m16,reg16               ; o16 01 /r            [8086] 
    ADD r/m32,reg32               ; o32 01 /r            [386]
    

    ADD reg8,r/m8                 ; 02 /r                [8086] 
    ADD reg16,r/m16               ; o16 03 /r            [8086] 
    ADD reg32,r/m32               ; o32 03 /r            [386]
    

    ADD r/m8,imm8                 ; 80 /0 ib             [8086] 
    ADD r/m16,imm16               ; o16 81 /0 iw         [8086] 
    ADD r/m32,imm32               ; o32 81 /0 id         [386]
    

    ADD r/m16,imm8                ; o16 83 /0 ib         [8086] 
    ADD r/m32,imm8                ; o32 83 /0 ib         [386]
    

    ADD AL,imm8                   ; 04 ib                [8086] 
    ADD AX,imm16                  ; o16 05 iw            [8086] 
    ADD EAX,imm32                 ; o32 05 id            [386]
    

    ADD performs integer addition: it adds its two operands together, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    B.7 ADDPD: ADD Packed Double-Precision FP Values

    ADDPD xmm1,xmm2/mem128        ; 66 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDPD performs addition on each of two packed double-precision FP value pairs.

       dst[0-63]   := dst[0-63]   + src[0-63], 
       dst[64-127] := dst[64-127] + src[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.8 ADDPS: ADD Packed Single-Precision FP Values

    ADDPS xmm1,xmm2/mem128        ; 0F 58 /r        [KATMAI,SSE]
    

    ADDPS performs addition on each of four packed single-precision FP value pairs

       dst[0-31]   := dst[0-31]   + src[0-31], 
       dst[32-63]  := dst[32-63]  + src[32-63], 
       dst[64-95]  := dst[64-95]  + src[64-95], 
       dst[96-127] := dst[96-127] + src[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.9 ADDSD: ADD Scalar Double-Precision FP Values

    ADDSD xmm1,xmm2/mem64         ; F2 0F 58 /r     [KATMAI,SSE]
    

    ADDSD adds the low double-precision FP values from the source and destination operands and stores the double-precision FP result in the destination operand.

       dst[0-63]   := dst[0-63] + src[0-63], 
       dst[64-127) remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 64-bit memory location.

    B.10 ADDSS: ADD Scalar Single-Precision FP Values

    ADDSS xmm1,xmm2/mem32         ; F3 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDSD adds the low single-precision FP values from the source and destination operands and stores the single-precision FP result in the destination operand.

       dst[0-31]   := dst[0-31] + src[0-31], 
       dst[32-127] remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 32-bit memory location.

    B.11 AND: Bitwise AND

    AND r/m8,reg8                 ; 20 /r                [8086] 
    AND r/m16,reg16               ; o16 21 /r            [8086] 
    AND r/m32,reg32               ; o32 21 /r            [386]
    

    AND reg8,r/m8                 ; 22 /r                [8086] 
    AND reg16,r/m16               ; o16 23 /r            [8086] 
    AND reg32,r/m32               ; o32 23 /r            [386]
    

    AND r/m8,imm8                 ; 80 /4 ib             [8086] 
    AND r/m16,imm16               ; o16 81 /4 iw         [8086] 
    AND r/m32,imm32               ; o32 81 /4 id         [386]
    

    AND r/m16,imm8                ; o16 83 /4 ib         [8086] 
    AND r/m32,imm8                ; o32 83 /4 ib         [386]
    

    AND AL,imm8                   ; 24 ib                [8086] 
    AND AX,imm16                  ; o16 25 iw            [8086] 
    AND EAX,imm32                 ; o32 25 id            [386]
    

    AND performs a bitwise AND operation between its two operands (i.e. each bit of the result is 1 if and only if the corresponding bits of the two inputs were both 1), and stores the result in the destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    The MMX instruction PAND (see section B.205) performs the same operation on the 64-bit MMX registers.

    B.12 ANDNPD: Bitwise Logical AND NOT of Packed Double-Precision FP Values

    ANDNPD xmm1,xmm2/mem128       ; 66 0F 55 /r     [WILLAMETTE,SSE2]
    

    ANDNPD inverts the bits of the two double-precision floating-point values in the destination register, and then performs a logical AND between the two double-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-63]   := src[0-63]   AND NOT dst[0-63], 
       dst[64-127] := src[64-127] AND NOT dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.13 ANDNPS: Bitwise Logical AND NOT of Packed Single-Precision FP Values

    ANDNPS xmm1,xmm2/mem128       ; 0F 55 /r        [KATMAI,SSE]
    

    ANDNPS inverts the bits of the four single-precision floating-point values in the destination register, and then performs a logical AND between the four single-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-31]   := src[0-31]   AND NOT dst[0-31], 
       dst[32-63]  := src[32-63]  AND NOT dst[32-63], 
       dst[64-95]  := src[64-95]  AND NOT dst[64-95], 
       dst[96-127] := src[96-127] AND NOT dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.14 ANDPD: Bitwise Logical AND For Single FP

    ANDPD xmm1,xmm2/mem128        ; 66 0F 54 /r     [WILLAMETTE,SSE2]
    

    ANDPD performs a bitwise logical AND of the two double-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-63]   := src[0-63]   AND dst[0-63], 
       dst[64-127] := src[64-127] AND dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.15 ANDPS: Bitwise Logical AND For Single FP

    ANDPS xmm1,xmm2/mem128        ; 0F 54 /r        [KATMAI,SSE]
    

    ANDPS performs a bitwise logical AND of the four single-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-31]   := src[0-31]   AND dst[0-31], 
       dst[32-63]  := src[32-63]  AND dst[32-63], 
       dst[64-95]  := src[64-95]  AND dst[64-95], 
       dst[96-127] := src[96-127] AND dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.16 ARPL: Adjust RPL Field of Selector

    ARPL r/m16,reg16              ; 63 /r                [286,PRIV]
    

    ARPL expects its two word operands to be segment selectors. It adjusts the RPL (reque documented as such.

  • CYRIX indicates that the instruction is specific to Cyrix processors, for example the extra MMX instructions in the Cyrix extended MMX instruction set.
  • FPU indicates that the instruction is a floating-point one, and will only run on machines with a coprocessor (automatically including 486DX, Pentium and above).
  • KATMAI indicates that the instruction was introduced as part of the Katmai New Instruction set. These instructions are available on the Pentium III and later processors. Those which are not specifically SSE instructions are also available on the AMD Athlon.
  • MMX indicates that the instruction is an MMX one, and will run on MMX-capable Pentium processors and the Pentium II.
  • PRIV indicates that the instruction is a protected-mode management instruction. Many of these may only be used in protected mode, or only at privilege level zero.
  • SSE and SSE2 indicate that the instruction is a Streaming SIMD Extension instruction. These instructions operate on multiple values in a single operation. SSE was introduced with the Pentium III and SSE2 was introduced with the Pentium 4.
  • UNDOC indicates that the instruction is an undocumented one, and not part of the official Intel Architecture; it may or may not be supported on any given machine.
  • WILLAMETTE indicates that the instruction was introduced as part of the new instruction set in the Pentium 4 and Intel Xeon processors. These instructions are also known as SSE2 instructions.

    B.4 AAA, AAS, AAM, AAD: ASCII Adjustments

    AAA                           ; 37                   [8086]
    

    AAS                           ; 3F                   [8086]
    

    AAD                           ; D5 0A                [8086] 
    AAD imm                       ; D5 ib                [8086]
    

    AAM                           ; D4 0A                [8086] 
    AAM imm                       ; D4 ib                [8086]
    

    These instructions are used in conjunction with the add, subtract, multiply and divide instructions to perform binary-coded decimal arithmetic in unpacked (one BCD digit per byte - easy to translate to and from ASCII, hence the instruction names) form. There are also packed BCD instructions DAA and DAS: see section B.60.

    B.5 ADC: Add with Carry

    ADC r/m8,reg8                 ; 10 /r                [8086] 
    ADC r/m16,reg16               ; o16 11 /r            [8086] 
    ADC r/m32,reg32               ; o32 11 /r            [386]
    

    ADC reg8,r/m8                 ; 12 /r                [8086] 
    ADC reg16,r/m16               ; o16 13 /r            [8086] 
    ADC reg32,r/m32               ; o32 13 /r            [386]
    

    ADC r/m8,imm8                 ; 80 /2 ib             [8086] 
    ADC r/m16,imm16               ; o16 81 /2 iw         [8086] 
    ADC r/m32,imm32               ; o32 81 /2 id         [386]
    

    ADC r/m16,imm8                ; o16 83 /2 ib         [8086] 
    ADC r/m32,imm8                ; o32 83 /2 ib         [386]
    

    ADC AL,imm8                   ; 14 ib                [8086] 
    ADC AX,imm16                  ; o16 15 iw            [8086] 
    ADC EAX,imm32                 ; o32 15 id            [386]
    

    ADC performs integer addition: it adds its two operands together, plus the value of the carry flag, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    To add two numbers without also adding the contents of the carry flag, use ADD (section B.6).

    B.6 ADD: Add Integers

    ADD r/m8,reg8                 ; 00 /r                [8086] 
    ADD r/m16,reg16               ; o16 01 /r            [8086] 
    ADD r/m32,reg32               ; o32 01 /r            [386]
    

    ADD reg8,r/m8                 ; 02 /r                [8086] 
    ADD reg16,r/m16               ; o16 03 /r            [8086] 
    ADD reg32,r/m32               ; o32 03 /r            [386]
    

    ADD r/m8,imm8                 ; 80 /0 ib             [8086] 
    ADD r/m16,imm16               ; o16 81 /0 iw         [8086] 
    ADD r/m32,imm32               ; o32 81 /0 id         [386]
    

    ADD r/m16,imm8                ; o16 83 /0 ib         [8086] 
    ADD r/m32,imm8                ; o32 83 /0 ib         [386]
    

    ADD AL,imm8                   ; 04 ib                [8086] 
    ADD AX,imm16                  ; o16 05 iw            [8086] 
    ADD EAX,imm32                 ; o32 05 id            [386]
    

    ADD performs integer addition: it adds its two operands together, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    B.7 ADDPD: ADD Packed Double-Precision FP Values

    ADDPD xmm1,xmm2/mem128        ; 66 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDPD performs addition on each of two packed double-precision FP value pairs.

       dst[0-63]   := dst[0-63]   + src[0-63], 
       dst[64-127] := dst[64-127] + src[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.8 ADDPS: ADD Packed Single-Precision FP Values

    ADDPS xmm1,xmm2/mem128        ; 0F 58 /r        [KATMAI,SSE]
    

    ADDPS performs addition on each of four packed single-precision FP value pairs

       dst[0-31]   := dst[0-31]   + src[0-31], 
       dst[32-63]  := dst[32-63]  + src[32-63], 
       dst[64-95]  := dst[64-95]  + src[64-95], 
       dst[96-127] := dst[96-127] + src[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.9 ADDSD: ADD Scalar Double-Precision FP Values

    ADDSD xmm1,xmm2/mem64         ; F2 0F 58 /r     [KATMAI,SSE]
    

    ADDSD adds the low double-precision FP values from the source and destination operands and stores the double-precision FP result in the destination operand.

       dst[0-63]   := dst[0-63] + src[0-63], 
       dst[64-127) remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 64-bit memory location.

    B.10 ADDSS: ADD Scalar Single-Precision FP Values

    ADDSS xmm1,xmm2/mem32         ; F3 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDSD adds the low single-precision FP values from the source and destination operands and stores the single-precision FP result in the destination operand.

       dst[0-31]   := dst[0-31] + src[0-31], 
       dst[32-127] remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 32-bit memory location.

    B.11 AND: Bitwise AND

    AND r/m8,reg8                 ; 20 /r                [8086] 
    AND r/m16,reg16               ; o16 21 /r            [8086] 
    AND r/m32,reg32               ; o32 21 /r            [386]
    

    AND reg8,r/m8                 ; 22 /r                [8086] 
    AND reg16,r/m16               ; o16 23 /r            [8086] 
    AND reg32,r/m32               ; o32 23 /r            [386]
    

    AND r/m8,imm8                 ; 80 /4 ib             [8086] 
    AND r/m16,imm16               ; o16 81 /4 iw         [8086] 
    AND r/m32,imm32               ; o32 81 /4 id         [386]
    

    AND r/m16,imm8                ; o16 83 /4 ib         [8086] 
    AND r/m32,imm8                ; o32 83 /4 ib         [386]
    

    AND AL,imm8                   ; 24 ib                [8086] 
    AND AX,imm16                  ; o16 25 iw            [8086] 
    AND EAX,imm32                 ; o32 25 id            [386]
    

    AND performs a bitwise AND operation between its two operands (i.e. each bit of the result is 1 if and only if the corresponding bits of the two inputs were both 1), and stores the result in the destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    The MMX instruction PAND (see section B.205) performs the same operation on the 64-bit MMX registers.

    B.12 ANDNPD: Bitwise Logical AND NOT of Packed Double-Precision FP Values

    ANDNPD xmm1,xmm2/mem128       ; 66 0F 55 /r     [WILLAMETTE,SSE2]
    

    ANDNPD inverts the bits of the two double-precision floating-point values in the destination register, and then performs a logical AND between the two double-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-63]   := src[0-63]   AND NOT dst[0-63], 
       dst[64-127] := src[64-127] AND NOT dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.13 ANDNPS: Bitwise Logical AND NOT of Packed Single-Precision FP Values

    ANDNPS xmm1,xmm2/mem128       ; 0F 55 /r        [KATMAI,SSE]
    

    ANDNPS inverts the bits of the four single-precision floating-point values in the destination register, and then performs a logical AND between the four single-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-31]   := src[0-31]   AND NOT dst[0-31], 
       dst[32-63]  := src[32-63]  AND NOT dst[32-63], 
       dst[64-95]  := src[64-95]  AND NOT dst[64-95], 
       dst[96-127] := src[96-127] AND NOT dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.14 ANDPD: Bitwise Logical AND For Single FP

    ANDPD xmm1,xmm2/mem128        ; 66 0F 54 /r     [WILLAMETTE,SSE2]
    

    ANDPD performs a bitwise logical AND of the two double-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-63]   := src[0-63]   AND dst[0-63], 
       dst[64-127] := src[64-127] AND dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.15 ANDPS: Bitwise Logical AND For Single FP

    ANDPS xmm1,xmm2/mem128        ; 0F 54 /r        [KATMAI,SSE]
    

    ANDPS performs a bitwise logical AND of the four single-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-31]   := src[0-31]   AND dst[0-31], 
       dst[32-63]  := src[32-63]  AND dst[32-63], 
       dst[64-95]  := src[64-95]  AND dst[64-95], 
       dst[96-127] := src[96-127] AND dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.16 ARPL: Adjust RPL Field of Selector

    ARPL r/m16,reg16              ; 63 /r                [286,PRIV]
    

    ARPL expects its two word operands to be segment selectors. It adjusts the RPL (reque documented as such.

  • CYRIX indicates that the instruction is specific to Cyrix processors, for example the extra MMX instructions in the Cyrix extended MMX instruction set.
  • FPU indicates that the instruction is a floating-point one, and will only run on machines with a coprocessor (automatically including 486DX, Pentium and above).
  • KATMAI indicates that the instruction was introduced as part of the Katmai New Instruction set. These instructions are available on the Pentium III and later processors. Those which are not specifically SSE instructions are also available on the AMD Athlon.
  • MMX indicates that the instruction is an MMX one, and will run on MMX-capable Pentium processors and the Pentium II.
  • PRIV indicates that the instruction is a protected-mode management instruction. Many of these may only be used in protected mode, or only at privilege level zero.
  • SSE and SSE2 indicate that the instruction is a Streaming SIMD Extension instruction. These instructions operate on multiple values in a single operation. SSE was introduced with the Pentium III and SSE2 was introduced with the Pentium 4.
  • UNDOC indicates that the instruction is an undocumented one, and not part of the official Intel Architecture; it may or may not be supported on any given machine.
  • WILLAMETTE indicates that the instruction was introduced as part of the new instruction set in the Pentium 4 and Intel Xeon processors. These instructions are also known as SSE2 instructions.

    B.4 AAA, AAS, AAM, AAD: ASCII Adjustments

    AAA                           ; 37                   [8086]
    

    AAS                           ; 3F                   [8086]
    

    AAD                           ; D5 0A                [8086] 
    AAD imm                       ; D5 ib                [8086]
    

    AAM                           ; D4 0A                [8086] 
    AAM imm                       ; D4 ib                [8086]
    

    These instructions are used in conjunction with the add, subtract, multiply and divide instructions to perform binary-coded decimal arithmetic in unpacked (one BCD digit per byte - easy to translate to and from ASCII, hence the instruction names) form. There are also packed BCD instructions DAA and DAS: see section B.60.

    B.5 ADC: Add with Carry

    ADC r/m8,reg8                 ; 10 /r                [8086] 
    ADC r/m16,reg16               ; o16 11 /r            [8086] 
    ADC r/m32,reg32               ; o32 11 /r            [386]
    

    ADC reg8,r/m8                 ; 12 /r                [8086] 
    ADC reg16,r/m16               ; o16 13 /r            [8086] 
    ADC reg32,r/m32               ; o32 13 /r            [386]
    

    ADC r/m8,imm8                 ; 80 /2 ib             [8086] 
    ADC r/m16,imm16               ; o16 81 /2 iw         [8086] 
    ADC r/m32,imm32               ; o32 81 /2 id         [386]
    

    ADC r/m16,imm8                ; o16 83 /2 ib         [8086] 
    ADC r/m32,imm8                ; o32 83 /2 ib         [386]
    

    ADC AL,imm8                   ; 14 ib                [8086] 
    ADC AX,imm16                  ; o16 15 iw            [8086] 
    ADC EAX,imm32                 ; o32 15 id            [386]
    

    ADC performs integer addition: it adds its two operands together, plus the value of the carry flag, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    To add two numbers without also adding the contents of the carry flag, use ADD (section B.6).

    B.6 ADD: Add Integers

    ADD r/m8,reg8                 ; 00 /r                [8086] 
    ADD r/m16,reg16               ; o16 01 /r            [8086] 
    ADD r/m32,reg32               ; o32 01 /r            [386]
    

    ADD reg8,r/m8                 ; 02 /r                [8086] 
    ADD reg16,r/m16               ; o16 03 /r            [8086] 
    ADD reg32,r/m32               ; o32 03 /r            [386]
    

    ADD r/m8,imm8                 ; 80 /0 ib             [8086] 
    ADD r/m16,imm16               ; o16 81 /0 iw         [8086] 
    ADD r/m32,imm32               ; o32 81 /0 id         [386]
    

    ADD r/m16,imm8                ; o16 83 /0 ib         [8086] 
    ADD r/m32,imm8                ; o32 83 /0 ib         [386]
    

    ADD AL,imm8                   ; 04 ib                [8086] 
    ADD AX,imm16                  ; o16 05 iw            [8086] 
    ADD EAX,imm32                 ; o32 05 id            [386]
    

    ADD performs integer addition: it adds its two operands together, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    B.7 ADDPD: ADD Packed Double-Precision FP Values

    ADDPD xmm1,xmm2/mem128        ; 66 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDPD performs addition on each of two packed double-precision FP value pairs.

       dst[0-63]   := dst[0-63]   + src[0-63], 
       dst[64-127] := dst[64-127] + src[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.8 ADDPS: ADD Packed Single-Precision FP Values

    ADDPS xmm1,xmm2/mem128        ; 0F 58 /r        [KATMAI,SSE]
    

    ADDPS performs addition on each of four packed single-precision FP value pairs

       dst[0-31]   := dst[0-31]   + src[0-31], 
       dst[32-63]  := dst[32-63]  + src[32-63], 
       dst[64-95]  := dst[64-95]  + src[64-95], 
       dst[96-127] := dst[96-127] + src[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.9 ADDSD: ADD Scalar Double-Precision FP Values

    ADDSD xmm1,xmm2/mem64         ; F2 0F 58 /r     [KATMAI,SSE]
    

    ADDSD adds the low double-precision FP values from the source and destination operands and stores the double-precision FP result in the destination operand.

       dst[0-63]   := dst[0-63] + src[0-63], 
       dst[64-127) remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 64-bit memory location.

    B.10 ADDSS: ADD Scalar Single-Precision FP Values

    ADDSS xmm1,xmm2/mem32         ; F3 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDSD adds the low single-precision FP values from the source and destination operands and stores the single-precision FP result in the destination operand.

       dst[0-31]   := dst[0-31] + src[0-31], 
       dst[32-127] remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 32-bit memory location.

    B.11 AND: Bitwise AND

    AND r/m8,reg8                 ; 20 /r                [8086] 
    AND r/m16,reg16               ; o16 21 /r            [8086] 
    AND r/m32,reg32               ; o32 21 /r            [386]
    

    AND reg8,r/m8                 ; 22 /r                [8086] 
    AND reg16,r/m16               ; o16 23 /r            [8086] 
    AND reg32,r/m32               ; o32 23 /r            [386]
    

    AND r/m8,imm8                 ; 80 /4 ib             [8086] 
    AND r/m16,imm16               ; o16 81 /4 iw         [8086] 
    AND r/m32,imm32               ; o32 81 /4 id         [386]
    

    AND r/m16,imm8                ; o16 83 /4 ib         [8086] 
    AND r/m32,imm8                ; o32 83 /4 ib         [386]
    

    AND AL,imm8                   ; 24 ib                [8086] 
    AND AX,imm16                  ; o16 25 iw            [8086] 
    AND EAX,imm32                 ; o32 25 id            [386]
    

    AND performs a bitwise AND operation between its two operands (i.e. each bit of the result is 1 if and only if the corresponding bits of the two inputs were both 1), and stores the result in the destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    The MMX instruction PAND (see section B.205) performs the same operation on the 64-bit MMX registers.

    B.12 ANDNPD: Bitwise Logical AND NOT of Packed Double-Precision FP Values

    ANDNPD xmm1,xmm2/mem128       ; 66 0F 55 /r     [WILLAMETTE,SSE2]
    

    ANDNPD inverts the bits of the two double-precision floating-point values in the destination register, and then performs a logical AND between the two double-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-63]   := src[0-63]   AND NOT dst[0-63], 
       dst[64-127] := src[64-127] AND NOT dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.13 ANDNPS: Bitwise Logical AND NOT of Packed Single-Precision FP Values

    ANDNPS xmm1,xmm2/mem128       ; 0F 55 /r        [KATMAI,SSE]
    

    ANDNPS inverts the bits of the four single-precision floating-point values in the destination register, and then performs a logical AND between the four single-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-31]   := src[0-31]   AND NOT dst[0-31], 
       dst[32-63]  := src[32-63]  AND NOT dst[32-63], 
       dst[64-95]  := src[64-95]  AND NOT dst[64-95], 
       dst[96-127] := src[96-127] AND NOT dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.14 ANDPD: Bitwise Logical AND For Single FP

    ANDPD xmm1,xmm2/mem128        ; 66 0F 54 /r     [WILLAMETTE,SSE2]
    

    ANDPD performs a bitwise logical AND of the two double-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-63]   := src[0-63]   AND dst[0-63], 
       dst[64-127] := src[64-127] AND dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.15 ANDPS: Bitwise Logical AND For Single FP

    ANDPS xmm1,xmm2/mem128        ; 0F 54 /r        [KATMAI,SSE]
    

    ANDPS performs a bitwise logical AND of the four single-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-31]   := src[0-31]   AND dst[0-31], 
       dst[32-63]  := src[32-63]  AND dst[32-63], 
       dst[64-95]  := src[64-95]  AND dst[64-95], 
       dst[96-127] := src[96-127] AND dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.16 ARPL: Adjust RPL Field of Selector

    ARPL r/m16,reg16              ; 63 /r                [286,PRIV]
    

    ARPL expects its two word operands to be segment selectors. It adjusts the RPL (reque documented as such.

  • CYRIX indicates that the instruction is specific to Cyrix processors, for example the extra MMX instructions in the Cyrix extended MMX instruction set.
  • FPU indicates that the instruction is a floating-point one, and will only run on machines with a coprocessor (automatically including 486DX, Pentium and above).
  • KATMAI indicates that the instruction was introduced as part of the Katmai New Instruction set. These instructions are available on the Pentium III and later processors. Those which are not specifically SSE instructions are also available on the AMD Athlon.
  • MMX indicates that the instruction is an MMX one, and will run on MMX-capable Pentium processors and the Pentium II.
  • PRIV indicates that the instruction is a protected-mode management instruction. Many of these may only be used in protected mode, or only at privilege level zero.
  • SSE and SSE2 indicate that the instruction is a Streaming SIMD Extension instruction. These instructions operate on multiple values in a single operation. SSE was introduced with the Pentium III and SSE2 was introduced with the Pentium 4.
  • UNDOC indicates that the instruction is an undocumented one, and not part of the official Intel Architecture; it may or may not be supported on any given machine.
  • WILLAMETTE indicates that the instruction was introduced as part of the new instruction set in the Pentium 4 and Intel Xeon processors. These instructions are also known as SSE2 instructions.

    B.4 AAA, AAS, AAM, AAD: ASCII Adjustments

    AAA                           ; 37                   [8086]
    

    AAS                           ; 3F                   [8086]
    

    AAD                           ; D5 0A                [8086] 
    AAD imm                       ; D5 ib                [8086]
    

    AAM                           ; D4 0A                [8086] 
    AAM imm                       ; D4 ib                [8086]
    

    These instructions are used in conjunction with the add, subtract, multiply and divide instructions to perform binary-coded decimal arithmetic in unpacked (one BCD digit per byte - easy to translate to and from ASCII, hence the instruction names) form. There are also packed BCD instructions DAA and DAS: see section B.60.

    B.5 ADC: Add with Carry

    ADC r/m8,reg8                 ; 10 /r                [8086] 
    ADC r/m16,reg16               ; o16 11 /r            [8086] 
    ADC r/m32,reg32               ; o32 11 /r            [386]
    

    ADC reg8,r/m8                 ; 12 /r                [8086] 
    ADC reg16,r/m16               ; o16 13 /r            [8086] 
    ADC reg32,r/m32               ; o32 13 /r            [386]
    

    ADC r/m8,imm8                 ; 80 /2 ib             [8086] 
    ADC r/m16,imm16               ; o16 81 /2 iw         [8086] 
    ADC r/m32,imm32               ; o32 81 /2 id         [386]
    

    ADC r/m16,imm8                ; o16 83 /2 ib         [8086] 
    ADC r/m32,imm8                ; o32 83 /2 ib         [386]
    

    ADC AL,imm8                   ; 14 ib                [8086] 
    ADC AX,imm16                  ; o16 15 iw            [8086] 
    ADC EAX,imm32                 ; o32 15 id            [386]
    

    ADC performs integer addition: it adds its two operands together, plus the value of the carry flag, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    To add two numbers without also adding the contents of the carry flag, use ADD (section B.6).

    B.6 ADD: Add Integers

    ADD r/m8,reg8                 ; 00 /r                [8086] 
    ADD r/m16,reg16               ; o16 01 /r            [8086] 
    ADD r/m32,reg32               ; o32 01 /r            [386]
    

    ADD reg8,r/m8                 ; 02 /r                [8086] 
    ADD reg16,r/m16               ; o16 03 /r            [8086] 
    ADD reg32,r/m32               ; o32 03 /r            [386]
    

    ADD r/m8,imm8                 ; 80 /0 ib             [8086] 
    ADD r/m16,imm16               ; o16 81 /0 iw         [8086] 
    ADD r/m32,imm32               ; o32 81 /0 id         [386]
    

    ADD r/m16,imm8                ; o16 83 /0 ib         [8086] 
    ADD r/m32,imm8                ; o32 83 /0 ib         [386]
    

    ADD AL,imm8                   ; 04 ib                [8086] 
    ADD AX,imm16                  ; o16 05 iw            [8086] 
    ADD EAX,imm32                 ; o32 05 id            [386]
    

    ADD performs integer addition: it adds its two operands together, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    B.7 ADDPD: ADD Packed Double-Precision FP Values

    ADDPD xmm1,xmm2/mem128        ; 66 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDPD performs addition on each of two packed double-precision FP value pairs.

       dst[0-63]   := dst[0-63]   + src[0-63], 
       dst[64-127] := dst[64-127] + src[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.8 ADDPS: ADD Packed Single-Precision FP Values

    ADDPS xmm1,xmm2/mem128        ; 0F 58 /r        [KATMAI,SSE]
    

    ADDPS performs addition on each of four packed single-precision FP value pairs

       dst[0-31]   := dst[0-31]   + src[0-31], 
       dst[32-63]  := dst[32-63]  + src[32-63], 
       dst[64-95]  := dst[64-95]  + src[64-95], 
       dst[96-127] := dst[96-127] + src[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.9 ADDSD: ADD Scalar Double-Precision FP Values

    ADDSD xmm1,xmm2/mem64         ; F2 0F 58 /r     [KATMAI,SSE]
    

    ADDSD adds the low double-precision FP values from the source and destination operands and stores the double-precision FP result in the destination operand.

       dst[0-63]   := dst[0-63] + src[0-63], 
       dst[64-127) remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 64-bit memory location.

    B.10 ADDSS: ADD Scalar Single-Precision FP Values

    ADDSS xmm1,xmm2/mem32         ; F3 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDSD adds the low single-precision FP values from the source and destination operands and stores the single-precision FP result in the destination operand.

       dst[0-31]   := dst[0-31] + src[0-31], 
       dst[32-127] remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 32-bit memory location.

    B.11 AND: Bitwise AND

    AND r/m8,reg8                 ; 20 /r                [8086] 
    AND r/m16,reg16               ; o16 21 /r            [8086] 
    AND r/m32,reg32               ; o32 21 /r            [386]
    

    AND reg8,r/m8                 ; 22 /r                [8086] 
    AND reg16,r/m16               ; o16 23 /r            [8086] 
    AND reg32,r/m32               ; o32 23 /r            [386]
    

    AND r/m8,imm8                 ; 80 /4 ib             [8086] 
    AND r/m16,imm16               ; o16 81 /4 iw         [8086] 
    AND r/m32,imm32               ; o32 81 /4 id         [386]
    

    AND r/m16,imm8                ; o16 83 /4 ib         [8086] 
    AND r/m32,imm8                ; o32 83 /4 ib         [386]
    

    AND AL,imm8                   ; 24 ib                [8086] 
    AND AX,imm16                  ; o16 25 iw            [8086] 
    AND EAX,imm32                 ; o32 25 id            [386]
    

    AND performs a bitwise AND operation between its two operands (i.e. each bit of the result is 1 if and only if the corresponding bits of the two inputs were both 1), and stores the result in the destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    The MMX instruction PAND (see section B.205) performs the same operation on the 64-bit MMX registers.

    B.12 ANDNPD: Bitwise Logical AND NOT of Packed Double-Precision FP Values

    ANDNPD xmm1,xmm2/mem128       ; 66 0F 55 /r     [WILLAMETTE,SSE2]
    

    ANDNPD inverts the bits of the two double-precision floating-point values in the destination register, and then performs a logical AND between the two double-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-63]   := src[0-63]   AND NOT dst[0-63], 
       dst[64-127] := src[64-127] AND NOT dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.13 ANDNPS: Bitwise Logical AND NOT of Packed Single-Precision FP Values

    ANDNPS xmm1,xmm2/mem128       ; 0F 55 /r        [KATMAI,SSE]
    

    ANDNPS inverts the bits of the four single-precision floating-point values in the destination register, and then performs a logical AND between the four single-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-31]   := src[0-31]   AND NOT dst[0-31], 
       dst[32-63]  := src[32-63]  AND NOT dst[32-63], 
       dst[64-95]  := src[64-95]  AND NOT dst[64-95], 
       dst[96-127] := src[96-127] AND NOT dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.14 ANDPD: Bitwise Logical AND For Single FP

    ANDPD xmm1,xmm2/mem128        ; 66 0F 54 /r     [WILLAMETTE,SSE2]
    

    ANDPD performs a bitwise logical AND of the two double-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-63]   := src[0-63]   AND dst[0-63], 
       dst[64-127] := src[64-127] AND dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.15 ANDPS: Bitwise Logical AND For Single FP

    ANDPS xmm1,xmm2/mem128        ; 0F 54 /r        [KATMAI,SSE]
    

    ANDPS performs a bitwise logical AND of the four single-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-31]   := src[0-31]   AND dst[0-31], 
       dst[32-63]  := src[32-63]  AND dst[32-63], 
       dst[64-95]  := src[64-95]  AND dst[64-95], 
       dst[96-127] := src[96-127] AND dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.16 ARPL: Adjust RPL Field of Selector

    ARPL r/m16,reg16              ; 63 /r                [286,PRIV]
    

    ARPL expects its two word operands to be segment selectors. It adjusts the RPL (reque documented as such.

  • CYRIX indicates that the instruction is specific to Cyrix processors, for example the extra MMX instructions in the Cyrix extended MMX instruction set.
  • FPU indicates that the instruction is a floating-point one, and will only run on machines with a coprocessor (automatically including 486DX, Pentium and above).
  • KATMAI indicates that the instruction was introduced as part of the Katmai New Instruction set. These instructions are available on the Pentium III and later processors. Those which are not specifically SSE instructions are also available on the AMD Athlon.
  • MMX indicates that the instruction is an MMX one, and will run on MMX-capable Pentium processors and the Pentium II.
  • PRIV indicates that the instruction is a protected-mode management instruction. Many of these may only be used in protected mode, or only at privilege level zero.
  • SSE and SSE2 indicate that the instruction is a Streaming SIMD Extension instruction. These instructions operate on multiple values in a single operation. SSE was introduced with the Pentium III and SSE2 was introduced with the Pentium 4.
  • UNDOC indicates that the instruction is an undocumented one, and not part of the official Intel Architecture; it may or may not be supported on any given machine.
  • WILLAMETTE indicates that the instruction was introduced as part of the new instruction set in the Pentium 4 and Intel Xeon processors. These instructions are also known as SSE2 instructions.

    B.4 AAA, AAS, AAM, AAD: ASCII Adjustments

    AAA                           ; 37                   [8086]
    

    AAS                           ; 3F                   [8086]
    

    AAD                           ; D5 0A                [8086] 
    AAD imm                       ; D5 ib                [8086]
    

    AAM                           ; D4 0A                [8086] 
    AAM imm                       ; D4 ib                [8086]
    

    These instructions are used in conjunction with the add, subtract, multiply and divide instructions to perform binary-coded decimal arithmetic in unpacked (one BCD digit per byte - easy to translate to and from ASCII, hence the instruction names) form. There are also packed BCD instructions DAA and DAS: see section B.60.

    B.5 ADC: Add with Carry

    ADC r/m8,reg8                 ; 10 /r                [8086] 
    ADC r/m16,reg16               ; o16 11 /r            [8086] 
    ADC r/m32,reg32               ; o32 11 /r            [386]
    

    ADC reg8,r/m8                 ; 12 /r                [8086] 
    ADC reg16,r/m16               ; o16 13 /r            [8086] 
    ADC reg32,r/m32               ; o32 13 /r            [386]
    

    ADC r/m8,imm8                 ; 80 /2 ib             [8086] 
    ADC r/m16,imm16               ; o16 81 /2 iw         [8086] 
    ADC r/m32,imm32               ; o32 81 /2 id         [386]
    

    ADC r/m16,imm8                ; o16 83 /2 ib         [8086] 
    ADC r/m32,imm8                ; o32 83 /2 ib         [386]
    

    ADC AL,imm8                   ; 14 ib                [8086] 
    ADC AX,imm16                  ; o16 15 iw            [8086] 
    ADC EAX,imm32                 ; o32 15 id            [386]
    

    ADC performs integer addition: it adds its two operands together, plus the value of the carry flag, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    To add two numbers without also adding the contents of the carry flag, use ADD (section B.6).

    B.6 ADD: Add Integers

    ADD r/m8,reg8                 ; 00 /r                [8086] 
    ADD r/m16,reg16               ; o16 01 /r            [8086] 
    ADD r/m32,reg32               ; o32 01 /r            [386]
    

    ADD reg8,r/m8                 ; 02 /r                [8086] 
    ADD reg16,r/m16               ; o16 03 /r            [8086] 
    ADD reg32,r/m32               ; o32 03 /r            [386]
    

    ADD r/m8,imm8                 ; 80 /0 ib             [8086] 
    ADD r/m16,imm16               ; o16 81 /0 iw         [8086] 
    ADD r/m32,imm32               ; o32 81 /0 id         [386]
    

    ADD r/m16,imm8                ; o16 83 /0 ib         [8086] 
    ADD r/m32,imm8                ; o32 83 /0 ib         [386]
    

    ADD AL,imm8                   ; 04 ib                [8086] 
    ADD AX,imm16                  ; o16 05 iw            [8086] 
    ADD EAX,imm32                 ; o32 05 id            [386]
    

    ADD performs integer addition: it adds its two operands together, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    B.7 ADDPD: ADD Packed Double-Precision FP Values

    ADDPD xmm1,xmm2/mem128        ; 66 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDPD performs addition on each of two packed double-precision FP value pairs.

       dst[0-63]   := dst[0-63]   + src[0-63], 
       dst[64-127] := dst[64-127] + src[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.8 ADDPS: ADD Packed Single-Precision FP Values

    ADDPS xmm1,xmm2/mem128        ; 0F 58 /r        [KATMAI,SSE]
    

    ADDPS performs addition on each of four packed single-precision FP value pairs

       dst[0-31]   := dst[0-31]   + src[0-31], 
       dst[32-63]  := dst[32-63]  + src[32-63], 
       dst[64-95]  := dst[64-95]  + src[64-95], 
       dst[96-127] := dst[96-127] + src[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.9 ADDSD: ADD Scalar Double-Precision FP Values

    ADDSD xmm1,xmm2/mem64         ; F2 0F 58 /r     [KATMAI,SSE]
    

    ADDSD adds the low double-precision FP values from the source and destination operands and stores the double-precision FP result in the destination operand.

       dst[0-63]   := dst[0-63] + src[0-63], 
       dst[64-127) remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 64-bit memory location.

    B.10 ADDSS: ADD Scalar Single-Precision FP Values

    ADDSS xmm1,xmm2/mem32         ; F3 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDSD adds the low single-precision FP values from the source and destination operands and stores the single-precision FP result in the destination operand.

       dst[0-31]   := dst[0-31] + src[0-31], 
       dst[32-127] remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 32-bit memory location.

    B.11 AND: Bitwise AND

    AND r/m8,reg8                 ; 20 /r                [8086] 
    AND r/m16,reg16               ; o16 21 /r            [8086] 
    AND r/m32,reg32               ; o32 21 /r            [386]
    

    AND reg8,r/m8                 ; 22 /r                [8086] 
    AND reg16,r/m16               ; o16 23 /r            [8086] 
    AND reg32,r/m32               ; o32 23 /r            [386]
    

    AND r/m8,imm8                 ; 80 /4 ib             [8086] 
    AND r/m16,imm16               ; o16 81 /4 iw         [8086] 
    AND r/m32,imm32               ; o32 81 /4 id         [386]
    

    AND r/m16,imm8                ; o16 83 /4 ib         [8086] 
    AND r/m32,imm8                ; o32 83 /4 ib         [386]
    

    AND AL,imm8                   ; 24 ib                [8086] 
    AND AX,imm16                  ; o16 25 iw            [8086] 
    AND EAX,imm32                 ; o32 25 id            [386]
    

    AND performs a bitwise AND operation between its two operands (i.e. each bit of the result is 1 if and only if the corresponding bits of the two inputs were both 1), and stores the result in the destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    The MMX instruction PAND (see section B.205) performs the same operation on the 64-bit MMX registers.

    B.12 ANDNPD: Bitwise Logical AND NOT of Packed Double-Precision FP Values

    ANDNPD xmm1,xmm2/mem128       ; 66 0F 55 /r     [WILLAMETTE,SSE2]
    

    ANDNPD inverts the bits of the two double-precision floating-point values in the destination register, and then performs a logical AND between the two double-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-63]   := src[0-63]   AND NOT dst[0-63], 
       dst[64-127] := src[64-127] AND NOT dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.13 ANDNPS: Bitwise Logical AND NOT of Packed Single-Precision FP Values

    ANDNPS xmm1,xmm2/mem128       ; 0F 55 /r        [KATMAI,SSE]
    

    ANDNPS inverts the bits of the four single-precision floating-point values in the destination register, and then performs a logical AND between the four single-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-31]   := src[0-31]   AND NOT dst[0-31], 
       dst[32-63]  := src[32-63]  AND NOT dst[32-63], 
       dst[64-95]  := src[64-95]  AND NOT dst[64-95], 
       dst[96-127] := src[96-127] AND NOT dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.14 ANDPD: Bitwise Logical AND For Single FP

    ANDPD xmm1,xmm2/mem128        ; 66 0F 54 /r     [WILLAMETTE,SSE2]
    

    ANDPD performs a bitwise logical AND of the two double-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-63]   := src[0-63]   AND dst[0-63], 
       dst[64-127] := src[64-127] AND dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.15 ANDPS: Bitwise Logical AND For Single FP

    ANDPS xmm1,xmm2/mem128        ; 0F 54 /r        [KATMAI,SSE]
    

    ANDPS performs a bitwise logical AND of the four single-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-31]   := src[0-31]   AND dst[0-31], 
       dst[32-63]  := src[32-63]  AND dst[32-63], 
       dst[64-95]  := src[64-95]  AND dst[64-95], 
       dst[96-127] := src[96-127] AND dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.16 ARPL: Adjust RPL Field of Selector

    ARPL r/m16,reg16              ; 63 /r                [286,PRIV]
    

    ARPL expects its two word operands to be segment selectors. It adjusts the RPL (reque documented as such.

  • CYRIX indicates that the instruction is specific to Cyrix processors, for example the extra MMX instructions in the Cyrix extended MMX instruction set.
  • FPU indicates that the instruction is a floating-point one, and will only run on machines with a coprocessor (automatically including 486DX, Pentium and above).
  • KATMAI indicates that the instruction was introduced as part of the Katmai New Instruction set. These instructions are available on the Pentium III and later processors. Those which are not specifically SSE instructions are also available on the AMD Athlon.
  • MMX indicates that the instruction is an MMX one, and will run on MMX-capable Pentium processors and the Pentium II.
  • PRIV indicates that the instruction is a protected-mode management instruction. Many of these may only be used in protected mode, or only at privilege level zero.
  • SSE and SSE2 indicate that the instruction is a Streaming SIMD Extension instruction. These instructions operate on multiple values in a single operation. SSE was introduced with the Pentium III and SSE2 was introduced with the Pentium 4.
  • UNDOC indicates that the instruction is an undocumented one, and not part of the official Intel Architecture; it may or may not be supported on any given machine.
  • WILLAMETTE indicates that the instruction was introduced as part of the new instruction set in the Pentium 4 and Intel Xeon processors. These instructions are also known as SSE2 instructions.

    B.4 AAA, AAS, AAM, AAD: ASCII Adjustments

    AAA                           ; 37                   [8086]
    

    AAS                           ; 3F                   [8086]
    

    AAD                           ; D5 0A                [8086] 
    AAD imm                       ; D5 ib                [8086]
    

    AAM                           ; D4 0A                [8086] 
    AAM imm                       ; D4 ib                [8086]
    

    These instructions are used in conjunction with the add, subtract, multiply and divide instructions to perform binary-coded decimal arithmetic in unpacked (one BCD digit per byte - easy to translate to and from ASCII, hence the instruction names) form. There are also packed BCD instructions DAA and DAS: see section B.60.

    B.5 ADC: Add with Carry

    ADC r/m8,reg8                 ; 10 /r                [8086] 
    ADC r/m16,reg16               ; o16 11 /r            [8086] 
    ADC r/m32,reg32               ; o32 11 /r            [386]
    

    ADC reg8,r/m8                 ; 12 /r                [8086] 
    ADC reg16,r/m16               ; o16 13 /r            [8086] 
    ADC reg32,r/m32               ; o32 13 /r            [386]
    

    ADC r/m8,imm8                 ; 80 /2 ib             [8086] 
    ADC r/m16,imm16               ; o16 81 /2 iw         [8086] 
    ADC r/m32,imm32               ; o32 81 /2 id         [386]
    

    ADC r/m16,imm8                ; o16 83 /2 ib         [8086] 
    ADC r/m32,imm8                ; o32 83 /2 ib         [386]
    

    ADC AL,imm8                   ; 14 ib                [8086] 
    ADC AX,imm16                  ; o16 15 iw            [8086] 
    ADC EAX,imm32                 ; o32 15 id            [386]
    

    ADC performs integer addition: it adds its two operands together, plus the value of the carry flag, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    To add two numbers without also adding the contents of the carry flag, use ADD (section B.6).

    B.6 ADD: Add Integers

    ADD r/m8,reg8                 ; 00 /r                [8086] 
    ADD r/m16,reg16               ; o16 01 /r            [8086] 
    ADD r/m32,reg32               ; o32 01 /r            [386]
    

    ADD reg8,r/m8                 ; 02 /r                [8086] 
    ADD reg16,r/m16               ; o16 03 /r            [8086] 
    ADD reg32,r/m32               ; o32 03 /r            [386]
    

    ADD r/m8,imm8                 ; 80 /0 ib             [8086] 
    ADD r/m16,imm16               ; o16 81 /0 iw         [8086] 
    ADD r/m32,imm32               ; o32 81 /0 id         [386]
    

    ADD r/m16,imm8                ; o16 83 /0 ib         [8086] 
    ADD r/m32,imm8                ; o32 83 /0 ib         [386]
    

    ADD AL,imm8                   ; 04 ib                [8086] 
    ADD AX,imm16                  ; o16 05 iw            [8086] 
    ADD EAX,imm32                 ; o32 05 id            [386]
    

    ADD performs integer addition: it adds its two operands together, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    B.7 ADDPD: ADD Packed Double-Precision FP Values

    ADDPD xmm1,xmm2/mem128        ; 66 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDPD performs addition on each of two packed double-precision FP value pairs.

       dst[0-63]   := dst[0-63]   + src[0-63], 
       dst[64-127] := dst[64-127] + src[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.8 ADDPS: ADD Packed Single-Precision FP Values

    ADDPS xmm1,xmm2/mem128        ; 0F 58 /r        [KATMAI,SSE]
    

    ADDPS performs addition on each of four packed single-precision FP value pairs

       dst[0-31]   := dst[0-31]   + src[0-31], 
       dst[32-63]  := dst[32-63]  + src[32-63], 
       dst[64-95]  := dst[64-95]  + src[64-95], 
       dst[96-127] := dst[96-127] + src[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.9 ADDSD: ADD Scalar Double-Precision FP Values

    ADDSD xmm1,xmm2/mem64         ; F2 0F 58 /r     [KATMAI,SSE]
    

    ADDSD adds the low double-precision FP values from the source and destination operands and stores the double-precision FP result in the destination operand.

       dst[0-63]   := dst[0-63] + src[0-63], 
       dst[64-127) remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 64-bit memory location.

    B.10 ADDSS: ADD Scalar Single-Precision FP Values

    ADDSS xmm1,xmm2/mem32         ; F3 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDSD adds the low single-precision FP values from the source and destination operands and stores the single-precision FP result in the destination operand.

       dst[0-31]   := dst[0-31] + src[0-31], 
       dst[32-127] remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 32-bit memory location.

    B.11 AND: Bitwise AND

    AND r/m8,reg8                 ; 20 /r                [8086] 
    AND r/m16,reg16               ; o16 21 /r            [8086] 
    AND r/m32,reg32               ; o32 21 /r            [386]
    

    AND reg8,r/m8                 ; 22 /r                [8086] 
    AND reg16,r/m16               ; o16 23 /r            [8086] 
    AND reg32,r/m32               ; o32 23 /r            [386]
    

    AND r/m8,imm8                 ; 80 /4 ib             [8086] 
    AND r/m16,imm16               ; o16 81 /4 iw         [8086] 
    AND r/m32,imm32               ; o32 81 /4 id         [386]
    

    AND r/m16,imm8                ; o16 83 /4 ib         [8086] 
    AND r/m32,imm8                ; o32 83 /4 ib         [386]
    

    AND AL,imm8                   ; 24 ib                [8086] 
    AND AX,imm16                  ; o16 25 iw            [8086] 
    AND EAX,imm32                 ; o32 25 id            [386]
    

    AND performs a bitwise AND operation between its two operands (i.e. each bit of the result is 1 if and only if the corresponding bits of the two inputs were both 1), and stores the result in the destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    The MMX instruction PAND (see section B.205) performs the same operation on the 64-bit MMX registers.

    B.12 ANDNPD: Bitwise Logical AND NOT of Packed Double-Precision FP Values

    ANDNPD xmm1,xmm2/mem128       ; 66 0F 55 /r     [WILLAMETTE,SSE2]
    

    ANDNPD inverts the bits of the two double-precision floating-point values in the destination register, and then performs a logical AND between the two double-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-63]   := src[0-63]   AND NOT dst[0-63], 
       dst[64-127] := src[64-127] AND NOT dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.13 ANDNPS: Bitwise Logical AND NOT of Packed Single-Precision FP Values

    ANDNPS xmm1,xmm2/mem128       ; 0F 55 /r        [KATMAI,SSE]
    

    ANDNPS inverts the bits of the four single-precision floating-point values in the destination register, and then performs a logical AND between the four single-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-31]   := src[0-31]   AND NOT dst[0-31], 
       dst[32-63]  := src[32-63]  AND NOT dst[32-63], 
       dst[64-95]  := src[64-95]  AND NOT dst[64-95], 
       dst[96-127] := src[96-127] AND NOT dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.14 ANDPD: Bitwise Logical AND For Single FP

    ANDPD xmm1,xmm2/mem128        ; 66 0F 54 /r     [WILLAMETTE,SSE2]
    

    ANDPD performs a bitwise logical AND of the two double-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-63]   := src[0-63]   AND dst[0-63], 
       dst[64-127] := src[64-127] AND dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.15 ANDPS: Bitwise Logical AND For Single FP

    ANDPS xmm1,xmm2/mem128        ; 0F 54 /r        [KATMAI,SSE]
    

    ANDPS performs a bitwise logical AND of the four single-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-31]   := src[0-31]   AND dst[0-31], 
       dst[32-63]  := src[32-63]  AND dst[32-63], 
       dst[64-95]  := src[64-95]  AND dst[64-95], 
       dst[96-127] := src[96-127] AND dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.16 ARPL: Adjust RPL Field of Selector

    ARPL r/m16,reg16              ; 63 /r                [286,PRIV]
    

    ARPL expects its two word operands to be segment selectors. It adjusts the RPL (reque documented as such.

  • CYRIX indicates that the instruction is specific to Cyrix processors, for example the extra MMX instructions in the Cyrix extended MMX instruction set.
  • FPU indicates that the instruction is a floating-point one, and will only run on machines with a coprocessor (automatically including 486DX, Pentium and above).
  • KATMAI indicates that the instruction was introduced as part of the Katmai New Instruction set. These instructions are available on the Pentium III and later processors. Those which are not specifically SSE instructions are also available on the AMD Athlon.
  • MMX indicates that the instruction is an MMX one, and will run on MMX-capable Pentium processors and the Pentium II.
  • PRIV indicates that the instruction is a protected-mode management instruction. Many of these may only be used in protected mode, or only at privilege level zero.
  • SSE and SSE2 indicate that the instruction is a Streaming SIMD Extension instruction. These instructions operate on multiple values in a single operation. SSE was introduced with the Pentium III and SSE2 was introduced with the Pentium 4.
  • UNDOC indicates that the instruction is an undocumented one, and not part of the official Intel Architecture; it may or may not be supported on any given machine.
  • WILLAMETTE indicates that the instruction was introduced as part of the new instruction set in the Pentium 4 and Intel Xeon processors. These instructions are also known as SSE2 instructions.

    B.4 AAA, AAS, AAM, AAD: ASCII Adjustments

    AAA                           ; 37                   [8086]
    

    AAS                           ; 3F                   [8086]
    

    AAD                           ; D5 0A                [8086] 
    AAD imm                       ; D5 ib                [8086]
    

    AAM                           ; D4 0A                [8086] 
    AAM imm                       ; D4 ib                [8086]
    

    These instructions are used in conjunction with the add, subtract, multiply and divide instructions to perform binary-coded decimal arithmetic in unpacked (one BCD digit per byte - easy to translate to and from ASCII, hence the instruction names) form. There are also packed BCD instructions DAA and DAS: see section B.60.

    B.5 ADC: Add with Carry

    ADC r/m8,reg8                 ; 10 /r                [8086] 
    ADC r/m16,reg16               ; o16 11 /r            [8086] 
    ADC r/m32,reg32               ; o32 11 /r            [386]
    

    ADC reg8,r/m8                 ; 12 /r                [8086] 
    ADC reg16,r/m16               ; o16 13 /r            [8086] 
    ADC reg32,r/m32               ; o32 13 /r            [386]
    

    ADC r/m8,imm8                 ; 80 /2 ib             [8086] 
    ADC r/m16,imm16               ; o16 81 /2 iw         [8086] 
    ADC r/m32,imm32               ; o32 81 /2 id         [386]
    

    ADC r/m16,imm8                ; o16 83 /2 ib         [8086] 
    ADC r/m32,imm8                ; o32 83 /2 ib         [386]
    

    ADC AL,imm8                   ; 14 ib                [8086] 
    ADC AX,imm16                  ; o16 15 iw            [8086] 
    ADC EAX,imm32                 ; o32 15 id            [386]
    

    ADC performs integer addition: it adds its two operands together, plus the value of the carry flag, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    To add two numbers without also adding the contents of the carry flag, use ADD (section B.6).

    B.6 ADD: Add Integers

    ADD r/m8,reg8                 ; 00 /r                [8086] 
    ADD r/m16,reg16               ; o16 01 /r            [8086] 
    ADD r/m32,reg32               ; o32 01 /r            [386]
    

    ADD reg8,r/m8                 ; 02 /r                [8086] 
    ADD reg16,r/m16               ; o16 03 /r            [8086] 
    ADD reg32,r/m32               ; o32 03 /r            [386]
    

    ADD r/m8,imm8                 ; 80 /0 ib             [8086] 
    ADD r/m16,imm16               ; o16 81 /0 iw         [8086] 
    ADD r/m32,imm32               ; o32 81 /0 id         [386]
    

    ADD r/m16,imm8                ; o16 83 /0 ib         [8086] 
    ADD r/m32,imm8                ; o32 83 /0 ib         [386]
    

    ADD AL,imm8                   ; 04 ib                [8086] 
    ADD AX,imm16                  ; o16 05 iw            [8086] 
    ADD EAX,imm32                 ; o32 05 id            [386]
    

    ADD performs integer addition: it adds its two operands together, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    B.7 ADDPD: ADD Packed Double-Precision FP Values

    ADDPD xmm1,xmm2/mem128        ; 66 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDPD performs addition on each of two packed double-precision FP value pairs.

       dst[0-63]   := dst[0-63]   + src[0-63], 
       dst[64-127] := dst[64-127] + src[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.8 ADDPS: ADD Packed Single-Precision FP Values

    ADDPS xmm1,xmm2/mem128        ; 0F 58 /r        [KATMAI,SSE]
    

    ADDPS performs addition on each of four packed single-precision FP value pairs

       dst[0-31]   := dst[0-31]   + src[0-31], 
       dst[32-63]  := dst[32-63]  + src[32-63], 
       dst[64-95]  := dst[64-95]  + src[64-95], 
       dst[96-127] := dst[96-127] + src[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.9 ADDSD: ADD Scalar Double-Precision FP Values

    ADDSD xmm1,xmm2/mem64         ; F2 0F 58 /r     [KATMAI,SSE]
    

    ADDSD adds the low double-precision FP values from the source and destination operands and stores the double-precision FP result in the destination operand.

       dst[0-63]   := dst[0-63] + src[0-63], 
       dst[64-127) remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 64-bit memory location.

    B.10 ADDSS: ADD Scalar Single-Precision FP Values

    ADDSS xmm1,xmm2/mem32         ; F3 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDSD adds the low single-precision FP values from the source and destination operands and stores the single-precision FP result in the destination operand.

       dst[0-31]   := dst[0-31] + src[0-31], 
       dst[32-127] remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 32-bit memory location.

    B.11 AND: Bitwise AND

    AND r/m8,reg8                 ; 20 /r                [8086] 
    AND r/m16,reg16               ; o16 21 /r            [8086] 
    AND r/m32,reg32               ; o32 21 /r            [386]
    

    AND reg8,r/m8                 ; 22 /r                [8086] 
    AND reg16,r/m16               ; o16 23 /r            [8086] 
    AND reg32,r/m32               ; o32 23 /r            [386]
    

    AND r/m8,imm8                 ; 80 /4 ib             [8086] 
    AND r/m16,imm16               ; o16 81 /4 iw         [8086] 
    AND r/m32,imm32               ; o32 81 /4 id         [386]
    

    AND r/m16,imm8                ; o16 83 /4 ib         [8086] 
    AND r/m32,imm8                ; o32 83 /4 ib         [386]
    

    AND AL,imm8                   ; 24 ib                [8086] 
    AND AX,imm16                  ; o16 25 iw            [8086] 
    AND EAX,imm32                 ; o32 25 id            [386]
    

    AND performs a bitwise AND operation between its two operands (i.e. each bit of the result is 1 if and only if the corresponding bits of the two inputs were both 1), and stores the result in the destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    The MMX instruction PAND (see section B.205) performs the same operation on the 64-bit MMX registers.

    B.12 ANDNPD: Bitwise Logical AND NOT of Packed Double-Precision FP Values

    ANDNPD xmm1,xmm2/mem128       ; 66 0F 55 /r     [WILLAMETTE,SSE2]
    

    ANDNPD inverts the bits of the two double-precision floating-point values in the destination register, and then performs a logical AND between the two double-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-63]   := src[0-63]   AND NOT dst[0-63], 
       dst[64-127] := src[64-127] AND NOT dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.13 ANDNPS: Bitwise Logical AND NOT of Packed Single-Precision FP Values

    ANDNPS xmm1,xmm2/mem128       ; 0F 55 /r        [KATMAI,SSE]
    

    ANDNPS inverts the bits of the four single-precision floating-point values in the destination register, and then performs a logical AND between the four single-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-31]   := src[0-31]   AND NOT dst[0-31], 
       dst[32-63]  := src[32-63]  AND NOT dst[32-63], 
       dst[64-95]  := src[64-95]  AND NOT dst[64-95], 
       dst[96-127] := src[96-127] AND NOT dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.14 ANDPD: Bitwise Logical AND For Single FP

    ANDPD xmm1,xmm2/mem128        ; 66 0F 54 /r     [WILLAMETTE,SSE2]
    

    ANDPD performs a bitwise logical AND of the two double-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-63]   := src[0-63]   AND dst[0-63], 
       dst[64-127] := src[64-127] AND dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.15 ANDPS: Bitwise Logical AND For Single FP

    ANDPS xmm1,xmm2/mem128        ; 0F 54 /r        [KATMAI,SSE]
    

    ANDPS performs a bitwise logical AND of the four single-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-31]   := src[0-31]   AND dst[0-31], 
       dst[32-63]  := src[32-63]  AND dst[32-63], 
       dst[64-95]  := src[64-95]  AND dst[64-95], 
       dst[96-127] := src[96-127] AND dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.16 ARPL: Adjust RPL Field of Selector

    ARPL r/m16,reg16              ; 63 /r                [286,PRIV]
    

    ARPL expects its two word operands to be segment selectors. It adjusts the RPL (reque documented as such.

  • CYRIX indicates that the instruction is specific to Cyrix processors, for example the extra MMX instructions in the Cyrix extended MMX instruction set.
  • FPU indicates that the instruction is a floating-point one, and will only run on machines with a coprocessor (automatically including 486DX, Pentium and above).
  • KATMAI indicates that the instruction was introduced as part of the Katmai New Instruction set. These instructions are available on the Pentium III and later processors. Those which are not specifically SSE instructions are also available on the AMD Athlon.
  • MMX indicates that the instruction is an MMX one, and will run on MMX-capable Pentium processors and the Pentium II.
  • PRIV indicates that the instruction is a protected-mode management instruction. Many of these may only be used in protected mode, or only at privilege level zero.
  • SSE and SSE2 indicate that the instruction is a Streaming SIMD Extension instruction. These instructions operate on multiple values in a single operation. SSE was introduced with the Pentium III and SSE2 was introduced with the Pentium 4.
  • UNDOC indicates that the instruction is an undocumented one, and not part of the official Intel Architecture; it may or may not be supported on any given machine.
  • WILLAMETTE indicates that the instruction was introduced as part of the new instruction set in the Pentium 4 and Intel Xeon processors. These instructions are also known as SSE2 instructions.

    B.4 AAA, AAS, AAM, AAD: ASCII Adjustments

    AAA                           ; 37                   [8086]
    

    AAS                           ; 3F                   [8086]
    

    AAD                           ; D5 0A                [8086] 
    AAD imm                       ; D5 ib                [8086]
    

    AAM                           ; D4 0A                [8086] 
    AAM imm                       ; D4 ib                [8086]
    

    These instructions are used in conjunction with the add, subtract, multiply and divide instructions to perform binary-coded decimal arithmetic in unpacked (one BCD digit per byte - easy to translate to and from ASCII, hence the instruction names) form. There are also packed BCD instructions DAA and DAS: see section B.60.

    B.5 ADC: Add with Carry

    ADC r/m8,reg8                 ; 10 /r                [8086] 
    ADC r/m16,reg16               ; o16 11 /r            [8086] 
    ADC r/m32,reg32               ; o32 11 /r            [386]
    

    ADC reg8,r/m8                 ; 12 /r                [8086] 
    ADC reg16,r/m16               ; o16 13 /r            [8086] 
    ADC reg32,r/m32               ; o32 13 /r            [386]
    

    ADC r/m8,imm8                 ; 80 /2 ib             [8086] 
    ADC r/m16,imm16               ; o16 81 /2 iw         [8086] 
    ADC r/m32,imm32               ; o32 81 /2 id         [386]
    

    ADC r/m16,imm8                ; o16 83 /2 ib         [8086] 
    ADC r/m32,imm8                ; o32 83 /2 ib         [386]
    

    ADC AL,imm8                   ; 14 ib                [8086] 
    ADC AX,imm16                  ; o16 15 iw            [8086] 
    ADC EAX,imm32                 ; o32 15 id            [386]
    

    ADC performs integer addition: it adds its two operands together, plus the value of the carry flag, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    To add two numbers without also adding the contents of the carry flag, use ADD (section B.6).

    B.6 ADD: Add Integers

    ADD r/m8,reg8                 ; 00 /r                [8086] 
    ADD r/m16,reg16               ; o16 01 /r            [8086] 
    ADD r/m32,reg32               ; o32 01 /r            [386]
    

    ADD reg8,r/m8                 ; 02 /r                [8086] 
    ADD reg16,r/m16               ; o16 03 /r            [8086] 
    ADD reg32,r/m32               ; o32 03 /r            [386]
    

    ADD r/m8,imm8                 ; 80 /0 ib             [8086] 
    ADD r/m16,imm16               ; o16 81 /0 iw         [8086] 
    ADD r/m32,imm32               ; o32 81 /0 id         [386]
    

    ADD r/m16,imm8                ; o16 83 /0 ib         [8086] 
    ADD r/m32,imm8                ; o32 83 /0 ib         [386]
    

    ADD AL,imm8                   ; 04 ib                [8086] 
    ADD AX,imm16                  ; o16 05 iw            [8086] 
    ADD EAX,imm32                 ; o32 05 id            [386]
    

    ADD performs integer addition: it adds its two operands together, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    B.7 ADDPD: ADD Packed Double-Precision FP Values

    ADDPD xmm1,xmm2/mem128        ; 66 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDPD performs addition on each of two packed double-precision FP value pairs.

       dst[0-63]   := dst[0-63]   + src[0-63], 
       dst[64-127] := dst[64-127] + src[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.8 ADDPS: ADD Packed Single-Precision FP Values

    ADDPS xmm1,xmm2/mem128        ; 0F 58 /r        [KATMAI,SSE]
    

    ADDPS performs addition on each of four packed single-precision FP value pairs

       dst[0-31]   := dst[0-31]   + src[0-31], 
       dst[32-63]  := dst[32-63]  + src[32-63], 
       dst[64-95]  := dst[64-95]  + src[64-95], 
       dst[96-127] := dst[96-127] + src[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.9 ADDSD: ADD Scalar Double-Precision FP Values

    ADDSD xmm1,xmm2/mem64         ; F2 0F 58 /r     [KATMAI,SSE]
    

    ADDSD adds the low double-precision FP values from the source and destination operands and stores the double-precision FP result in the destination operand.

       dst[0-63]   := dst[0-63] + src[0-63], 
       dst[64-127) remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 64-bit memory location.

    B.10 ADDSS: ADD Scalar Single-Precision FP Values

    ADDSS xmm1,xmm2/mem32         ; F3 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDSD adds the low single-precision FP values from the source and destination operands and stores the single-precision FP result in the destination operand.

       dst[0-31]   := dst[0-31] + src[0-31], 
       dst[32-127] remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 32-bit memory location.

    B.11 AND: Bitwise AND

    AND r/m8,reg8                 ; 20 /r                [8086] 
    AND r/m16,reg16               ; o16 21 /r            [8086] 
    AND r/m32,reg32               ; o32 21 /r            [386]
    

    AND reg8,r/m8                 ; 22 /r                [8086] 
    AND reg16,r/m16               ; o16 23 /r            [8086] 
    AND reg32,r/m32               ; o32 23 /r            [386]
    

    AND r/m8,imm8                 ; 80 /4 ib             [8086] 
    AND r/m16,imm16               ; o16 81 /4 iw         [8086] 
    AND r/m32,imm32               ; o32 81 /4 id         [386]
    

    AND r/m16,imm8                ; o16 83 /4 ib         [8086] 
    AND r/m32,imm8                ; o32 83 /4 ib         [386]
    

    AND AL,imm8                   ; 24 ib                [8086] 
    AND AX,imm16                  ; o16 25 iw            [8086] 
    AND EAX,imm32                 ; o32 25 id            [386]
    

    AND performs a bitwise AND operation between its two operands (i.e. each bit of the result is 1 if and only if the corresponding bits of the two inputs were both 1), and stores the result in the destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    The MMX instruction PAND (see section B.205) performs the same operation on the 64-bit MMX registers.

    B.12 ANDNPD: Bitwise Logical AND NOT of Packed Double-Precision FP Values

    ANDNPD xmm1,xmm2/mem128       ; 66 0F 55 /r     [WILLAMETTE,SSE2]
    

    ANDNPD inverts the bits of the two double-precision floating-point values in the destination register, and then performs a logical AND between the two double-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-63]   := src[0-63]   AND NOT dst[0-63], 
       dst[64-127] := src[64-127] AND NOT dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.13 ANDNPS: Bitwise Logical AND NOT of Packed Single-Precision FP Values

    ANDNPS xmm1,xmm2/mem128       ; 0F 55 /r        [KATMAI,SSE]
    

    ANDNPS inverts the bits of the four single-precision floating-point values in the destination register, and then performs a logical AND between the four single-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-31]   := src[0-31]   AND NOT dst[0-31], 
       dst[32-63]  := src[32-63]  AND NOT dst[32-63], 
       dst[64-95]  := src[64-95]  AND NOT dst[64-95], 
       dst[96-127] := src[96-127] AND NOT dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.14 ANDPD: Bitwise Logical AND For Single FP

    ANDPD xmm1,xmm2/mem128        ; 66 0F 54 /r     [WILLAMETTE,SSE2]
    

    ANDPD performs a bitwise logical AND of the two double-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-63]   := src[0-63]   AND dst[0-63], 
       dst[64-127] := src[64-127] AND dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.15 ANDPS: Bitwise Logical AND For Single FP

    ANDPS xmm1,xmm2/mem128        ; 0F 54 /r        [KATMAI,SSE]
    

    ANDPS performs a bitwise logical AND of the four single-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-31]   := src[0-31]   AND dst[0-31], 
       dst[32-63]  := src[32-63]  AND dst[32-63], 
       dst[64-95]  := src[64-95]  AND dst[64-95], 
       dst[96-127] := src[96-127] AND dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.16 ARPL: Adjust RPL Field of Selector

    ARPL r/m16,reg16              ; 63 /r                [286,PRIV]
    

    ARPL expects its two word operands to be segment selectors. It adjusts the RPL (reque documented as such.

  • CYRIX indicates that the instruction is specific to Cyrix processors, for example the extra MMX instructions in the Cyrix extended MMX instruction set.
  • FPU indicates that the instruction is a floating-point one, and will only run on machines with a coprocessor (automatically including 486DX, Pentium and above).
  • KATMAI indicates that the instruction was introduced as part of the Katmai New Instruction set. These instructions are available on the Pentium III and later processors. Those which are not specifically SSE instructions are also available on the AMD Athlon.
  • MMX indicates that the instruction is an MMX one, and will run on MMX-capable Pentium processors and the Pentium II.
  • PRIV indicates that the instruction is a protected-mode management instruction. Many of these may only be used in protected mode, or only at privilege level zero.
  • SSE and SSE2 indicate that the instruction is a Streaming SIMD Extension instruction. These instructions operate on multiple values in a single operation. SSE was introduced with the Pentium III and SSE2 was introduced with the Pentium 4.
  • UNDOC indicates that the instruction is an undocumented one, and not part of the official Intel Architecture; it may or may not be supported on any given machine.
  • WILLAMETTE indicates that the instruction was introduced as part of the new instruction set in the Pentium 4 and Intel Xeon processors. These instructions are also known as SSE2 instructions.

    B.4 AAA, AAS, AAM, AAD: ASCII Adjustments

    AAA                           ; 37                   [8086]
    

    AAS                           ; 3F                   [8086]
    

    AAD                           ; D5 0A                [8086] 
    AAD imm                       ; D5 ib                [8086]
    

    AAM                           ; D4 0A                [8086] 
    AAM imm                       ; D4 ib                [8086]
    

    These instructions are used in conjunction with the add, subtract, multiply and divide instructions to perform binary-coded decimal arithmetic in unpacked (one BCD digit per byte - easy to translate to and from ASCII, hence the instruction names) form. There are also packed BCD instructions DAA and DAS: see section B.60.

    B.5 ADC: Add with Carry

    ADC r/m8,reg8                 ; 10 /r                [8086] 
    ADC r/m16,reg16               ; o16 11 /r            [8086] 
    ADC r/m32,reg32               ; o32 11 /r            [386]
    

    ADC reg8,r/m8                 ; 12 /r                [8086] 
    ADC reg16,r/m16               ; o16 13 /r            [8086] 
    ADC reg32,r/m32               ; o32 13 /r            [386]
    

    ADC r/m8,imm8                 ; 80 /2 ib             [8086] 
    ADC r/m16,imm16               ; o16 81 /2 iw         [8086] 
    ADC r/m32,imm32               ; o32 81 /2 id         [386]
    

    ADC r/m16,imm8                ; o16 83 /2 ib         [8086] 
    ADC r/m32,imm8                ; o32 83 /2 ib         [386]
    

    ADC AL,imm8                   ; 14 ib                [8086] 
    ADC AX,imm16                  ; o16 15 iw            [8086] 
    ADC EAX,imm32                 ; o32 15 id            [386]
    

    ADC performs integer addition: it adds its two operands together, plus the value of the carry flag, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    To add two numbers without also adding the contents of the carry flag, use ADD (section B.6).

    B.6 ADD: Add Integers

    ADD r/m8,reg8                 ; 00 /r                [8086] 
    ADD r/m16,reg16               ; o16 01 /r            [8086] 
    ADD r/m32,reg32               ; o32 01 /r            [386]
    

    ADD reg8,r/m8                 ; 02 /r                [8086] 
    ADD reg16,r/m16               ; o16 03 /r            [8086] 
    ADD reg32,r/m32               ; o32 03 /r            [386]
    

    ADD r/m8,imm8                 ; 80 /0 ib             [8086] 
    ADD r/m16,imm16               ; o16 81 /0 iw         [8086] 
    ADD r/m32,imm32               ; o32 81 /0 id         [386]
    

    ADD r/m16,imm8                ; o16 83 /0 ib         [8086] 
    ADD r/m32,imm8                ; o32 83 /0 ib         [386]
    

    ADD AL,imm8                   ; 04 ib                [8086] 
    ADD AX,imm16                  ; o16 05 iw            [8086] 
    ADD EAX,imm32                 ; o32 05 id            [386]
    

    ADD performs integer addition: it adds its two operands together, and leaves the result in its destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    The flags are set according to the result of the operation: in particular, the carry flag is affected and can be used by a subsequent ADC instruction.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    B.7 ADDPD: ADD Packed Double-Precision FP Values

    ADDPD xmm1,xmm2/mem128        ; 66 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDPD performs addition on each of two packed double-precision FP value pairs.

       dst[0-63]   := dst[0-63]   + src[0-63], 
       dst[64-127] := dst[64-127] + src[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.8 ADDPS: ADD Packed Single-Precision FP Values

    ADDPS xmm1,xmm2/mem128        ; 0F 58 /r        [KATMAI,SSE]
    

    ADDPS performs addition on each of four packed single-precision FP value pairs

       dst[0-31]   := dst[0-31]   + src[0-31], 
       dst[32-63]  := dst[32-63]  + src[32-63], 
       dst[64-95]  := dst[64-95]  + src[64-95], 
       dst[96-127] := dst[96-127] + src[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.9 ADDSD: ADD Scalar Double-Precision FP Values

    ADDSD xmm1,xmm2/mem64         ; F2 0F 58 /r     [KATMAI,SSE]
    

    ADDSD adds the low double-precision FP values from the source and destination operands and stores the double-precision FP result in the destination operand.

       dst[0-63]   := dst[0-63] + src[0-63], 
       dst[64-127) remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 64-bit memory location.

    B.10 ADDSS: ADD Scalar Single-Precision FP Values

    ADDSS xmm1,xmm2/mem32         ; F3 0F 58 /r     [WILLAMETTE,SSE2]
    

    ADDSD adds the low single-precision FP values from the source and destination operands and stores the single-precision FP result in the destination operand.

       dst[0-31]   := dst[0-31] + src[0-31], 
       dst[32-127] remains unchanged.
    

    The destination is an XMM register. The source operand can be either an XMM register or a 32-bit memory location.

    B.11 AND: Bitwise AND

    AND r/m8,reg8                 ; 20 /r                [8086] 
    AND r/m16,reg16               ; o16 21 /r            [8086] 
    AND r/m32,reg32               ; o32 21 /r            [386]
    

    AND reg8,r/m8                 ; 22 /r                [8086] 
    AND reg16,r/m16               ; o16 23 /r            [8086] 
    AND reg32,r/m32               ; o32 23 /r            [386]
    

    AND r/m8,imm8                 ; 80 /4 ib             [8086] 
    AND r/m16,imm16               ; o16 81 /4 iw         [8086] 
    AND r/m32,imm32               ; o32 81 /4 id         [386]
    

    AND r/m16,imm8                ; o16 83 /4 ib         [8086] 
    AND r/m32,imm8                ; o32 83 /4 ib         [386]
    

    AND AL,imm8                   ; 24 ib                [8086] 
    AND AX,imm16                  ; o16 25 iw            [8086] 
    AND EAX,imm32                 ; o32 25 id            [386]
    

    AND performs a bitwise AND operation between its two operands (i.e. each bit of the result is 1 if and only if the corresponding bits of the two inputs were both 1), and stores the result in the destination (first) operand. The destination operand can be a register or a memory location. The source operand can be a register, a memory location or an immediate value.

    In the forms with an 8-bit immediate second operand and a longer first operand, the second operand is considered to be signed, and is sign-extended to the length of the first operand. In these cases, the BYTE qualifier is necessary to force NASM to generate this form of the instruction.

    The MMX instruction PAND (see section B.205) performs the same operation on the 64-bit MMX registers.

    B.12 ANDNPD: Bitwise Logical AND NOT of Packed Double-Precision FP Values

    ANDNPD xmm1,xmm2/mem128       ; 66 0F 55 /r     [WILLAMETTE,SSE2]
    

    ANDNPD inverts the bits of the two double-precision floating-point values in the destination register, and then performs a logical AND between the two double-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-63]   := src[0-63]   AND NOT dst[0-63], 
       dst[64-127] := src[64-127] AND NOT dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.13 ANDNPS: Bitwise Logical AND NOT of Packed Single-Precision FP Values

    ANDNPS xmm1,xmm2/mem128       ; 0F 55 /r        [KATMAI,SSE]
    

    ANDNPS inverts the bits of the four single-precision floating-point values in the destination register, and then performs a logical AND between the four single-precision floating-point values in the source operand and the temporary inverted result, storing the result in the destination register.

       dst[0-31]   := src[0-31]   AND NOT dst[0-31], 
       dst[32-63]  := src[32-63]  AND NOT dst[32-63], 
       dst[64-95]  := src[64-95]  AND NOT dst[64-95], 
       dst[96-127] := src[96-127] AND NOT dst[96-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.14 ANDPD: Bitwise Logical AND For Single FP

    ANDPD xmm1,xmm2/mem128        ; 66 0F 54 /r     [WILLAMETTE,SSE2]
    

    ANDPD performs a bitwise logical AND of the two double-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-63]   := src[0-63]   AND dst[0-63], 
       dst[64-127] := src[64-127] AND dst[64-127].
    

    The destination is an XMM register. The source operand can be either an XMM register or a 128-bit memory location.

    B.15 ANDPS: Bitwise Logical AND For Single FP

    ANDPS xmm1,xmm2/mem128        ; 0F 54 /r        [KATMAI,SSE]
    

    ANDPS performs a bitwise logical AND of the four single-precision floating point values in the source and destination operand, and stores the result in the destination register.

       dst[0-31]   := src[0-31]   AND dst[0-31], 
       dst[32-63]  := src[32-63]  AND dst[32-63], 
       dst[64-95]  := src[64-95]  AND dst[64-95], 
       dst[96-127] := src[96-127] AND dst[96-127].
    

    The destination