Table des matières
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
operands | 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)
operands | 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)
operands | bytes | 8088 | 186 | 286 | 386 | 486 | Pentium |
---|---|---|---|---|---|---|---|
- | 2 | 83 | 19 | 16 | 17 | 15 | 18 NP |
Example:
aam
AAS
ASCII adjust AL after subtraction
operands | 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) +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:
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) +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:
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) +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:
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)
operand | 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)
operand | bytes | 386 | 486 | Pentium |
---|---|---|---|---|
- | 1 | 3 | 3 | 3 NP |
Example:
cwde
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:
cwd
CDQ
Convert double to quad (EAX –> EDX:EAX)
operand | bytes | 386 | 486 | Pentium |
---|---|---|---|---|
- | 1 | 2 | 3 | 2 NP |
Example:
cdq
CLC
Clear the carry flag
operand | 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)
operand | bytes | 8088 | 186 | 286 | 386 | 486 | Pentium |
---|---|---|---|---|---|---|---|
- | 1 | 2 | 2 | 2 | 2 | 2 | 2 NP |
Example:
cld
CLI
Clear the interrupt flag (disable interrupts)
operand | 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+)
operand | bytes | 286 | 386 | 486 | Pentium |
---|---|---|---|---|---|
- | 2 | 2 | 5 | 7 | 10 NP |
Example:
clts
CMC
Complement carry flag
operand | 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) +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:
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+)
operands | bytes | Pentium |
---|---|---|
- | 2 | 14 NP |
Example:
cpuid
DAA
Decimal adjust AL after addition
operand | bytes | 8088 | 186 | 286 | 386 | 486 | Pentium |
---|---|---|---|---|---|---|---|
- | 1 | 4 | 4 | 3 | 4 | 2 | 3 NP |
Example:
daa
DAS
Decimal adjust AL after subtraction
operand | 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 dividend | operand | quotient | remainder | ||
---|---|---|---|---|---|
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 |
Example:
enter 1, 0
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:
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 dividend | operand | quotient | remainder |
---|---|---|---|
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 multiplicand | operand (multiplier) | result |
---|---|---|
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) +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 |
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
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:
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
operands | 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
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:
into
INVD
Invalidate data cache (486+)
operand | bytes | 8088 | 186 | 286 | 386 | 486 | Pentium |
---|---|---|---|---|---|---|---|
- | 2 | - | - | - | - | 4 | 15 NP |
Example:
invd
INVLPG
Invalidate TLB entry (486+)
operand | bytes | 8088 | 186 | 286 | 386 | 486 | Pentium |
---|---|---|---|---|---|---|---|
mem32 | 5 | - | - | - | - | 12 | 25 NP |
Example:
invlpg [eax]
IRET
Return from interrupt
operand | 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+)
operand | bytes | 8088 | 186 | 286 | 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
operand | bytes | 8088 | 186 | 286 | 386 | 486 | Pentium |
---|---|---|---|---|---|---|---|
- | 1 | 4 | 2 | 2 | 2 | 3 | 2 NP |
Example:
lahf
LAR [UPDATE]
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) +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:
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 |
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) +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:
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) +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:
sub eax, ebx
VERR
Verify a segment for reading (286+)
operands | bytes | 8088 | 186 | 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+)
operands | bytes | 8088 | 186 | 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
operands | 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+)
operands | bytes | 8088 | 186 | 286 | 386 | 486 | Pentium |
---|---|---|---|---|---|---|---|
- | 2 | - | - | - | - | 5 | 2000+ NP |
Example:
wbinvd
WRMSR
Write to model specific register (PENTIUM+)
operands | bytes | 8088 | 186 | 286 | 386 | 486 | Pentium |
---|---|---|---|---|---|---|---|
- | 2 | - | - | - | - | - | 30-45 NP |
Example:
wrmsr
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:
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
operands | 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) +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:
xor eax, ebx