Outils pour utilisateurs

Outils du site


back2root:archives:intel-80x88

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
back2root:archives:intel-80x88 [2024/11/29 21:43] – supprimée - modification externe (Date inconnue) 127.0.0.1back2root:archives:intel-80x88 [2024/11/29 21:43] (Version actuelle) – ↷ Nom de la page changé de back2root:archives:80x88 à back2root:archives:intel-80x88 frater
Ligne 1: Ligne 1:
 +====== 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)  |
 +
 +<code>
 +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
 +</code>
 +====  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
 +
 +^  operands  ^  bytes  ^  8088  ^  186  ^  286  ^  386  ^  486  ^  Pentium  ^
 +|  -          1      |  8      8    |  3    |  4    |  3    |  3   NP   |
 +
 +Example:        
 +
 +<code asm>        aaa</code>
 +=== AAD ===
 +ASCII adjust AX before division (second byte is divisor)
 +
 +^  operands  ^  bytes  ^  8088  ^  186  ^  286  ^  386  ^  486  ^  Pentium  ^
 +|  -          2      |  60    |  15    14    19    14    10   NP  |
 +
 +Example:
 +
 +<code asm>        aad</code>
 +
 +
 +=== AAM ===
 +ASCII adjust AX after multiply (second byte is divisor)
 +
 +^  operands  ^  bytes  ^  8088  ^  186  ^  286  ^  386  ^  486  ^  Pentium  ^
 +|  -          2      |  83    |  19    16    17    15    18   NP  |
 +
 +Example:
 +
 +<code asm>        aam</code>
 +
 +
 +=== AAS ===
 +ASCII adjust AL after subtraction
 +
 +^  operands  ^  bytes  ^  8088  ^  186  ^  286  ^  386  ^  486  ^  Pentium  ^
 +|  -          1      |  8      7    |  3    |  4    |  3    |  3   NP   |
 +
 +Example:
 +
 +<code asm>        aas</code>
 +=== 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)\\ +i(1,2)  |  23+EA  |  16    7    |  7    |  3    |  3   PU*  |
 +|  acc, imm  |  1+i(1,2)            |  4      |  4    |  3    |  2    |  1    |  1   PU   |
 +
 +* : not pairable if there is a displacement and immediate
 +
 +Example:
 +
 +<code asm>        adc     eax, ebx</code>
 +
 +
 +=== 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)\\ +i(1,2)  |  23+EA  |  16    7    |  7    |  3    |  3   UV*  |
 +|  acc, imm  |  1+i(1,2)            |  4      |  4    |  3    |  2    |  1    |  1   UV   |
 +
 +* = not pairable if there is a displacement and immediate
 +
 +Example:
 +
 +<code asm>        add     eax, ebx</code>
 +
 +=== 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)\\ +i(1,2)  |  23+EA  |  16    7    |  7    |  3    |  3   UV*  |
 +|  acc, imm  |  1+i(1,2)            |  4      |  4    |  3    |  2    |  1    |  1   UV   |
 +
 +* : not pairable if there is a displacement and immediate
 +
 +Example:
 +
 +<code asm>        and     eax, ebx</code>
 +
 +
 +=== 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:
 +
 +<code asm>        arpl    ax, bx</code>
 +
 +
 +=== BOUND ===
 +Check array index against bounds (186+)
 +
 +^  operands  ^  bytes  ^  186  ^  286  ^  386  ^  486  ^  Pentium  ^
 +|  reg, mem  |  4      |  35    13    10    7    |  8   NP   |
 +
 +Example:
 +
 +<code asm>        bound   bx, array</code>
 +
 +=== 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:
 +
 +<code asm>        bsf     eax, [esi]</code>
 +=== 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:
 +<code asm>        bsr     eax, [esi]</code>
 +
 +
 +=== BSWAP ===
 +Byte swap (486+)
 +
 +^  operand  ^  bytes  ^  486  ^  Pentium  ^
 +|  r32      |  2      |  1    |  1   NP   |
 +
 +Example:
 +<code asm>        bswap   eax</code>
 +
 +=== 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:
 +<code asm>        bt      eax, 4</code>
 +
 +
 +=== 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:
 +<code asm>        btc     eax, 4</code>
 +
 +
 +=== 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:
 +<code asm>        btr     eax, 4</code>
 +
 +
 +=== 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:
 +<code asm>        bts     eax, 4</code>
 +
 +
 +=== 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:
 +<code asm>        call    my_function</code>
 +
 +
 +=== CBW ===
 +Convert byte to word   (AL --> AX)
 +
 +^  operand  ^  bytes  ^  8088  ^  186  ^  286  ^  386  ^  486  ^  Pentium  ^
 +|  -        |  1      |  2      2    |  2    |  3    |  3    |  3   NP   |
 +
 +Example:
 +<code asm>        cbw</code>
 +
 +
 +=== CWDE ===
 +Convert word to dword (386+)  (AX --> EAX)
 +
 +^  operand  ^  bytes  ^  386  ^  486  ^  Pentium  ^
 +|  -        |  1      |  3    |  3    |  3   NP   |
 +
 +Example:
 +<code asm>        cwde</code>
 +
 +
 +=== CWD ===
 +Convert word to double  (AX --> DX:AX)
 +
 +^  operand  ^  bytes  ^  8088  ^  186  ^  286  ^  386  ^  486  ^  Pentium  ^
 +|  -        |  1      |  5      4    |  2    |  2    |  3    |  2   NP   |
 +
 +Example:
 +<code asm>        cwd</code>
 +
 +
 +=== CDQ ===
 +Convert double to quad   (EAX --> EDX:EAX)
 +
 +^  operand  ^  bytes  ^  386  ^  486  ^  Pentium  ^
 +|  -        |  1      |  2    |  3    |  2   NP   |
 +
 +Example:
 +<code asm>        cdq</code>
 +
 +
 +=== CLC ===
 +Clear the carry flag
 +
 +^  operand  ^  bytes  ^  8088  ^  186  ^  286  ^  386  ^  486  ^  Pentium  ^
 +|  -        |  1      |  2      2    |  2    |  2    |  2    |  2   NP   |
 +
 +Example:
 +<code asm>        clc</code>
 +
 +
 +=== CLD ===
 +Clear the direction flag (set to forward direction)
 +
 +^  operand  ^  bytes  ^  8088  ^  186  ^  286  ^  386  ^  486  ^  Pentium  ^
 +|  -        |  1      |  2      2    |  2    |  2    |  2    |  2   NP   |
 +
 +Example:
 +<code asm>        cld</code>
 +
 +
 +=== CLI ===
 +Clear the interrupt flag (disable interrupts)
 +
 +^  operand  ^  bytes  ^  8088  ^  186  ^  286  ^  386  ^  486  ^  Pentium  ^
 +|  -        |  1      |  2      2    |  3    |  3    |  5    |  7   NP   |
 +
 +Example:
 +<code asm>        cli</code>
 +
 +
 +=== CLTS ===
 +Clear task switched flag in CR0 (286+)
 +
 +^  operand  ^  bytes  ^  286  ^  386  ^  486  ^  Pentium  ^
 +|  -        |  2      |  2    |  5    |  7    |  10   NP  |
 +
 +Example:
 +<code asm>        clts</code>
 +
 +
 +=== CMC ===
 +Complement carry flag
 +
 +^  operand  ^ bytes  ^ 8088  ^ 186  ^ 286  ^ 386  ^ 486  ^ Pentium  ^
 +|  -        |  1      2    |  2    2    2    2    2   NP  |
 +
 +Example:
 +<code asm>        cmc</code>
 +
 +
 +=== 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)\\ +i(1,2)  |  14+EA  |  10    6    |  5    |  2    |  2   UV*  |
 +|  acc, imm  |  1+i(1,2)            |  4      |  4    |  3    |  2    |  1    |  1   UV   |
 +
 +* : not pairable if there is a displacement and immediate
 +
 +Example:
 +<code asm>        cmp     eax, 3</code>
 +
 +
 +=== 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:
 +
 +<code asm>        repne cmpsb</code>
 +=== 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:
 +<code asm>        cmpxchg ebx, edx</code>
 +
 +
 +=== CMPXCHG8B ===
 +Compare and Exchange 8 bytes (Pentium+)
 +
 +^  operands  ^  bytes      Pentium  ^
 +|  mem, reg  |  3+d(0-2)  |  10   NP  |
 +
 +Example:
 +<code asm>        cmpxchg8b [ebx], edx</code>
 +
 +
 +=== CPUID ===
 +CPU identification (Pentium+)
 +
 +^  operands  ^  bytes  ^  Pentium  ^
 +|  -          2      |  14   NP  |
 +
 +Example:
 +<code asm>        cpuid</code>
 +
 +
 +=== DAA ===
 +Decimal adjust AL after addition
 +
 +^  operand  ^  bytes  ^  8088  ^  186  ^  286  ^  386  ^  486  ^  Pentium  ^
 +|  -        |  1      |  4      4    |  3    |  4    |  2    |  3   NP   |
 +
 +Example:
 +<code asm>        daa</code>
 +
 +
 +=== DAS ===
 +Decimal adjust AL after subtraction
 +
 +^  operand  ^  bytes  ^  8088  ^  186  ^  286  ^  386  ^  486  ^  Pentium  ^
 +|  -        |  1      |  4      4    |  3    |  4    |  2    |  3   NP   |
 +
 +Example:
 +<code asm>        das</code>
 +
 +
 +=== 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:
 +<code asm>        dec     eax</code>
 +
 +
 +=== 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\\ dividend  ^      operand  ^      quotient  ^  remainder  ^
 +|  AX                  |  /  |  byte      =  |  AL        |  AH         |
 +|  DX:AX                /  |  word      =  |  AX        |  DX         |
 +|  EDX:EAX              /  |  dword    |  =  |  EAX        EDX        |
 +
 +Example:
 +<code asm>        div     ebx</code>
 +
 +
 +=== ENTER ===
 +Make stack frame for procedure parameters (186+)
 +
 +^      operands  ^  bytes  ^  8088  ^  186  ^   286    386  ^    486  ^   Pentium  ^
 +|      imm16, 0  |    |       15    |  11    |  10     14     11 NP  |
 +|      imm16, 1  |    |       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:
 +<code asm>        enter   1, 0</code>
 +
 +
 +=== ESC ===
 +Escape
 +
 +escape opcodes D8 - DF are used by floating point instructions
 +
 +
 +
 +=== HLT ===
 +Halt
 +
 +^  operands  ^  bytes  ^  8088  ^  186  ^  286  ^  386  ^  486  ^  Pentium  ^
 +|  -          1      |  2      2    |  2    |  5    |  4    |  4 NP     |
 +
 +Example:
 +<code asm>        hlt</code>
 +
 +
 +=== 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\\   dividend  ^  operand  ^  quotient  ^  remainder  ^
 +|  AX                    |  byte      AL        |  AH         |
 +|  DX:AX                  word      AX        |  DX         |
 +|  EDX:EAX                dword    |  EAX        EDX        |
 +
 +
 +Example:
 +<code asm>        idiv    ebx</code>
 +
 +
 +=== 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\\   multiplicand  ^  operand\\ (multiplier)  ^  result   ^
 +|  AL                        |  byte                    |  AX       |
 +|  AX                        |  word                    |  DX:AX    |
 +|  EAX                        dword                    EDX:EAX  |
 +
 +Example:
 +<code asm>        imul    ebx</code>
 +
 +
 +**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)\\ +i(1,2)  |  25/32  |  24    12-17 / 12-25  |  13-18 / 13-26  |  10   NP  |
 +|  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  |
 +
 +
 +<code>
 +all forms: dest, src                          cycles for:   byte/word
 +               or                                             dword
 +           dest, src1, src2
 +</code>
 +
 +Example:
 +<code asm>        imul    eax, ebx, 10</code>
 +
 +
 +=== IN ===
 +Input from port
 +
 +^    operands  ^  bytes  ^  8088  ^  186    286  ^   386  ^   486  ^   Pentium  ^
 +|    al, imm8  |        14    |  10    |       12     14      7   NP  |
 +|    ax, imm8  |        14    |  10    |       12     14      7   NP  |
 +|    eax, imm8  |      |    -        |       12     14      7   NP  |
 +|    al, dx    |        12    |      |       13     14      7   NP  |
 +|    ax, dx    |        12    |      |       13     14      7   NP  |
 +|    eax, dx            -        |       13     14      7   NP  |
 +
 +**Protected mode**
 +
 +^   operands    bytes                          386  ^   486  ^   Pentium  ^
 +|   acc, imm          |                     6/26/26 |  9/29/27  |  4/21/19 NP  |
 +|   acc, dx    |        |                    7/27/27  |  8/28/27  |  4/21/19 NP  |
 +
 +cycles for: CPL <= IOPL / CPL > IOPL / V86
 +
 +
 +Example:
 +
 +<code asm>         in      al, dx</code>
 +=== INC ===
 +Increment
 +
 +^    operand    bytes  ^  8088  ^  186  ^   286  ^  386  ^   486  ^   Pentium  ^
 +|    r8        |              3      2      2      1      1   UV  |
 +|    r16                    3      2      2      1      1   UV  |
 +|    r32                    3      2      2      1      1   UV  |
 +|    mem        2+d(0,2)  |  23+EA  |   15  |          6      3      3   UV  |
 +
 +Example:
 +
 +<code asm>        inc     ebx</code>
 +
 +
 +=== 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**
 +
 +^  operand  ^  bytes  ^  8088  ^  186  ^  286  ^  386      ^  486        Pentium     ^
 +|  -        |  1      |  -      -    |  -    |  9/29/29  |  10/32/30  |  6/24/22 NP  |
 +
 +cycles for: CPL <= IOPL / CPL > IOPL / V86
 +
 +Example:
 +<code asm>        rep insb</code>
 +
 +
 +=== 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**
 +
 +^  operands  ^  bytes  ^  8088  ^  186  ^  286        ^  386    ^  486    ^  Pentium   ^
 +|  -          1      |  -      -    |  (40-78)+m  |  59-99  |  44-71  |  27-82 NP  |
 +
 +Example:
 +<code asm>        int     21h</code>
 +
 +
 +
 +=== INTO ===
 +Call interrupt procedure if overflow
 +
 +^  operand  ^  bytes  ^  8088  ^  186  ^   286    386  ^   486    Pentium  ^
 +|    -      |    1    |  4/73  |  4/48  |  3/24+m  |  3/35  |  3/28  |  4/13 NP  |
 +
 +**Protected mode**
 +
 +^  operand  ^  bytes  ^  8088  ^  186  ^   286    386  ^   486    Pentium  ^
 +|    -      |    1    |      |      (40-78)+m    59-99  |  44-71  |  27-56 NP  |
 +
 +Task switch clocks not shown
 +
 +Example:
 +<code asm>        into</code>
 +
 +
 +=== INVD ===
 +Invalidate data cache (486+)
 +
 +^  operand  ^  bytes  ^  8088  ^  186  ^   286    386  ^   486    Pentium  ^
 +|            2    |  -    |      |        -    |      |  15   NP  |
 +
 +Example:
 +<code asm>        invd</code>
 +
 +
 +=== INVLPG ===
 +Invalidate TLB entry (486+)
 +
 +^  operand  ^  bytes  ^  8088  ^  186  ^   286    386  ^   486    Pentium  ^
 +|    mem32  |            |        -    |        12     25   NP  |
 +
 +Example:
 +<code asm>        invlpg  [eax]</code>
 +
 +
 +=== IRET ===
 +Return from interrupt
 +
 +^  operand  ^  bytes  ^  8088  ^  186  ^   286    386  ^   486    Pentium  ^
 +|    -      |        44     28    |  17+m  |  22    |  15    8-27  NP  |
 +
 +Task switch clocks not shown
 +
 +Example:
 +<code asm>        iret</code>
 +
 +
 +=== IRETD ===
 +32-bit return from interrupt (386+)
 +
 +^  operand  ^  bytes  ^  8088  ^  186  ^   286    386  ^   486    Pentium  ^
 +|          |    1      -          -    |  22  |    15  |  10-27  NP  |
 +
 +Task switch clocks not shown
 +
 +Example:
 +<code asm>        iretd</code>
 +
 +
 +=== 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:        
 +
 +<code asm>jne     not_equal</code>
 +
 +
 +=== 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:
 +<code asm>        jcxz    cx_is_zero</code>
 +
 +
 +=== 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:
 +<code asm>        jmp     target_address</code>
 +
 +
 +=== LAHF ===
 +Load flags into AH
 +
 +^  operand  ^  bytes      8088    186  ^  286    386    486  ^  Pentium  ^
 +|                |      |        2    |      |        2 NP  |
 +
 +Example:
 +<code asm>        lahf</code>
 +
 +
 +=== LAR [UPDATE] ===
 +Load access rights byte (286+)
 +
 +    operands    bytes                   286     386     486     Pentium
 +    r16, r16                          14      15      11         NP
 +    r32, r32                                15      11         NP
 +    r16, m16                          16      16      11         NP
 +    r32, m32                                16      11         NP
 +
 +Example:
 +<code asm>        lar     eax, ebx</code>
 +
 +
 +=== LDS ===
 +Load far pointer
 +
 +    operands    bytes   8088    186     286     386     486     Pentium
 +    reg, mem   2+d(2)   24+EA   18                           NP
 +
 +Example:
 +<code asm>        lds     si, ptr_1</code>
 +
 +
 +=== LES ===
 +Load far pointer
 +
 +    operands    bytes   8088    186     286     386     486     Pentium
 +    reg, mem   2+d(2)   24+EA   18                           NP
 +
 +Example:
 +<code asm>        les     di, ptr_2</code>
 +
 +
 +=== LFS ===
 +Load far pointer (386+)
 +
 +    operands    bytes                           386     486     Pentium
 +    reg, mem   3+d(2,4)                          7               NP
 +
 +Example:
 +<code asm>        lfs     si, ptr_3</code>
 +
 +
 +=== LGS ===
 +Load far pointer (386+)
 +
 +    operands    bytes                           386     486     Pentium
 +    reg, mem   3+d(2,4)                          7               NP
 +
 +Example:
 +<code asm>        lgs     si, ptr_4</code>
 +
 +
 +=== LSS ===
 +Load stack segment and offset
 +
 +    operands    bytes                           386     486     Pentium
 +    reg, mem   3+d(2,4)                          7               NP
 +
 +Example:
 +<code asm>        lss     bp, ptr_5</code>
 +
 +
 +=== LEA ===
 +Load effective address
 +
 +    operands    bytes   8088    186     286     386     486     Pentium
 +    r16, mem    2+d(2)  2+EA                      1-2      1   UV
 +    r32, mem    2+d(2)                          1-2      1   UV
 +
 +Example:
 +<code asm>        lea     eax, [eax+ebx*2+3]</code>
 +
 +
 +=== LEAVE ===
 +High level procedure exit (186+)
 +
 +                bytes           186     286     386     486     Pentium
 +                                                         NP
 +
 +Example:
 +<code asm>        leave</code>
 +
 +
 +=== LGDT ===
 +Load global descriptor table register (286+)
 +
 +    operand     bytes                   286     386     486     Pentium
 +     mem48                            11      11      11         NP
 +
 +Example:
 +<code asm>        lgdt    descriptor[ebx]</code>
 +
 +
 +=== LIDT === 
 +Load interrupt descriptor table register (286+)
 +
 +    operand     bytes                   286     386     486     Pentium
 +     mem48                            12      11      11         NP
 +
 +Example:
 +<code asm>        lidt    descriptor[ebx]</code>
 +
 +
 +=== LLDT ===
 +Load local descriptor table register (286+)
 +
 +    operand     bytes                   286     386     486     Pentium
 +     r16                              17      20      11         NP
 +     mem16     3+d(0-2)                 19      24      11         NP
 +
 +Example:
 +<code asm>        lldt    ax</code>
 +
 +
 +=== LMSW === 
 +Load machine status word (286+)
 +
 +    operand     bytes                   286     386     486     Pentium
 +     r16                                    10      13         NP
 +     mem16     3+d(0-2)                  6      13      13         NP
 +
 +Example:
 +<code asm>        lmsw    ax</code>
 +
 +
 +=== LOCK ===
 +Lock bus on next instruction (prefix)
 +
 +                bytes   8088    186     286     386     486     Pentium
 +                                                       NP
 +
 +  (Note: xchg always is locked whether it is specified or not)
 +
 +
 +Example:
 +<code asm>        lock    mov     mem, 1</code>
 +
 +
 +=== LODS/LODSB/LODSW/LODSD ===
 +Load string operand
 +
 +    variations  bytes   8088    186     286     386     486     Pentium
 +    lodsb        1      16      10                           NP
 +    lodsw        1      16      10                           NP
 +    lodsd        1                                       NP
 +
 +Example:
 +<code asm>        lodsb</code>
 +
 +
 +=== 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/ NP
 +
 +loopw short   (uses CX in 32-bit mode)
 +loopd short   (uses ECX in 16-bit mode)
 +
 +
 +Example:
 +<code asm>        loop    loop_start</code>
 +
 +
 +=== 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/ 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:
 +<code asm>        loope   loop_start</code>
 +
 +
 +=== 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/ 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:
 +<code asm>        loopne  loop_start</code>
 +
 +
 +=== LSL ===
 +Load segment limit (286+)
 +
 +    operands    bytes                   286     386     486     Pentium
 +    r16, r16                          14      20/25   10         NP
 +    r32, r32                                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:
 +<code asm>        lsl     eax, ebx</code>
 +
 +
 +=== 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:
 +<code asm>        ltr     ax</code>
 +
 +
 +=== 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)\\ +i(1,2)  |  14+EA  |  12-13  |  3    |  2    |  1    |  1   UV*  |
 +|  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:   
 +<code asm>
 +    mov     eax, ebx
 +</code>
 +
 +**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:        
 +
 +<code asm>mov     ds, ax</code>
 +
 +
 +** 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  |
 +
 +** 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:
 +
 +<code asm>        mov     cr0, eax</code>
 +
 +
 +=== MOVS/MOVSB/MOVSW/MOVSD ===
 +Move data from string to string
 +
 +    variations  bytes   8088    186     286     386     486     Pentium
 +    movsb        1      18                                 NP
 +    movsw        1      26                                 NP
 +    movsd        1                                       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:
 +<code asm>        rep movsb</code>
 +
 +
 +=== MOVSX ===
 +Move with sign-extend (386+)
 +
 +      operands  bytes                           386     486     Pentium
 +      reg, reg                                               NP
 +      reg, mem   3+d(0,1,2,4)                    6               NP
 +
 +        (Note: destination reg is 16 or 32-bits; source is 8 or 16 bits)
 +
 +Example:
 +<code asm>        movsx   ebx, ax</code>
 +
 +
 +=== MOVZX ===
 +Move with zero-extend (386+)
 +
 +      operands  bytes                           386     486     Pentium
 +      reg, reg                                               NP
 +      reg, mem   3+d(0,1,2,4)                    6               NP
 +
 +        (Note: destination reg is 16 or 32-bits; source is 8 or 16 bits)
 +
 +Example:
 +<code asm>        movzx   ebx, ax</code>
 +
 +
 +=== MUL ===
 +Unsigned multiply
 +
 +    operand     bytes   8088     186    286     386     486     Pentium
 +    r8               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:
 +<code asm>        mul     ebx</code>
 +
 +
 +=== NEG ===
 +Two's complement negation
 +
 +    operand     bytes   8088    186     286     386     486     Pentium
 +    reg          2                                       NP
 +    mem       2+d(0-2)  24+EA   13                           NP
 +
 +Example:
 +<code asm>        neg     eax</code>
 +
 +
 +=== NOP ===
 +No operation
 +
 +                bytes   8088    186     286     386     486     Pentium
 +                                                       UV
 +
 +Example:
 +<code asm>        nop</code>
 +
 +
 +=== NOT ===
 +One's complement negation
 +
 +    operands    bytes   8088    186     286     386     486     Pentium
 +    reg          2                                       NP
 +    mem       2+d(0-2)  24+EA   13                           NP
 +
 +Example:
 +<code asm>        not     eax</code>
 +
 +
 +=== OR ===
 +Logical inclusive or
 +
 +   operands     bytes   8088    186     286     386     486     Pentium
 +   reg, reg      2                                       UV
 +   mem, reg   2+d(0,2)  24+EA   10                           UV
 +   reg, mem   2+d(0,2)  13+EA   10                           UV
 +   reg, imm   2+i(1,2)                                   UV
 +   mem, imm   2+d(0,2)  23+EA   16                           UV*
 +               +i(1,2)
 +   acc, imm   1+i(1,2)                                   UV
 +
 +        * = not pairable if there is a displacement and immediate
 +
 +Example:
 +<code asm>        or      eax, ebx</code>
 +
 +
 +=== OUT ===
 +Output to port
 +
 +^    operands  ^  bytes  ^  8088  ^  186  ^   286  ^   386  ^   486    Pentium  ^
 +|    imm8, al  |      |  14    |      |       10  |    16     12   NP  |
 +|    imm8, ax  |      |  14    |      |       10  |    16     12   NP  |
 +|    imm8, eax  |  2    |      |      |       10  |    16     12   NP  |
 +|    dx, al      1    |  12    |      |       11  |    16     12   NP  |
 +|    dx, ax      1    |  12    |      |       11  |    16     12   NP  |
 +|    dx, eax    |  1    |      |      |       11  |    16     12   NP  |
 +
 +**Protected Mode**
 +
 +^    operands    bytes                          386    486    Pentium  ^
 +|    imm8, acc  |              |                4/24/24  |  11/31/29  |  9/26/24 NP  |
 +|    dx, acc    |              |               5/25/25  |   10/30/29  |  9/26/24 NP  |
 +
 +cycles for: CPL <= IOPL / CPL > IOPL / V86
 +
 +Example:        
 +
 +<code asm>
 +out     dx, al</code>
 +=== OUTS/OUTSB/OUTSW/OUTSD ===
 +Output string to port
 +
 +    variations  bytes           186     286     386     486     Pentium
 +    outsb        1              14            14      17      13   NP
 +    outsw        1              14            14      17      13   NP
 +    outsd        1                          14      17      13   NP
 +
 +**Protected mode**
 +
 +                bytes                           386     486     Pentium
 +                                           8/28/28 10/32/30 10/27/25 NP
 +
 +               cycles for: CPL <= IOPL / CPL > IOPL / V86
 +
 +Example:
 +<code asm>        rep outsw</code>
 +
 +
 +=== POP ===
 +Pop a word/dword from the stack
 +
 +    operand     bytes   8088    186     286     386     486     Pentium
 +    reg          1      12      10                           UV
 +    mem       2+d(0-2)  25+EA   20                           NP
 +    seg          1      12                                 NP
 +    FS/GS        2                                       NP
 +
 +**Protected mode**
 +
 +    operand     bytes                   286     386     486     Pentium
 +    CS/DS/ES                          20      21           3-12  NP
 +    SS                                20      21           8-17  NP
 +    FS/GS        2                            21           3-12  NP
 +
 +Example:
 +<code asm>        pop     eax</code>
 +
 +
 +=== POPA/POPAD ===
 +Pop all (186+)/Pop all double (386+)
 +
 +    variations  bytes           186     286     386     486     Pentium
 +    popa                      51      19      24               NP
 +    popad        1                          24               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:
 +<code asm>        popa</code>
 +
 +
 +=== POPF/POPFD ===
 +Pop flags/Pop flags double (386+)
 +
 +    variations  bytes   8088    186     286     386     486     Pentium
 +    popf              12                                 NP
 +    popfd        1                                       NP
 +
 +**Protected mode**
 +
 +                bytes                   286     386     486     Pentium
 +    popf                                                   NP
 +    popfd        1                                           NP
 +
 +Example:
 +<code asm>        popf</code>
 +
 +
 +=== PUSH ===
 +push a word/dword to the stack
 +
 +     operand    bytes   8088    186     286     386     486     Pentium
 +     reg              15      10                           UV
 +     mem      2+d(0-2)  24+EA   16                           NP
 +     seg              14                                 NP
 +     imm     1+i(1,2)    -                                 NP
 +     FS/GS                                             NP
 +
 +Example:
 +<code asm>        push    eax</code>
 +
 +
 +=== PUSHA/PUSHAD ===
 +Push all (186+)/Push all double (386+)
 +
 +    variations  bytes           186     286     386     486     Pentium
 +    pusha        1              36      17      18      11         NP
 +    pushad                                18      11         NP
 +
 +  pusha  = push ax, cx, dx, bx, sp, bp, si, di,
 +  pushad = push eax, ecx, edx, ebx, esp, ebp, esi, edi
 +
 +Example:
 +<code asm>        pusha</code>
 +
 +=== PUSHF/PUSHFD ===
 +Push flags/Push flags double (386+)
 +
 +    variations  bytes   8088    186     286     386     486     Pentium
 +    pushf        1      14                                 NP
 +    pushfd                                             NP
 +
 +**Protected mode**
 +
 +                bytes                   286     386     486     Pentium
 +    pushf        1                                           NP
 +    pushfd                                                 NP
 +
 +Example:
 +<code asm>        pushf</code>
 +
 +
 +=== RCL ===
 +Rotate bits left with CF
 +
 +    operands    bytes   8088    186     286     386     486     Pentium
 +    reg, 1                                             PU
 +    mem, 1    2+d(0,2)  23+EA   15            10               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                 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:
 +<code asm>        rcl     eax, 16</code>
 +
 +
 +=== RCR ===
 +Rotate bits right with CF
 +
 +    operands    bytes   8088    186     286     386     486     Pentium
 +    reg, 1                                             PU
 +    mem, 1    2+d(0,2)  23+EA   15            10               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                 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:
 +<code asm>        rcr     eax, 16</code>
 +
 +
 +=== ROL ===
 +Rotate bits left
 +
 +    operands    bytes   8088    186     286     386     486     Pentium
 +    reg, 1                                             PU
 +    mem, 1    2+d(0,2)  23+EA   15                           PU
 +    reg, cl      2       8+4n    5+n    5+n      3               NP
 +    mem, cl   2+d(0,2) 28+EA+4n 17+n    8+n      7               NP
 +    reg, imm                 5+n    5+n      3               PU
 +    mem, imm  3+d(0,2)        17+n    8+n      7               PU*
 +
 +       * = not pairable if there is a displacement and immediate
 +
 +Example:
 +<code asm>        rol     eax, 16</code>
 +
 +
 +=== ROR ===
 +Rotate bits right
 +
 +    operands    bytes   8088    186     286     386     486     Pentium
 +    reg, 1                                             PU
 +    mem, 1    2+d(0,2)  23+EA   15                           PU
 +    reg, cl      2       8+4n    5+n    5+n      3               NP
 +    mem, cl   2+d(0,2) 28+EA+4n 17+n    8+n      7               NP
 +    reg, imm                 5+n    5+n      3               PU
 +    mem, imm  3+d(0,2)        17+n    8+n      7               PU*
 +
 +       * = not pairable if there is a displacement and immediate
 +
 +Example:
 +<code asm>        ror     eax, 16</code>
 +
 +
 +=== RDMSR ===
 +Read from model specific register (Pentium+)
 +
 +                bytes                                           Pentium
 +                2                                              20-24 NP
 +
 +Example:
 +<code asm>        rdmsr</code>
 +
 +
 +=== 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               20      16      11+m    10+m             NP
 +   retn imm16   1+d(2)  24      18      11+m    10+m             NP
 +   retf               34      22      15+m    18+m    13         NP
 +   retf imm16   1+d(2)  33      25      15+m    18+m    14         NP
 +
 +RET is coded by the assembler as near or far based on the procedure declaration and program model, as:
 +
 +<code>
 +      RETN (return near)
 +      RETF (return far)
 +</code>
 +
 +Example:
 +<code asm>        ret</code>
 +
 +**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
 +                                                              83   NP
 +
 +Example:
 +<code asm>        rsm</code>
 +
 +
 +=== SAL/SHL/SAR/SHR === 
 +Shift bits
 +
 +   operands     bytes   8088    186     286     386     486     Pentium
 +   reg, 1        2                                       PU
 +   mem, 1     2+d(0,2)  23+EA   15                           PU
 +   reg, cl             8+4n    5+n    5+n      3               NP
 +   mem, cl    2+d(0,2) 28+EA+4n 17+n    8+n      7               NP
 +   reg, imm      3             5+n    5+n      3               PU
 +   mem, imm   3+d(0,2)        17+n    8+n      7               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:
 +<code asm>        shl     eax, 1</code>
 +
 +
 +=== SAHF ===
 +Store AH into flags
 +
 +                bytes   8088    186     286     386     486     Pentium
 +                                                       NP
 +
 +Example:
 +<code asm>        sahf</code>
 +
 +
 +=== SBB ===
 +Integer subtraction with borrow
 +
 +    operands    bytes   8088    186     286     386     486     Pentium
 +    reg, reg                                           PU
 +    mem, reg  2+d(0,2)  24+EA   10                           PU
 +    reg, mem  2+d(0,2)  13+EA   10                           PU
 +    reg, imm  2+i(1,2)                                   PU
 +    mem, imm  2+d(0,2)  23+EA   16                           PU*
 +               +i(1,2)
 +    acc, imm  1+i(1,2)                                   PU
 +
 +       * = not pairable if there is a displacement and immediate
 +
 +Example:
 +<code asm>        sbb     eax, ebx</code>
 +
 +
 +=== SCAS/SCASB/SCASW/SCASD ===
 +Scan string data
 +
 +    variations  bytes   8088    186     286     386     486     Pentium
 +    scasb        1      19      15                           NP
 +    scasw        1      19      15                           NP
 +    scasd        1                                       NP
 +    repX scasb        9+15n   5+15n   5+8n    5+8n    7+5n*   8+4n NP
 +    repX scasw        9+19n   5+15n   5+8n    5+8n    7+5n*   8+4n NP
 +    repX scasd                          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:
 +<code asm>        repne   scasb</code>
 +
 +=== SET ===
 +Set byte to 1 on condition else set to 0 (386+)
 +
 +      operand   bytes                           386     486     Pentium
 +      r8                                            4/3     1/ NP
 +      mem8     3+d(0-2)                          5      3/4     1/ 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:
 +<code asm>        setne   al</code>
 +
 +
 +=== SGDT ===
 +Store global descriptor table register (286+)
 +
 +     operand    bytes                   286     386     486     Pentium
 +     mem48                            11            10         NP
 +
 +Example:
 +<code asm>        sgdt    descriptor[ebx]</code>
 +
 +
 +=== SIDT ===
 +Store interrupt descriptor table register (286+)
 +
 +     operand    bytes                   286     386     486     Pentium
 +     mem48                            12            10         NP
 +
 +Example:
 +<code asm>        sidt    descriptor[ebx]</code>
 +
 +
 +=== SHLD ===
 +Double precision shift left (386+)
 +
 +     operands        bytes                      386     486     Pentium
 +     reg, reg, imm    4                          3               NP
 +     mem, reg, imm   4+d(0-2)                    7               NP
 +     reg, reg, cl                              3               NP
 +     mem, reg, cl    4+d(0-2)                    7               NP
 +
 +Example:
 +<code asm>        shld    eax, ebx, 16</code>
 +
 +
 +=== SHRD ===
 +Double precision shift right (386+)
 +
 +     operands        bytes                      386     486     Pentium
 +     reg, reg, imm    4                          3               NP
 +     mem, reg, imm   4+d(0-2)                    7               NP
 +     reg, reg, cl                              3               NP
 +     mem, reg, cl    4+d(0-2)                    7               NP
 +
 +Example:
 +<code asm>        shrd    eax, ebx, 16</code>
 +
 +
 +=== SLDT ===
 +Store local descriptor table register (286+)
 +
 +     operands   bytes                   286     386     486     Pentium
 +     r16                                                   NP
 +     mem16     3+d(0-2)                  3                     NP
 +
 +Example:
 +<code asm>        sldt    ax</code>
 +
 +
 +=== SMSW ===
 +Store machine status word (286+)
 +
 +     operands   bytes                   286     386     486     Pentium
 +     r16                                                   NP
 +     mem16     3+d(0-2)                  3                     NP
 +
 +Example:
 +<code asm>        smsw    ax</code>
 +
 +
 +=== STC ===
 +Set the carry flag
 +
 +                bytes   8088    186     286     386     486     Pentium
 +                                                       NP
 +
 +Example:
 +<code asm>        stc</code>
 +
 +
 +=== STD ===
 +Set direction flag (set to reverse string direction)
 +
 +                bytes   8088    186     286     386     486     Pentium
 +                                                       NP
 +
 +Example:
 +<code asm>        std</code>
 +
 +
 +=== STI ===
 +Set interrupt flag (enable)
 +
 +                bytes   8088    186     286     386     486     Pentium
 +                                                       NP
 +
 +Example:
 +<code asm>        sti</code>
 +
 +
 +=== 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:
 +<code asm>        rep     stosd</code>
 +
 +
 +=== 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:
 +<code asm>        str     bx</code>
 +
 +
 +=== 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)\\ +i(1,2)  |  23+EA  |  16    7    |  7    |  3    |  3   UV*  |
 +|  acc, imm  |  1+i(1,2)            |  4      |  4    |  3    |  2    |  1    |  1   UV   |
 +
 +* : not pairable if there is a displacement and immediate
 +
 +Example:
 +<code asm>        sub     eax, ebx</code>
 +
 +
 +=== 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)\\ +i(1,2)  |  11+EA  |  10    6    |  5    |  2    |  2   UV*  |
 +|  acc, imm  |  1+i(1,2)            |  4      |  4    |  3    |  2    |  1    |  1   UV   |
 +
 +* : not pairable if there is a displacement and immediate
 +
 +Example:
 +
 +<code asm>       sub     eax, ebx</code>
 +=== VERR ===
 +Verify a segment for reading (286+)
 +
 +^  operands  ^  bytes  ^  8088  ^  186  ^  286  ^  386  ^  486  ^  Pentium    ^
 +|     r16    |            |       14  |   10  |  11      7   NP  |
 +|     mem16  |  3+d(0,2)  |  -  |    |    16  |  11     11  |       NP  |
 +
 +Example:
 +<code asm>        verr    ax</code>
 +
 +
 +=== VERW ===
 +Verify a segment for writing (286+)
 +
 +^  operands  ^  bytes  ^  8088  ^  186  ^  286  ^  386  ^  486  ^  Pentium    ^
 +|     r16    |          -         14  |   15  |  11      7   NP  |
 +|     mem16  |  3+d(0,2)  |  -  |       16  |   16  |  11      7   NP  |
 +
 +Example:
 +<code asm>        verr    ax</code>
 +
 +
 +=== WAIT ===
 +Wait for co-processor
 +
 +^  operands  ^  bytes  ^  8088  ^  186  ^  286  ^  386  ^  486  ^  Pentium    ^
 +|      -        1    |      |        3  |       1-3 |       NP  |
 +
 +Example:
 +<code asm>        wait</code>
 +
 +
 +=== WBINVD ===
 +Write-back and invalidate data cache (486+)
 +
 +^  operands  ^  bytes  ^  8088  ^  186  ^  286  ^  386  ^  486  ^  Pentium    ^
 +|  -          2      |  -      -    |  -    |  -    |  5    |  2000+  NP  |
 +
 +Example:
 +<code asm>        wbinvd</code>
 +
 +
 +=== WRMSR ===
 +Write to model specific register (PENTIUM+)
 +
 +^  operands  ^  bytes  ^  8088  ^  186  ^  286  ^  386  ^  486  ^  Pentium   ^
 +|  -          2      |  -      -    |  -    |  -    |  -    |  30-45 NP  |
 +
 +Example:
 +<code asm>        wrmsr</code>
 +
 +
 +=== XADD ===
 +Exchange and add (486+)
 +
 +^  operands  ^  bytes      8088  ^  186  ^  286  ^  386  ^  486  ^  Pentium  ^
 +|  reg, reg  |  3          -      -    |  -    |  -    |  3    |  3   NP   |
 +|  mem, reg  |  3+d(0-2)  |  -      -    |  -    |  -    |  4    |  4   NP   |
 +
 +Example:
 +<code asm>        xadd    eax, ebx</code>
 +
 +
 +=== 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:
 +<code asm>        xchg    ax, dx</code>
 +
 +=== XLAT/XLATB ===
 +Table look-up translation
 +
 +^  operands  ^  bytes  ^  8088  ^  186  ^  286  ^  386  ^  486  ^  Pentium  ^
 +|  -          1      |  11    |  11    5    |  5    |  4    |  4   NP   |
 +
 +Example:
 +<code asm>        xlat</code>
 +
 +
 +=== 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)\\ +i(1,2)  |  23+EA  |  16    7    |  7    |  3    |  3   UV*  |
 +|  acc, imm  |  1+i(1,2)            |  4      |  4    |  3    |  2    |  1    |  1   UV   |
 +
 +* : not pairable if there is a displacement and immediate
 +
 +Example:
 +<code asm>        xor     eax, ebx</code>