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)



        Example:        popa





POPF/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