80x86 Integer Instruction Set (8088 - Pentium)

Click FPU opcodes for floating point instructions

Jump to end of legend

Legend:

 General
 acc   = AL, AX or EAX unless specified otherwise
 reg   = any general register
 r8    = any 8-bit register
 r16   = any general purpose 16-bit register
 r32   = any general purpose 32-bit register
 imm   = immediate data
 imm8  = 8-bit immediate data
 imm16 = 16-bit immediate data
 mem   = memory address
 mem8  = address of 8-bit data item
 mem16 = address of 16-bit data item
 mem32 = address of 32-bit data item
 mem48 = address of 48-bit data item
 dest  = 16/32-bit destination
 short = 8-bit destination

 Integer instruction timings:
  n  -  generally refers to a number of repeated counts
  m  -  in a jump or call;
         286: bytes in next instruction
         386/486: number of components
          (each byte of opcode) + 1 (if immed data) + 1 (if displacement)
  EA = cycles to calculate the Effective Address
       8088/8086:
        base   = 5   BP+DI or BX+SI = 7   BP+DI+disp or BX+SI+disp = 11
        index  = 5   BX+DI or BP+SI = 8   BX+DI+disp or BP+SI+disp = 12
        disp   = 6   segment override = +2
       286 - 486:
        base+index+disp = +1    all others, no penalty

 instruction length:

The byte count includes the opcode length and length of any required
displacement or immediate data. If the displacement is optional, it
is shown as d() with the possible lengths in parentheses. If the
immediate data is optional, it is shown as i() with the possible
lengths in parentheses.

pairing categories for Pentium:

   NP = not pairable
   UV = pairable in the U pipe or V pipe
   PU = pairable in the U pipe only
   PV = pairable in the V pipe only

(end of legend)

Instruction formats, clock cycles and Pentium® Pairing info

AAA     ASCII adjust after addition

                bytes   8088    186     286     386     486     Pentium
                 1       8       8       3       4       3       3   NP

        Example:        aaa


AAD     ASCII adjust AX before division (second byte is divisor)

                bytes   8088    186     286     386     486     Pentium
                 2      60      15      14      19      14      10   NP

        Example:        aad


AAM     ASCII adjust AX after multiply (second byte is divisor)

                bytes   8088    186     286     386     486     Pentium
                 2      83      19      16      17      15      18   NP

        Example:        aam


AAS     ASCII adjust AL after subtraction

                bytes   8088    186     286     386     486     Pentium
                 1       8       7       3       4       3       3   NP

        Example:        aas


ADC     Integer add with carry

    operands    bytes   8088    186     286     386     486     Pentium
    reg, reg     2       3       3       2       2       1       1   PU
    mem, reg  2+d(0,2)  24+EA   10       7       7       3       3   PU
    reg, mem  2+d(0,2)  13+EA   10       7       6       2       2   PU
    reg, imm  2+i(1,2)   4       4       3       2       1       1   PU
    mem, imm  2+d(0,2)  23+EA   16       7       7       3       3   PU*
               +i(1,2)
    acc, imm  1+i(1,2)   4       4       3       2       1       1   PU

        * = not pairable if there is a displacement and immediate

        Example:        adc     eax, ebx


ADD     Integer addition

    operands    bytes   8088    186     286     386     486     Pentium
    reg, reg     2       3       3       2       2       1       1   UV
    mem, reg  2+d(0,2)  24+EA   10       7       7       3       3   UV
    reg, mem  2+d(0,2)  13+EA   10       7       6       2       2   UV
    reg, imm  2+i(1,2)   4       4       3       2       1       1   UV
    mem, imm  2+d(0,2)  23+EA   16       7       7       3       3   UV*
               +i(1,2)
    acc, imm  1+i(1,2)   4       4       3       2       1       1   UV

        * = not pairable if there is a displacement and immediate

        Example:        add     eax, ebx


AND     Logical AND

    operands    bytes   8088    186     286     386     486     Pentium
    reg, reg     2       3       3       2       2       1       1   UV
    mem, reg  2+d(0,2)  24+EA   10       7       7       3       3   UV
    reg, mem  2+d(0,2)  13+EA   10       7       6       2       2   UV
    reg, imm  2+i(1,2)   4       4       3       2       1       1   UV
    mem, imm  2+d(0,2)  23+EA   16       7       7       3       3   UV*
               +i(1,2)
    acc, imm  1+i(1,2)   4       4       3       2       1       1   UV

        * = not pairable if there is a displacement and immediate

        Example:        and     eax, ebx


ARPL    Adjust RPL field of selector (286+)

     operands   bytes                   286     386     486     Pentium
     reg, reg    2                      10      20       9       7   NP
     mem, reg  2+d(0-2)                 11      21       9       7   NP

        Example:        arpl    ax, bx


BOUND   Check array index against bounds (186+)

      operands  bytes           186     286     386     486     Pentium
      reg, mem    4             35      13      10       7       8   NP

        Example:        bound   bx, array


BSF     Bit scan forward (386+)

    operands    bytes                           386     486     Pentium
    r16, r16     3                             10+3n    6-42   6-34  NP
    r32, r32     3                             10+3n    6-42   6-42  NP
    r16, m16  3+d(0,1,2)                       10+3n    7-43   6-35  NP
    r32, m32  3+d(0,1,2,4)                     10+3n    7-43   6-43  NP

        Example:        bsf     eax, [esi]


BSR     Bit scan reverse (386+)

    operands    bytes                           386     486     Pentium
    r16, r16     3                             10+3n    6-103  7-39  NP
    r32, r32     3                             10+3n    7-104  7-71  NP
    r16, m16  3+d(0,1,2)                       10+3n    6-103  7-40  NP
    r32, m32  3+d(0,1,2,4)                     10+3n    7-104  7-72  NP

        Example:        bsr     eax, [esi]


BSWAP  Byte swap (486+)

      operand   bytes                                   486     Pentium
      r32        2                                       1       1   NP

        Example:        bswap   eax


BT      Bit test (386+)

   operands     bytes                           386     486     Pentium
   reg, reg      3                               3       3       4   NP
   mem, reg    3+d(0,1,2,4)                     12       8       9   NP
   reg, imm8     3+i(1)                          3       3       4   NP
   mem, imm8   3+d(0,1,2,4)+i(1)                 6       3       4   NP

        Example:        bt      eax, 4


BTC     Bit test and complement (386+)

    operands    bytes                           386     486     Pentium
    reg, reg     3                               6       6       7   NP
    mem, reg   3+d(0,1,2,4)                     13      13      13   NP
    reg, imm8    3+i(1)                          6       6       7   NP
    mem, imm8  3+d(0,1,2,4)+i(1)                 8       8       8   NP

        Example:        btc     eax, 4


BTR     Bit test and reset (386+)

    operands    bytes                           386     486     Pentium
    reg, reg     3                               6       6       7   NP
    mem, reg   3+d(0,1,2,4)                     13      13      13   NP
    reg, imm8    3+i(1)                          6       6       7   NP
    mem, imm8  3+d(0,1,2,4)+i(1)                 8       8       8   NP

        Example:        btr     eax, 4


BTS     Bit test and set (386+)

    operands    bytes                           386     486     Pentium
    reg, reg     3                               6       6       7   NP
    mem, reg   3+d(0,1,2,4)                     13      13      13   NP
    reg, imm8    3+i(1)                          6       6       7   NP
    mem, imm8  3+d(0,1,2,4)+i(1)                 8       8       8   NP

        Example:        bts     eax, 4


CALL    Call subroutine

     operand    bytes   8088    186     286     386     486     Pentium
     near        3      23      14      7+m     7+m      3       1   PV
     reg         2      20      13      7+m     7+m      5       2   NP
     mem16    2+d(0-2)  29+EA   19      11+m    10+m     5       2   NP
     far         5      36      23      13+m    17+m    18       4   NP
     mem32    2+d(0-2)  53+EA   38      16+m    22+m    17       4   NP


                             Protected Mode

     operand    bytes                   286     386     486     Pentium
     far         5                      26+m    34+m    20     4-13  NP
     mem32    2+d(0-2)                  29+m    38+m    20     5-14  NP

            cycles not shown for calls through call and task gates

        Example:        call    my_function


CBW     Convert byte to word   (AL --> AX)

                bytes   8088    186     286     386     486     Pentium
                 1       2       2       2       3       3       3   NP

        Example:        cbw


CWDE    Convert word to dword (386+)  (AX --> EAX)

                bytes                           386     486     Pentium
                 1                               3       3       3   NP

        Example:        cwde


CWD     Convert word to double  (AX --> DX:AX)

                bytes   8088    186     286     386     486     Pentium
                 1       5       4       2       2       3       2   NP

        Example:        cwd


CDQ     Convert double to quad   (EAX --> EDX:EAX)

                bytes                           386     486     Pentium
                 1                               2       3       2   NP

        Example:        cdq


CLC     Clear the carry flag

                bytes   8088    186     286     386     486     Pentium
                 1       2       2       2       2       2       2   NP

        Example:        clc


CLD     Clear the direction flag (set to forward direction)

                bytes   8088    186     286     386     486     Pentium
                 1       2       2       2       2       2       2   NP

        Example:        cld


CLI     Clear the interrupt flag (disable interrupts)

                bytes   8088    186     286     386     486     Pentium
                 1       2       2       3       3       5       7   NP

        Example:        cli


CLTS    Clear task switched flag in CR0 (286+)

                bytes                   286     386     486     Pentium
                 2                       2       5       7      10   NP

        Example:        clts


CMC     Complement carry flag

                bytes   8088    186     286     386     486     Pentium
                 1       2       2       2       2       2       2   NP

        Example:        cmc


CMP     Compare two operands

    operands    bytes   8088    186     286     386     486     Pentium
    reg, reg     2       3       3       2       2       1       1   UV
    mem, reg  2+d(0,2)  13+EA   10       7       5       2       2   UV
    reg, mem  2+d(0,2)  13+EA   10       6       6       2       2   UV
    reg, imm  2+i(1,2)   4       4       3       2       1       1   UV
    mem, imm  2+d(0,2)  14+EA   10       6       5       2       2   UV*
               +i(1,2)
    acc, imm  1+i(1,2)   4       4       3       2       1       1   UV

        * = not pairable if there is a displacement and immediate

        Example:        cmp     eax, 3


CMPS/CMPSB/CMPSW/CMPSD    Compare string operands

  variations    bytes   8088    186     286     386     486     Pentium
  cmpsb          1      30      22       8      10       8       5   NP
  cmpsw          1      -       -        -      10       8       5   NP
  cmpsd          1      -       -        -      10       8       5   NP
  repX cmpsb     2      9+30n   5+22n   5+9n    5+9n    7+7n*   9+4n NP
  repX cmpsw     2      9+30n   5+22n   5+9n    5+9n    7+7n*   9+4n NP
  repX cmpsd     2       -       -       -      5+9n    7+7n*   9+4n NP

    repX = repe, repz, repne or repnz
        * : 5 if n = 0

        Example:        repne cmpsb


CMPXCHG    Compare and Exchange (486+)

        operands        bytes                           486     Pentium
        reg, reg         3                               6       5   NP
        mem, reg       3+d(0-2)                         7-10     6   NP

        Example:        cmpxchg ebx, edx


CMPXCHG8B  Compare and Exchange 8 bytes (Pentium+)

          operands      bytes                                   Pentium
          mem, reg     3+d(0-2)                                 10   NP

        Example:        cmpxchg8b [ebx], edx


CPUID   CPU identification (Pentium+)

                bytes                                           Pentium
                 2                                              14   NP

        Example:        cpuid


DAA     Decimal adjust AL after addition

                bytes   8088    186     286     386     486     Pentium
                 1       4       4       3       4       2       3   NP

        Example:        daa


DAS     Decimal adjust AL after subtraction

                bytes   8088    186     286     386     486     Pentium
                 1       4       4       3       4       2       3   NP

        Example:        das


DEC     Decrement

    operand     bytes   8088    186     286     386     486     Pentium
    r8           2       3       3       2       2       1       1   UV
    r16          1       3       3       2       2       1       1   UV
    r32          1       3       3       2       2       1       1   UV
    mem       2+d(0,2)  23+EA   15       7       6       3       3   UV

        Example:        dec     eax


DIV     Unsigned divide

    operand     bytes   8088    186     286     386     486     Pentium
    r8           2     80-90     29     14      14      16      17   NP
    r16          2    144-162    38     22      22      24      25   NP
    r32          2       -       -       -      38      40      41   NP
    mem8    2+d(0-2)   86-96+EA  35     17      17      16      17   NP
    mem16   2+d(0-2)  150-168+EA 44     25      25      24      25   NP
    mem32   2+d(0-2)     -       -       -      41      40      41   NP

   implied    operand       quotient   remainder
   dividend
   AX      /  byte       =      AL     AH
   DX:AX   /  word       =      AX     DX
   EDX:EAX /  dword      =     EAX     EDX

        Example:        div     ebx


ENTER   Make stack frame for procedure parameters (186+)

      operands  bytes   8088    186     286     386     486     Pentium
      imm16, 0     3     -      15      11      10      14      11   NP
      imm16, 1     4     -      25      15      12      17      15   NP
      imm16, imm8  4     -   22+16n    12+4n   15+4n   17+3i  15+2i  NP
                        n = imm8-1;  i = imm8

        Example:        enter   1, 0


ESC     Escape

escape opcodes D8 - DF are used by floating point instructions



HLT     Halt

                bytes   8088    186     286     386     486     Pentium
                 1       2       2       2       5       4       4   NP

        Example:        hlt


IDIV    Signed divide

     operand    bytes    8088      186    286    386    486     Pentium
     r8          2     101-112    44-52   17     19     19      22   NP
     r16         2     165-184    53-61   25     27     27      30   NP
     r32         2       -          -      -     43     43      46   NP
     mem8   2+d(0-2)  107-118+EA  50-58   20     22     20      22   NP
     mem16  2+d(0-2)  171-190+EA  59-67   28     30     28      30   NP
     mem32  2+d(0-2)     -          -      -     46     44      46   NP

   implied    operand       quotient   remainder
   dividend
   AX      /  byte       =      AL     AH
   DX:AX   /  word       =      AX     DX
   EDX:EAX /  dword      =     EAX     EDX


        Example:        idiv    ebx


IMUL    Signed multiply

                         Accumulator Multiplies

     operand    bytes   8088     186    286     386     486     Pentium
     r8          2      80-98    25-28  13      9-14    13-18   11   NP
     r16         2     128-154   34-37  21      9-22    13-26   11   NP
     r32         2       -        -      -      9-38    13-42   10   NP
     mem8    2+d(0-2)  86-104+EA 32-34  16     12-17    13-18   11   NP
     mem16   2+d(0-2) 134-160+EA 40-43  24     12-25    13-26   11   NP
     mem32   2+d(0-2)    -        -      -     12-41    13-42   10   NP

     implied      operand      result
   multiplicand (multiplier)

        AL    *  byte       =  AX
        AX    *  word       =  DX:AX
        EAX   *  dword      =  EDX:EAX

        Example:        imul    ebx


                        2 and 3 operand Multiplies

     operands       bytes     186   286    386         486      Pentium
     r16, imm      2+i(1,2)    -    21  9-14/9-22  13-18/13-26  10   NP
     r32, imm      2+i(1,2)    -     -     9-38       13-42     10   NP
     r16,r16,imm   2+i(1,2)  22/29  21  9-14/9-22  13-18/13-26  10   NP
     r32,r32,imm   2+i(1,2)    -     -     9-38       13-42     10   NP
     r16,m16,imm   2+d(0-2)  25/32  24 12-17/12-25 13-18/13-26  10   NP
                    +i(1,2)
     r32,m32,imm   2+d(0-2)+i(1,2)   -    12-41       13-42     10   NP
     r16, r16      2+i(1,2)    -     -     9-22    13-18/13-26  10   NP
     r32, r32      2+i(1,2)    -     -     9-38       13-42     10   NP
     r16, m16      2+d(0-2)+i(1,2)   -    12-25    13-18/13-26  10   NP
     r32, m32      2+d(0-2)+i(1,2)   -    12-41       13-42     10   NP

all forms: dest, src                          cycles for:   byte/word
               or                                             dword
           dest, src1, src2


        Example:        imul    eax, ebx, 10


IN      Input from port

    operands    bytes   8088    186     286     386     486     Pentium
    al, imm8     2      14      10       5      12      14       7   NP
    ax, imm8     2      14      10       5      12      14       7   NP
    eax, imm8    2       -       -       -      12      14       7   NP
    al, dx       1      12       8       5      13      14       7   NP
    ax, dx       1      12       8       5      13      14       7   NP
    eax, dx      1       -       -       -      13      14       7   NP

                             Protected mode

   operands     bytes                           386     486     Pentium
   acc, imm      2                           6/26/26  9/29/27  4/21/19 NP
   acc, dx       1                           7/27/27  8/28/27  4/21/19 NP

                   cycles for: CPL <= IOPL / CPL > IOPL / V86


        Example:        in      al, dx


INC     Increment

    operand     bytes   8088    186     286     386     486     Pentium
    r8           2       3       3       2       2       1       1   UV
    r16          1       3       3       2       2       1       1   UV
    r32          1       3       3       2       2       1       1   UV
    mem       2+d(0,2)  23+EA   15       7       6       3       3   UV

        Example:        inc     ebx


INS/INSB/INSW/INSD     Input from port to string

    variations  bytes   8088    186     286     386     486     Pentium
    insb         1       -      14       5      15      17      9    NP
    insw         1       -      14       5      15      17      9    NP
    insd         1       -       -       -      15      17      9    NP

                             Protected Mode

                bytes                           386     486     Pentium
                 1                           9/29/29 10/32/30 6/24/22 NP

                   cycles for: CPL <= IOPL / CPL > IOPL / V86

        Example:        rep insb


INT     Call interrupt procedure

      operands  bytes   8088    186     286     386     486     Pentium
        3        1      72      45      23+m    33      26      13   NP
        imm8     2      71      47      23+m    37      30      16   NP

                             Protected mode

                bytes   8088    186     286     386     486     Pentium
                 1      -       -     (40-78)+m 59-99   44-71  27-82 NP

        Example:        int     21h



INTO    Call interrupt procedure if overflow

                bytes   8088    186     286     386     486     Pentium
                 1      4/73    4/48    3/24+m  3/35    3/28    4/13 NP

                             Protected mode

                bytes                   286     386     486     Pentium
                 1                    (40-78)+m 59-99   44-71  27-56 NP

                          Task switch clocks not shown


        Example:        into


INVD    Invalidate data cache (486+)

                bytes   8088    186     286     386     486     Pentium
                 2       -       -       -       -       4      15   NP

        Example:        invd


INVLPG  Invalidate TLB entry (486+)

      operands  bytes                                   486     Pentium
        mem32   5                                       12      25   NP

        Example:        invlpg  [eax]


IRET    Return from interrupt

                bytes   8088    186     286     386     486     Pentium
                1       44      28      17+m    22      15     8-27  NP

                      Task switch clocks not shown

        Example:        iret


IRETD   32-bit return from interrupt (386+)

                bytes                           386     486     Pentium
                1                               22      15    10-27  NP

                      Task switch clocks not shown

        Example:        iretd


Jcc     Jump on condition code

    operand     bytes   8088    186     286     386     486     Pentium
    near8        2      4/16    4/13    3/7+m   3/7+m   1/3     1    PV
    near16       3       -       -       -      3/7+m   1/3     1    PV

                       cycles for:  no jump/jump

                     conditional jump instructions:

  ja    jump if above                jnbe  jump if not below or equal
  jae   jump if above or equal       jnb   jump if not below
  jb    jump if below                jnae  jump if not above or equal
  jbe   jump if below or equal       jna   jump if not above
  jg    jump if greater              jnle  jump if not less or equal
  jge   jump if greater or equal     jnl   jump if not less
  jl    jump if less                 jnge  jump if not greater or equal
  jle   jump if less or equal        jng   jump if not greater

  je    jump if equal                jz    jump if zero
  jne   jump if not equal            jnz   jump if not zero

  jc    jump if carry                jnc   jump if not carry
  js    jump if sign                 jns   jump if not sign
  jnp   jump if no parity (odd)      jpo   jump if parity odd
  jo    jump if overflow             jno   jump if not overflow
  jp    jump if parity (even)        jpe   jump if parity even

        Example:        jne     not_equal


JCXZ/JECXZ    Jump if CX/ECX = 0

     operand    bytes   8088    186     286     386     486     Pentium
     dest        2      6/18    5/16    4/8+m   5/9+m   5/8     5/6  NP
     dest        2       -       -       -      5/9+m   5/8     5/6  NP

                       cycles for:  no jump/jump

        Example:        jcxz    cx_is_zero


JMP     Unconditional jump

    operand     bytes   8088    186     286     386     486     Pentium
    short        2      15      13      7+m     7+m      3       1   PV
    near         3      15      13      7+m     7+m      3       1   PV
    far          5      15      13     11+m    12+m     17       3   NP
    r16          2      11      11      7+m     7+m      5       2   NP
    mem16      2+d(0,2) 18+EA   17     11+m    10+m      5       2   NP
    mem32      2+d(4)   24+EA   26     15+m    12+m     13       4   NP

    r32          2       -       -       -      7+m      5       2   NP
    mem32      2+d(0,2)  -       -       -     10+m      5       2   NP
    mem48      2+d(6)    -       -       -     12+m     13       4   NP

             cycles for jumps through call gates not shown

        Example:        jmp     target_address


LAHF    Load flags into AH

                bytes   8088    186     286     386     486     Pentium
                 1       4       2       2       2       3       2   NP

        Example:        lahf


LAR     Load access rights byte (286+)

    operands    bytes                   286     386     486     Pentium
    r16, r16     3                      14      15      11       8   NP
    r32, r32     3                       -      15      11       8   NP
    r16, m16     3                      16      16      11       8   NP
    r32, m32     3                       -      16      11       8   NP

        Example:        lar     eax, ebx


LDS     Load far pointer

    operands    bytes   8088    186     286     386     486     Pentium
    reg, mem   2+d(2)   24+EA   18       7       7       6       4   NP

        Example:        lds     si, ptr_1


LES     Load far pointer

    operands    bytes   8088    186     286     386     486     Pentium
    reg, mem   2+d(2)   24+EA   18       7       7       6       4   NP

        Example:        les     di, ptr_2


LFS     Load far pointer (386+)

    operands    bytes                           386     486     Pentium
    reg, mem   3+d(2,4)                          7       6       4   NP

        Example:        lfs     si, ptr_3


LGS     Load far pointer (386+)

    operands    bytes                           386     486     Pentium
    reg, mem   3+d(2,4)                          7       6       4   NP

        Example:        lgs     si, ptr_4


LSS     Load stack segment and offset

    operands    bytes                           386     486     Pentium
    reg, mem   3+d(2,4)                          7       6       4   NP

        Example:        lss     bp, ptr_5


LEA     Load effective address

    operands    bytes   8088    186     286     386     486     Pentium
    r16, mem    2+d(2)  2+EA     6       3       2      1-2      1   UV
    r32, mem    2+d(2)   -       -       -       2      1-2      1   UV

        Example:        lea     eax, [eax+ebx*2+3]


LEAVE   High level procedure exit (186+)

                bytes           186     286     386     486     Pentium
                 1               8       5       4       5       3   NP

        Example:        leave


LGDT    Load global descriptor table register (286+)

    operand     bytes                   286     386     486     Pentium
     mem48       5                      11      11      11       6   NP

        Example:        lgdt    descriptor[ebx]


LIDT    Load interrupt descriptor table register (286+)

    operand     bytes                   286     386     486     Pentium
     mem48       5                      12      11      11       6   NP

        Example:        lidt    descriptor[ebx]


LLDT    Load local descriptor table register (286+)

    operand     bytes                   286     386     486     Pentium
     r16         3                      17      20      11       9   NP
     mem16     3+d(0-2)                 19      24      11       9   NP

        Example:        lldt    ax


LMSW    Load machine status word (286+)

    operand     bytes                   286     386     486     Pentium
     r16         3                       3      10      13       8   NP
     mem16     3+d(0-2)                  6      13      13       8   NP

        Example:        lmsw    ax


LOCK    Lock bus on next instruction (prefix)

                bytes   8088    186     286     386     486     Pentium
                 1       2       2       0       0       1       1   NP

  (Note: xchg always is locked whether it is specified or not)


        Example:        lock    mov     mem, 1


LODS/LODSB/LODSW/LODSD    Load string operand

    variations  bytes   8088    186     286     386     486     Pentium
    lodsb        1      16      10       5       5       5       2   NP
    lodsw        1      16      10       5       5       5       2   NP
    lodsd        1       -       -       -       5       5       2   NP

        Example:        lodsb


LOOP    Loop control with CX counter

      operand   bytes   8088    186     286     386     486     Pentium
      short      2      5/17    5/15    4/8+m   11+m    6/7     5/6  NP

loopw short   (uses CX in 32-bit mode)
loopd short   (uses ECX in 16-bit mode)


        Example:        loop    loop_start


LOOPE/LOOPZ   Loop while equal (or zero)

      operand   bytes   8088    186     286     386     486     Pentium
      short      2      6/18    5/16    4/8     11+m    6/9     7/8  NP

loopew short  (uses CX in 32-bit mode)
loopzw short  (uses CX in 32-bit mode)
looped short  (uses ECX in 16-bit mode)
loopzd short  (uses ECX in 16-bit mode)


        Example:        loope   loop_start


LOOPNE/LOOPNZ  Loop while not equal (or not zero)

        operand bytes   8088    186     286     386     486     Pentium
        short    2      5/19    5/16    4/8     11+m    6/9     7/8  NP

loopnew short  (uses CX in 32-bit mode)
loopnzw short  (uses CX in 32-bit mode)
loopned short  (uses ECX in 16-bit mode)
loopnzd short  (uses ECX in 16-bit mode)

        Example:        loopne  loop_start


LSL     Load segment limit (286+)

    operands    bytes                   286     386     486     Pentium
    r16, r16     3                      14      20/25   10       8   NP
    r32, r32     3                       -      20/25   10       8
    r16, m16   3+d(0,2)                 16      21/26   10       8
    r32, m32   3+d(0,2)                  -      21/26   10       8

        Example:        lsl     eax, ebx


LTR     Load task register (286+)

    operand     bytes                   286     386     486     Pentium
    r16          3                      17      23      20      10   NP
    mem16      3+d(0,2)                 19      27      20      10

        Example:        ltr     ax


MOV     Move data

    operands    bytes   8088    186     286     386     486     Pentium
    reg, reg     2       2       2       2       2       1       1   UV
    mem, reg  2+d(0-2)  13+EA    9       3       2       1       1   UV
    reg, mem  2+d(0-2)  12+EA   12       5       4       1       1   UV
    mem, imm  2+d(0-2)  14+EA   12-13    3       2       1       1   UV*
               +i(1,2)
    reg, imm  2+i(1,2)   4       3-4     2       2       1       1   UV

    acc, mem     3      14       8       5       4       1       1   UV
    mem, acc     3      14       9       3       2       1       1   UV

        * = not pairable if there is a displacement and immediate

        Example:        mov     eax, ebx



                         Segment Register Moves

                               Real Mode
    operands    bytes   8088    186     286     386     486     Pentium
    seg, r16     2       2       2       2       2       3     2-11   NP
    seg, m16   2+d(0,2) 12+EA    9       5       5       3     3-12   NP
    r16, seg     2       2       2       2       2       3       1    NP
    m16, seg   2+d(0,2) 13+EA   11       3       2       3       1    NP


        Example:        mov     ds, ax


                       Protected Mode Differences
    operands    bytes                   286     386     486     Pentium
    seg, r16     2                      17      18       9     2-11*  NP
    seg, m16   2+d(0,2)                 19      19       9     3-12*  NP
                        * = add 8 if new descriptor; add 6 if SS

                    MOVE to/from special registers (386+)

    operands    bytes                           386     486     Pentium
    r32, cr32    3                               6       4       4    NP
    cr32, r32    3                              4/10*   4/16*  12/22* NP

    r32, dr32    3                              14/22*  10      2/12* NP
    dr32, r32    3                              16/22*  11     11/12* NP

    r32, tr32    3                              12      3/4*     -    NP
    tr32, r32    3                              12      4/6*     -    NP

              * = cycles depend on which special register

        Example:        mov     cr0, eax


MOVS/MOVSB/MOVSW/MOVSD    Move data from string to string

    variations  bytes   8088    186     286     386     486     Pentium
    movsb        1      18       9       5       7       7       4   NP
    movsw        1      26       9       5       7       7       4   NP
    movsd        1       -       -       -       7       7       4   NP
    rep movsb    2      9+17n   8+8n    5+4n    7+4n   12+3n*   3+n  NP
    rep movsw    2      9+25n   8+8n    5+4n    7+4n   12+3n*   3+n  NP
    rep movsd    2       -       -       -      7+4n   12+3n*   3+n  NP

                        * = 5 if n=0, 13 if n=1
                 (n = count of bytes, words or dwords)

        Example:        rep movsb


MOVSX   Move with sign-extend (386+)

      operands  bytes                           386     486     Pentium
      reg, reg   3                               3       3       3   NP
      reg, mem   3+d(0,1,2,4)                    6       3       3   NP

        (Note: destination reg is 16 or 32-bits; source is 8 or 16 bits)

        Example:        movsx   ebx, ax


MOVZX   Move with zero-extend (386+)

      operands  bytes                           386     486     Pentium
      reg, reg   3                               3       3       3   NP
      reg, mem   3+d(0,1,2,4)                    6       3       3   NP

        (Note: destination reg is 16 or 32-bits; source is 8 or 16 bits)

        Example:        movzx   ebx, ax


MUL     Unsigned multiply

    operand     bytes   8088     186    286     386     486     Pentium
    r8           2     70-77    26-28   13      9-14   13-18    11   NP
    r16          2    118-133   35-37   21      9-22   13-26    11   NP
    r32          2       -        -      -      9-38   13-42    10   NP
    mem8    2+d(0-2)  76-83+EA  32-34   16     12-17   13-18    11   NP
    mem16   2+d(0-2) 124-139+EA 41-43   24     12-25   13-26    11   NP
    mem32   2+d(0-2)     -        -      -     12-41   13-42    10   NP

     implied      operand      result
   multiplicand (multiplier)
        AL    *  byte       =  AX
        AX    *  word       =  DX:AX
        EAX   *  dword      =  EDX:EAX

        Example:        mul     ebx


NEG     Two's complement negation

    operand     bytes   8088    186     286     386     486     Pentium
    reg          2       3       3       2       2       1       1   NP
    mem       2+d(0-2)  24+EA   13       7       6       3       3   NP

        Example:        neg     eax


NOP     No operation

                bytes   8088    186     286     386     486     Pentium
                 1       3       3       3       3       1       1   UV

        Example:        nop


NOT     One's complement negation

    operands    bytes   8088    186     286     386     486     Pentium
    reg          2       3       3       2       2       1       1   NP
    mem       2+d(0-2)  24+EA   13       7       6       3       3   NP

        Example:        not     eax


OR      Logical inclusive or

   operands     bytes   8088    186     286     386     486     Pentium
   reg, reg      2       3       3       2       2       1       1   UV
   mem, reg   2+d(0,2)  24+EA   10       7       7       3       3   UV
   reg, mem   2+d(0,2)  13+EA   10       7       6       2       2   UV
   reg, imm   2+i(1,2)   4       4       3       2       1       1   UV
   mem, imm   2+d(0,2)  23+EA   16       7       7       3       3   UV*
               +i(1,2)
   acc, imm   1+i(1,2)   4       4       3       2       1       1   UV

        * = not pairable if there is a displacement and immediate

        Example:        or      eax, ebx


OUT     Output to port

    operands    bytes   8088    186     286     386     486     Pentium
    imm8, al     2      14       9       3      10      16      12   NP
    imm8, ax     2      14       9       3      10      16      12   NP
    imm8, eax    2       -       -       -      10      16      12   NP
    dx, al       1      12       7       3      11      16      12   NP
    dx, ax       1      12       7       3      11      16      12   NP
    dx, eax      1       -       -       -      11      16      12   NP

                             Protected Mode

    operands    bytes                           386     486     Pentium
    imm8, acc    2                            4/24/24 11/31/29 9/26/24 NP
    dx, acc      1                            5/25/25 10/30/29 9/26/24 NP

               cycles for: CPL <= IOPL / CPL > IOPL / V86

        Example:        out     dx, al


OUTS/OUTSB/OUTSW/OUTSD    Output string to port

    variations  bytes           186     286     386     486     Pentium
    outsb        1              14       5      14      17      13   NP
    outsw        1              14       5      14      17      13   NP
    outsd        1               -       -      14      17      13   NP

                             Protected Mode

                bytes                           386     486     Pentium
                 1                           8/28/28 10/32/30 10/27/25 NP

               cycles for: CPL <= IOPL / CPL > IOPL / V86

        Example:        rep outsw


POP     Pop a word/dword from the stack

    operand     bytes   8088    186     286     386     486     Pentium
    reg          1      12      10       5       4       1       1   UV
    mem       2+d(0-2)  25+EA   20       5       5       6       3   NP
    seg          1      12       8       5       7       3       3   NP
    FS/GS        2       -       -       -       7       3       3   NP

                             Protected Mode

    operand     bytes                   286     386     486     Pentium
    CS/DS/ES     1                      20      21       9     3-12  NP
    SS           1                      20      21       9     8-17  NP
    FS/GS        2                       -      21       9     3-12  NP

        Example:        pop     eax


POPA/POPAD    Pop all (186+)/Pop all double (386+)

    variations  bytes           186     286     386     486     Pentium
    popa         1              51      19      24       9       5   NP
    popad        1               -       -      24       9       5   NP

  popa  = pop di, si, bp, sp, bx, dx, cx, ax
  popad = pop edi, esi, ebp, esp, ebx, edx, ecx, eax
          (sp and esp are discarded)

     >

Transfer interrupted!

POPFD Pop flags/Pop flags double (386+) variations bytes 8088 186 286 386 486 Pentium popf 1 12 8 5 5 9 6 NP popfd 1 - - - 5 9 6 NP Protected Mode bytes 286 386 486 Pentium popf 1 5 5 6 4 NP popfd 1 - 5 6 4 NP Example: popf PUSH push a word/dword to the stack operand bytes 8088 186 286 386 486 Pentium reg 1 15 10 3 2 1 1 UV mem 2+d(0-2) 24+EA 16 5 5 4 2 NP seg 1 14 9 3 2 3 1 NP imm 1+i(1,2) - - 3 2 1 1 NP FS/GS 2 - - - 2 3 1 NP Example: push eax PUSHA/PUSHAD Push all (186+)/Push all double (386+) variations bytes 186 286 386 486 Pentium pusha 1 36 17 18 11 5 NP pushad 1 - - 18 11 5 NP pusha = push ax, cx, dx, bx, sp, bp, si, di, pushad = push eax, ecx, edx, ebx, esp, ebp, esi, edi Example: pusha PUSHF/PUSHFD Push flags/Push flags double (386+) variations bytes 8088 186 286 386 486 Pentium pushf 1 14 9 3 4 4 9 NP pushfd 1 - - - 4 4 9 NP Protected Mode bytes 286 386 486 Pentium pushf 1 3 4 3 3 NP pushfd 1 - 4 3 3 NP Example: pushf RCL Rotate bits left with CF operands bytes 8088 186 286 386 486 Pentium reg, 1 2 2 2 2 9 3 1 PU mem, 1 2+d(0,2) 23+EA 15 7 10 4 3 PU reg, cl 2 8+4n 5+n 5+n 9 8-30 7-24 NP mem, cl 2+d(0,2) 28+EA+4n 17+n 8+n 10 9-31 9-26 NP reg, imm 3 - 5+n 5+n 9 8-30 8-25 NP mem, imm 3+d(0,2) - 17+n 8+n 10 9-31 10-27 NP Example: rcl eax, 16 RCR Rotate bits right with CF operands bytes 8088 186 286 386 486 Pentium reg, 1 2 2 2 2 9 3 1 PU mem, 1 2+d(0,2) 23+EA 15 7 10 4 3 PU reg, cl 2 8+4n 5+n 5+n 9 8-30 7-24 NP mem, cl 2+d(0,2) 28+EA+4n 17+n 8+n 10 9-31 9-26 NP reg, imm 3 - 5+n 5+n 9 8-30 8-25 NP mem, imm 3+d(0,2) - 17+n 8+n 10 9-31 10-27 NP Example: rcr eax, 16 ROL Rotate bits left operands bytes 8088 186 286 386 486 Pentium reg, 1 2 2 2 2 3 3 1 PU mem, 1 2+d(0,2) 23+EA 15 7 7 4 3 PU reg, cl 2 8+4n 5+n 5+n 3 3 4 NP mem, cl 2+d(0,2) 28+EA+4n 17+n 8+n 7 4 4 NP reg, imm 3 - 5+n 5+n 3 2 1 PU mem, imm 3+d(0,2) - 17+n 8+n 7 4 3 PU* * = not pairable if there is a displacement and immediate Example: rol eax, 16 ROR Rotate bits right operands bytes 8088 186 286 386 486 Pentium reg, 1 2 2 2 2 3 3 1 PU mem, 1 2+d(0,2) 23+EA 15 7 7 4 3 PU reg, cl 2 8+4n 5+n 5+n 3 3 4 NP mem, cl 2+d(0,2) 28+EA+4n 17+n 8+n 7 4 4 NP reg, imm 3 - 5+n 5+n 3 2 1 PU mem, imm 3+d(0,2) - 17+n 8+n 7 4 3 PU* * = not pairable if there is a displacement and immediate Example: ror eax, 16 RDMSR Read from model specific register (Pentium+) bytes Pentium 2 20-24 NP Example: rdmsr REP Repeat string operation See: MOVS (rep movs) move block See: STOS (rep stos) fill block REPE Repeat while equal (or zero) string operation See: CMPS (repe cmps) find non-matching memory items See: CMPS (repe scas) find non-acc matching byte in memory REPNE Repeat while not equal (or not zero) string operation See: CMPS (repne cmps) find first matching memory items See: SCAS (repne scas) find first matching memory item to acc RET/RETN/RETF Return from procedure variations/ operands bytes 8088 186 286 386 486 Pentium retn 1 20 16 11+m 10+m 5 2 NP retn imm16 1+d(2) 24 18 11+m 10+m 5 3 NP retf 1 34 22 15+m 18+m 13 4 NP retf imm16 1+d(2) 33 25 15+m 18+m 14 4 NP RET is coded by the assembler as near or far based on the procedure declaration and program model, as: RETN (return near) RETF (return far) Example: ret Protected Mode variations/ operands bytes 286 386 486 Pentium retf 1 25+m/55 32+m/62 18/33 4-13/23 NP retf imm16 1+d(2) 25+m/55 32+m/68 17/33 4-13/23 NP cycles for: same privilege level/lower privilege level RSM Resume from system management mode (Pentium+) bytes Pentium 2 83 NP Example: rsm SAL/SHL/SAR/SHR Shift bits operands bytes 8088 186 286 386 486 Pentium reg, 1 2 2 2 2 3 3 1 PU mem, 1 2+d(0,2) 23+EA 15 7 7 4 3 PU reg, cl 2 8+4n 5+n 5+n 3 3 4 NP mem, cl 2+d(0,2) 28+EA+4n 17+n 8+n 7 4 4 NP reg, imm 3 - 5+n 5+n 3 2 1 PU mem, imm 3+d(0,2) - 17+n 8+n 7 4 3 PU* * = not pairable if there is a displacement and immediate sal = shift arithmetic left sar = shift arithmetic right shl = shift left (same as sal) shr = shift right Example: shl eax, 1 SAHF Store AH into flags bytes 8088 186 286 386 486 Pentium 1 4 3 2 3 2 2 NP Example: sahf SBB Integer subtraction with borrow operands bytes 8088 186 286 386 486 Pentium reg, reg 2 3 3 2 2 1 1 PU mem, reg 2+d(0,2) 24+EA 10 7 7 3 3 PU reg, mem 2+d(0,2) 13+EA 10 7 6 2 2 PU reg, imm 2+i(1,2) 4 4 3 2 1 1 PU mem, imm 2+d(0,2) 23+EA 16 7 7 3 3 PU* +i(1,2) acc, imm 1+i(1,2) 4 4 3 2 1 1 PU * = not pairable if there is a displacement and immediate Example: sbb eax, ebx SCAS/SCASB/SCASW/SCASD Scan string data variations bytes 8088 186 286 386 486 Pentium scasb 1 19 15 7 7 6 4 NP scasw 1 19 15 7 7 6 4 NP scasd 1 - - - 7 6 4 NP repX scasb 2 9+15n 5+15n 5+8n 5+8n 7+5n* 8+4n NP repX scasw 2 9+19n 5+15n 5+8n 5+8n 7+5n* 8+4n NP repX scasd 2 - - - 5+8n 7+5n* 8+4n NP repX = repe or repz or repne or repnz * = 5 if n=0 (n = count of bytes, words or dwords) Example: repne scasb SET Set byte to 1 on condition else set to 0 (386+) operand bytes 386 486 Pentium r8 3 4 4/3 1/2 NP mem8 3+d(0-2) 5 3/4 1/2 NP Cycles are for: true/false setCC = one of: seta setae setb setbe setc sete setg setge setl setle setna setnae setnb setnbe setnc setne setng setnge setnl setnle setno setnp setns setnz seto setp setpe setpo sets setz Example: setne al SGDT Store global descriptor table register (286+) operand bytes 286 386 486 Pentium mem48 5 11 9 10 4 NP Example: sgdt descriptor[ebx] SIDT Store interrupt descriptor table register (286+) operand bytes 286 386 486 Pentium mem48 5 12 9 10 4 NP Example: sidt descriptor[ebx] SHLD Double precision shift left (386+) operands bytes 386 486 Pentium reg, reg, imm 4 3 2 4 NP mem, reg, imm 4+d(0-2) 7 3 4 NP reg, reg, cl 4 3 3 4 NP mem, reg, cl 4+d(0-2) 7 4 5 NP Example: shld eax, ebx, 16 SHRD Double precision shift right (386+) operands bytes 386 486 Pentium reg, reg, imm 4 3 2 4 NP mem, reg, imm 4+d(0-2) 7 3 4 NP reg, reg, cl 4 3 3 4 NP mem, reg, cl 4+d(0-2) 7 4 5 NP Example: shrd eax, ebx, 16 SLDT Store local descriptor table register (286+) operands bytes 286 386 486 Pentium r16 3 2 2 2 2 NP mem16 3+d(0-2) 3 2 3 2 NP Example: sldt ax SMSW Store machine status word (286+) operands bytes 286 386 486 Pentium r16 3 2 2 2 4 NP mem16 3+d(0-2) 3 3 3 4 NP Example: smsw ax STC Set the carry flag bytes 8088 186 286 386 486 Pentium 1 2 2 2 2 2 2 NP Example: stc STD Set direction flag (set to reverse string direction) bytes 8088 186 286 386 486 Pentium 1 2 2 2 2 2 2 NP Example: std STI Set interrupt flag (enable) bytes 8088 186 286 386 486 Pentium 1 2 2 2 3 5 7 NP Example: sti STOS/STOSB/STOSW/STOSD Store string data variations bytes 8088 186 286 386 486 Pentium stosb 1 11 10 3 4 5 3 NP stosw 1 15 10 3 4 5 3 NP stosd 1 - - - 4 5 3 NP rep stosb 2 9+10n 6+9n 4+3n 5+5n 7+4n* 3+n NP rep stosw 2 9+14n 6+9n 4+3n 5+5n 7+4n* 3+n NP rep stosd 2 - - - 5+5n 7+4n* 3+n NP * = 5 if n=0, 13 if n=1 (n = count of bytes, words or dwords) Example: rep stosd STR Store task register (286+) operand bytes 286 386 486 Pentium r16 3 2 2 2 2 NP mem16 3+d(0-2) 3 2 3 2 NP Example: str bx SUB Integer subtraction operands bytes 8088 186 286 386 486 Pentium reg, reg 2 3 3 2 2 1 1 UV mem, reg 2+d(0,2) 24+EA 10 7 7 3 3 UV reg, mem 2+d(0,2) 13+EA 10 7 6 2 2 UV reg, imm 2+i(1,2) 4 4 3 2 1 1 UV mem, imm 2+d(0,2) 23+EA 16 7 7 3 3 UV* +i(1,2) acc, imm 1+i(1,2) 4 4 3 2 1 1 UV * = not pairable if there is a displacement and immediate Example: sub eax, ebx TEST Logical compare operands bytes 8088 186 286 386 486 Pentium reg, reg 2 3 3 2 2 1 1 UV mem, reg 2+d(0,2) 13+EA 10 6 5 2 2 UV reg, mem 2+d(0,2) 13+EA 10 6 5 2 2 UV reg, imm 2+i(1,2) 5 4 3 2 1 1 UV mem, imm 2+d(0,2) 11+EA 10 6 5 2 2 UV* +i(1,2) acc, imm 1+i(1,2) 4 4 3 2 1 1 UV * = not pairable if there is a displacement and immediate Example: sub eax, ebx VERR Verify a segment for reading (286+) operand bytes 286 386 486 Pentium r16 3 14 10 11 7 NP mem16 3+d(0,2) 16 11 11 7 NP Example: verr ax VERW Verify a segment for writing (286+) operand bytes 286 386 486 Pentium r16 3 14 15 11 7 NP mem16 3+d(0,2) 16 16 11 7 NP Example: verr ax WAIT Wait for co-processor bytes 8088 186 286 386 486 Pentium 1 4 6 3 6 1-3 1 NP Example: wait WBINVD Write-back and invalidate data cache (486+) bytes 486 Pentium 2 5 2000+ NP Example: wbinvd WRMSR Write to model specific register (PENTIUM+) bytes Pentium 2 30-45 NP Example: wrmsr XADD Exchange and add (486+) operands bytes 486 Pentium reg, reg 3 3 3 NP mem, reg 3+d(0-2) 4 4 NP Example: xadd eax, ebx XCHG Exchange register/memory with register operands bytes 8088 186 286 386 486 Pentium reg, reg 2 4 4 3 3 3 3 NP reg, mem 2+d(0-2) 25+EA 17 5 5 5 3 NP mem, reg 2+d(0-2) 25+EA 17 5 5 5 3 NP acc, reg 1 3 3 3 3 3 2 NP reg, acc 1 3 3 3 3 3 2 NP in above: acc = AX or EAX only Example: xchg ax, dx XLAT/XLATB Table look-up translation bytes 8088 186 286 386 486 Pentium 1 11 11 5 5 4 4 NP Example: xlat XOR Logical exclusive or operands bytes 8088 186 286 386 486 Pentium reg, reg 2 3 3 2 2 1 1 UV mem, reg 2+d(0,2) 24+EA 10 7 7 3 3 UV reg, mem 2+d(0,2) 13+EA 10 7 6 2 2 UV reg, imm 2+i(1,2) 4 4 3 2 1 1 UV mem, imm 2+d(0,2) 23+EA 16 7 7 3 3 UV* +i(1,2) acc, imm 1+i(1,2) 4 4 3 2 1 1 UV * = not pairable if there is a displacement and immediate Example: xor eax, ebx

Home Page    e-mail to Quantasm     Order form    Site Map