Outils pour utilisateurs

Outils du site


back2root:archives:80x88

80x86 Integer Instruction Set (8088 - Pentium)

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

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
back2root/archives/80x88.txt · Dernière modification: 2021/10/13 19:00 de frater