IA-32 Instruction Decoding

This page is under construction. Even if I do get around to finishing it, Christian Ludloff's opcode maps will likely be better. Mine are simpler, though.

The IA-32 opcode is necessarily complex, and it's best broken up into many tables. I have finished most of them. Do the floating point table for me and you may get extra credit.

Opcode Map (First Byte)

      0 1 2 3 4 5 6 7 8 9 A B C D E F
0 ADD
Eb,Gb
ADD
Ev,Gv
ADD
Gb,Eb
ADD
Gv,Ev
ADD
AL,Ib
ADD
eAX,Iv
PUSH
ES
POP
ES
OR
Eb,Gb
OR
Ev,Gv
OR
Gb,Eb
OR
Gv,Ev
OR
AL,Ib
OR
eAX,Iv
PUSH
CS
two byte
opcodes
1 ADC
Eb,Gb
ADC
Ev,Gv
ADC
Gb,Eb
ADC
Gv,Ev
ADC
AL,Ib
ADC
eAX,Iv
PUSH
SS
POP
SS
SBB
Eb,Gb
SBB
Ev,Gv
SBB
Gb,Eb
SBB
Gv,Ev
SBB
AL,Ib
SBB
eAX,Iv
PUSH
DS
POP
DS
2 AND
Eb,Gb
AND
Ev,Gv
AND
Gb,Eb
AND
Gv,Ev
AND
AL,Ib
AND
eAx,Iv
ES: DAA SUB
Eb,Gb
SUB
Ev,Gv
SUB
Gb,Eb
SUB
Gv,Ev
SUB
AL,Ib
SUB
eAX,Iv
CS:/
Hint not taken:
DAS
3 XOR
Eb,Gb
XOR
Ev,Gv
XOR
Gb,Eb
XOR
Gv,Ev
XOR
AL,Ib
XOR
eAX,Iv
SS: AAA CMP
Eb,Gb
CMP
Ev,Gv
CMP
Gb,Eb
CMP
Gv,Ev
CMP
AL,Ib
CMP
eAX,Iv
DS:/
Hint taken:
AAS
4 INC
eAX
INC
eCX
INC
eDX
INC
eBX
INC
eSP
INC
eBP
INC
eSI
INC
eDI
DEC
eAX
DEC
eCX
DEC
eDX
DEC
eBX
DEC
eSP
DEC
eBP
DEC
eSI
DEC
eDI
5 PUSH
eAX
PUSH
eCX
PUSH
eDX
PUSH
eBX
PUSH
eSP
PUSH
eBP
PUSH
eSI
PUSH
eDI
POP
eAX
POP
eCX
POP
eDX
POP
eBX
POP
eSP
POP
eBP
POP
eSI
POP
eDI
6 PUSHA/
PUSHAD
POPA/
POPAD
BOUND
Gv,Ma
ARPL
Ew,Rw
FS: GS: OPSIZE: ADSIZE: PUSH
Iv
IMUL
Gv,Ev,Iv
PUSH
Ib
IMUL
Gv,Ev,Ib
INSB
Yb,DX
INSW/
INSD
Yv,DX
OUTSB
DX,Xb
OUTSW/
OUTSD
DX,Xv
7 JO
Jb
JNO
Jb
JB/JC/
JNAE
Jb
JNB/JNC/
JAE
Jb
JZ/
JE
Jb
JNZ/
JNE
Jb
JBE/
JNA
Jb
JNBE/
JA
Jb
JS
Jb
JNS
Jb
JP/
JPE
Jb
JNP/
JPO
Jb
JL/
JNGE
Jb
JNL/
JGE
Jb
JLE/
JNG
Jb
JNLE/
JG
Jb
8 group #1
Eb,Ib
group #1
Ev,Iv
group #1
Eb,Ib
group #1
Ev,Ib
TEST
Eb,Gb
TEST
Ev,Gv
XCHG
Eb,Gb
XCHG
Ev,Gv
MOV
Eb,Gb
MOV
Ev,Gv
MOV
Gb,Eb
MOV
Gv,Ev
MOV
Ew,Sw
LEA
Gv,M
MOV
Sw,Ew
group #10
9 NOP/
(F3) PAUSE
XCHG
eCX,eAX
XCHG
eDX,eAX
XCHG
eBX,eAX
XCHG
eSP,eAX
XCHG
eBP,eAX
XCHG
eSI,eAX
XCHG
eDI,eAX
CBW/
CWDE
CWD/
CDQ
CALL
Ap
WAIT/
FWAIT
PUSHF
Fv
POPF
Fv
SAHF LAHF
A MOV
AL,Ob
MOV
eAX,Ov
MOV
Ob,AL
MOV
Ov,eAX
MOVSB
Xb,Yb
MOVSW/
MOVSD
Xv,Yv
CMPSB
Xb,Yb
CMPSW/
CMPSD
Xv,Yv
TEST
AL,Ib
TEST
eAX,Iv
STOSB
Yb,AL
STOSW/
STOSD
Yv,eAX
LODSB
AL,Xb
LODSW/
LODSD
eAX,Xv
SCASB
AL,Yb
SCASW/
SCASD
eAX,Yv
B MOV
AL,Ib
MOV
CL,Ib
MOV
DL,Ib
MOV
BL,Ib
MOV
AH,Ib
MOV
CH,Ib
MOV
DH,Ib
MOV
BH,Ib
MOV
eAX,Iv
MOV
eCX,Iv
MOV
eDX,Iv
MOV
eBX,Iv
MOV
eSP,Iv
MOV
eBP,Iv
MOV
eSI,Iv
MOV
eDI,Iv
C group #2
Eb,Ib
group #2
Ev,Ib
RET near
Iw
RET near LES
Gv,Mp
LDS
Gv,Mp
group #12
Eb,Ib
group #12
Ev,Iv
ENTER
Iw,Ib
LEAVE RET far
Iw
RET far INT 3 INT
Ib
INTO IRET
D group #2
Eb,1
group #2
Ev,1
group #2
Eb,CL
group #2
Ev,CL
AAM
Ib
AAD
Ib
  XLAT floating point instructions
E LOOPNE/
LOOPNZ
Jb
LOOPE/
LOOPZ
Jb
LOOP
Jb
JCXZ/
JECXZ
Jb
IN
AL,Ib
IN
eAX,Ib
OUT
Ib,AL
OUT
Ib,eAX
CALL
Jv
JMP
Jv
JMP
Ap
JMP
Jb
IN
AL,DX
IN
eAX,DX
OUT
DX,AL
OUT
DX,eAX
F LOCK:   REPNE: REP:/
REPE:
HLT CMC group #3
Eb
group #3
Ev
CLC STC CLI STI CLD STD group #4 group #5

Opcode Map (Second Byte)

    0 1 2 3 4 5 6 7
n/a 0 group #6 group #7 LAR
Gv,Ew
LSL
Gv,Ew
    CLTS  
n/a 1 MOVUPS
Vo,Wo
(66) MOVUPD
Vo,Wo
(F3) MOVSS
Vd,Wd
(F2) MOVSD
Vq,Wq
MOVUPS
Wo,Vo
(66) MOVUPD
Wo,Vo
(F3) MOVSS
Wd,Vd
(F2) MOVSD
Wq,Vq
MOVLPS Vq,Mq
MOVHLPS Vq,Vq
(66) MOVLPD
Vq,Mq
MOVLPS
Mq,Vq
(66) MOVLPD
Mq,Vq
UNPCKLPS
Vo,Wq
(66) UNPCKLPD
Vo,Wq
UNPCKHPS
Vo,Wo
(66) UNPCKHPD
Vo,Wo
MOVHPS Vq,Mq
MOVLHPS Vq,Vq
(66) MOVHPD
Vq,Mq
MOVHPS
Mq,Vq
(66) MOVHPD
Mq,Vq
n/a 2 MOV
Rd,Cd
MOV
Rd,Dd
MOV
Cd,Rd
MOV
Dd,Rd
MOV
Rd,Td
  MOV
Td,Rd
 
n/a 3 WRMSR RDTSC RDMSR RDPMC SYSENTER SYSEXIT    
n/a 4 CMOVO
Gv,Ev
CMOVNO
Gv,Ev
CMOVB/
CMOVNAE
Gv,Ev
CMOVNB/
CMOVAE
Gv,Ev
CMOVZ/
CMOVE
Gv,Ev
CMOVNZ/
CMOVNE
Gv,Ev
CMOVBE/
CMOVNA
Gv,Ev
CMOVNBE/
CMOVA
Gv,Ev
n/a 5 MOVMSKPS
Gd,Vo
SQRTPS
Vo,Wo
RSQRTPS
Vo,Wo
RCPPS
Vo,Wo
ANDPS
Vo,Wo
ANDNPS
Vo,Wo
ORPS
Vo,Wo
XORPS
Vo,Wo
F3   SQRTSS
Vd,Wd
RSQRTSS
Vd,Wd
RCPSS
Vd,Wd
       
66 MOVMSKPD
Gd,Vo
SQRTPD
Vo,Wo
    ANDPD
Vo,Wo
ANDNPD
Vo,Wo
ORPD
Vo,Wo
XORPD
Vo,Wo
F2   SQRTSD
Vq,Wq
           
n/a 6 PUNPCKL-
BW Pq,Qd
PUNPCKL-
WD Pq,Qd
PUNPCKL-
DQ Pq,Qd
PACKSSWB
Pq,Qq
PCMPGTB
Pq,Qq
PCMPGTW
Pq,Qq
PCMPGTD
Pq,Qq
PACKUSWB
Pq,Qq
66 PUNPCKL-
BW Vo,Wq
PUNPCKL-
WD Vo,Wq
PUNPCKL-
DQ Vo,Wq
PACKSSWB
Vo,Wo
PCMPGTB
Vo,Wo
PCMPGTW
Vo,Wo
PCMPGTD
Vo,Wo
PACKUSWB
Vo,Wo
n/a 7 PSHUFW
Pq,Qq,Ib
group #13
PSHIMW
group #14
PSHIMD
group #15
PSHIMQ
PCMPEQB
Pq,Qq
PCMPEQW
Pq,Qq
PCMPEQD
Pq,Qq
EMMS
F3 PSHUFHW
Vo,Wo,Ib
             
66 PSHUFD
Vo,Wo,Ib
group #13
PSHIMW
group #14
PSHIMD
group #15
PSHIMQ/DQ
PCMPEQB
Vo,Wo
PCMPEQW
Vo,Wo
PCMPEQD
Vo,Wo
 
F2 PSHUFLW
Vo,Wo,Ib
             
n/a 8 JO
Jv
JNO
Jv
JB
Jv
JNB
Jv
JZ
Jv
JNZ
Jv
JBE
Jv
JNBE
Jv
n/a 9 SETO
Eb
SETNO
Eb
SETB
Eb
SETNB
Eb
SETZ
Eb
SETNZ
Eb
SETBE
Eb
SETNBE
Eb
n/a A PUSH
FS
POP
FS
CPUID BT
Ev,Gv
SHLD
Ev,Gv,Ib
SHLD
Ev,Gv,CL
   
n/a B CMPXCHG
Eb,Gb
CMPXCHG
Ev,Gv
LSS
Gv,Mp
BTR
Ev,Gv
LFS
Gv,Mp
LGS
Gv,Mp
MOVZX
Gv,Eb
MOVZX
Gv,Ew
n/a C XADD
Eb,Gb
XADD
Ev,Gv
CMPccPS #2
Vo,Wo,Ib
MOVNTI
Md,Gd
(SSE2-MEM)
PINSRW
Pq,Mw,Ib
Pq,G[wd],Ib
PEXTRW
Gd,Pq,Ib
SHUFPS
Vo,Wo,Ib
group #9
F3 CMPccSS #2
Vd,Wd,Ib
       
66 CMPccPD #2
Vo,Wo,Ib
  PINSRW
Vo,Mw,Ib
Vo,G[wd],Ib
PEXTRW
Gd,Vo,Ib
SHUFPD
Vo,Wo,Ib
F2 CMPccSD #2
Vq,Wq,Ib
       
n/a D   PSRLW
Pq,Qq
PSRLD
Pq,Qq
PSRLQ
Pq,Qq
PADDQ
Pq,Qq
(MMX-SSE2)
PMULLW
Pq,Qq
  PMOVMSKB
Gd,Pq
F3             MOVQ2DQ
Vo,Pq
 
66   PSRLW
Vo,Wo (!)
PSRLD
Vo,Wo (!)
PSRLQ
Vo,Wo (!)
PADDQ
Vo,Wo
PMULLW
Vo,Wo
MOVQ
Mq,Vq
Vq,Vq
PMOVMSKB
Gd,Vo
F2             MOVDQ2Q
Pq,Vq
 
n/a E PAVGB
Pq,Qq
PSRAW
Pq,Qq
PSRAD
Pq,Qq
PAVGW
Pq,Qq
PMULHUW
Pq,Qq
PMULHW
Pq,Qq
  MOVNTQ
Mq,Pq
F3             CVTDQ2PD
Vo,Wq
 
66 PAVGB
Vo,Wo
PSRAW
Vo,Wo (!)
PSRAD
Vo,Wo (!)
PAVGW
Vo,Wo
PMULHUW
Vo,Wo
PMULHW
Vo,Wo
CVTTPD2DQ
Vo,Wo
MOVNTDQ
Mo,Vo
F2             CVTPD2DQ
Vo,Wo
 
n/a F   PSLLW
Pq,Qq
PSLLD
Pq,Qq
PSLLQ
Pq,Qq
PMULUDQ
Pq,Qq
(MMX-SSE2)
PMADDWD
Pq,Qq
PSADBW
Pq,Qq
MASKMOVQ
Pq,Pq
66   PSLLW
Vo,Wo (!)
PSLLD
Vo,Wo (!)
PSLLQ
Vo,Wo (!)
PMULUDQ
Vo,Wo
PMADDWD
Vo,Wo
PSADBW
Vo,Wo
MASKMOV-
DQU Vo,Vo

    8 9 A B C D E F
n/a 0 INVD WBINVD   UD2        
n/a 1 group #17 (hinting NOP) (hinting NOP) (hinting NOP) (hinting NOP) (hinting NOP) (hinting NOP) (hinting NOP)
n/a 2 MOVAPS
Vo,Wo
MOVAPS
Wo,Vo
CVTPI2PS
Vq,Qq
MOVNTPS
Mo,Vo
CVTTPS2PI
Pq,Wq
CVTPS2PI
Pq,Wq
UCOMISS
Vd,Wd
COMISS
Vd,Wd
F3     CVTSI2SS
Vd,Ed
  CVTTSS2SI
Gd,Wd
CVTSS2SI
Gd,Wd
   
66 MOVAPD
Vo,Wo
MOVAPD
Wo,Vo
CVTPI2PD
Vo,Qq
MOVNTPD
Mo,Vo
 
CVTTPD2PI
Pq,Wo
CVTPD2PI
Pq,Wo
UCOMISD
Vq,Wq
COMISD
Vq,Wq
F2     CVTSI2SD
Vq,Ed
  CVTTSD2SI
Gd,Wq
CVTSD2SI
Gd,Wq
   
n/a 3                
n/a 4 CMOVS
Gv,Ev
CMOVNS
Gv,Ev
CMOVP
Gv,Ev
CMOVNP
Gv,Ev
CMOVL
Gv,Ev
CMOVNL
Gv,Ev
CMOVLE
Gv,Ev
CMOVNLE
Gv,Ev
n/a 5 ADDPS
Vo,Wo
MULPS
Vo,Wo
CVTPS2PD
Vo,Wq
CVTDQ2PS
Vo,Wo
SUBPS
Vo,Wo
MINPS
Vo,Wo
DIVPS
Vo,Wo
MAXPS
Vo,Wo
F3 ADDSS
Vd,Wd
MULSS
Vd,Wd
CVTSS2SD
Vq,Wd
CVTTPS2DQ
Vo,Wo
SUBSS
Vd,Wd
MINSS
Vd,Wd
DIVSS
Vd,Wd
MAXSS
Vd,Wd
66 ADDPD
Vo,Wo
MULPD
Vo,Wo
CVTPD2PS
Vo,Wo
CVTPS2DQ
Vo,Wo
SUBPD
Vo,Wo
MINPD
Vo,Wo
DIVPD
Vo,Wo
MAXPD
Vo,Wo
F2 ADDSD
Vq,Wq
MULSD
Vq,Wq
CVTSD2SS
Vd,Wq
  SUBSD
Vq,Wq
MINSD
Vq,Wq
DIVSD
Vq,Wq
MAXSD
Vq,Wq
n/a 6 PUNPCKH-
BW Pq,Qq
PUNPCKH-
WD Pq,Qq
PUNPCKH-
DQ Pq,Qq
PACKSSDW
Pq,Qq
    MOVD
Pq,Ed
MOVQ
Pq,Qq
F3               MOVDQU
Vo,Wo
66 PUNPCKH-
BW Vo,Wo
PUNPCKH-
WD Vo,Wo
PUNPCKH-
DQ Vo,Wo
PACKSSDW
Vo,Wo
PUNPCKL-
QDQ Vo,Wq
PUNPCKH-
QDQ Vo,Wo
MOVD
Vo,Ed
MOVDQA
Vo,Wo
n/a 7             MOVD
Ed,Pd
MOVQ
Qq,Pq
F3             MOVQ
Vo,Mq
Vq,Vq
MOVDQU
Wo,Vo
66             MOVD
Ed,Vd
MOVDQA
Wo,Vo
n/a 8 JS
Jv
JNS
Jv
JP
Jv
JNP
Jv
JL
Jv
JNL
Jv
JLE
Jv
JNLE
Jv
n/a 9 SETS
Eb
SETNS
Eb
SETP
Eb
SETNP
Eb
SETL
Eb
SETNL
Eb
SETLE
Eb
SETNLE
Eb
n/a A PUSH
GS
POP
GS
RSM BTS
Ev,Gv
SHRD
Ev,Gv,Ib
SHRD
Ev,Gv,CL
group #16 IMUL
Gv,Ev
n/a B   group #11 group #8
Ev,Ib
BTC
Ev,Gv
BSF
Gv,Ev
BSR
Gv,Ev
MOVSX
Gv,Eb
MOVSX
Gv,Ew
n/a C BSWAP
EAX
BSWAP
ECX
BSWAP
EDX
BSWAP
EBX
BSWAP
ESP
BSWAP
EBP
BSWAP
ESI
BSWAP
EDI
n/a D PSUBUSB
Pq,Qq/
(66) Vo,Wo
PSUBUSW
Pq,Qq/
(66) Vo,Wo
PMINUB
Pq,Qq/
(66) Vo,Wo
PAND
Pq,Qq/
(66) Vo,Wo
PADDUSB
Pq,Qq/
(66) Vo,Wo
PADDUSW
Pq,Qq/
(66) Vo,Wo
PMAXUB
Pq,Qq/
(66) Vo,Wo
PANDN
Pq,Qq/
(66) Vo,Wo
n/a E PSUBSB
Pq,Qq/
(66) Vo,Wo
PSUBSW
Pq,Qq/
(66) Vo,Wo
PMINSW
Pq,Qq/
(66) Vo,Wo
POR
Pq,Qq/
(66) Vo,Wo
PADDSB
Pq,Qq/
(66) Vo,Wo
PADDSW
Pq,Qq/
(66) Vo,Wo
PMAXSW
Pq,Qq/
(66) Vo,Wo
PXOR
Pq,Qq/
(66) Vo,Wo
n/a F PSUBB
Pq,Qq/
(66) Vo,Wo
PSUBW
Pq,Qq/
(66) Vo,Wo
PSUBD
Pq,Qq/
(66) Vo,Wo
PSUBQ
Pq,Qq/
(66) Vo,Wo
PADDB
Pq,Qq/
(66) Vo,Wo
PADDW
Pq,Qq/
(66) Vo,Wo
PADDD
Pq,Qq/
(66) Vo,Wo
 

Opcode Map for Floating Point Instructions

Not finished

Opcode Extensions

 
 
 
spare=000 spare=001 spare=010 spare=011 spare=100 spare=101 spare=110 spare=111
group #1
(80..83)
ADD OR ADC SBB AND SUB XOR CMP
group #2
(C0..C1)
(D0..D3)
ROL ROR RCL RCR SHL SHR   SAR
group #3
(F6..F7)
TEST
Ib/Iv
  NOT NEG MUL
AL/eAX
IMUL
AL/eAX
DIV
AL/eAX
IDIV
AL/eAX
group #4
(FE)
INC
Eb
DEC
Eb
           
group #5
(FF)
INC
Ev
DEC
Ev
CALL
Ev
CALL
Mp
JMP
Ev
JMP
Mp
PUSH
Ev
 
group #6
(0F00)
SLDT
Ew
STR
Ew
LLDT
Ew
LTR
Ew
VERR
Ew
VERW
Ew
   
group #7
(0F01)
SGDT
Ms
SIDT
Ms
LGDT
Ms
LIDT
Ms
SMSW
Ew
  LMSW
Ew
INVLPG
Mb
group #8
(0FBA)
        BT BTS BTR BTC
group #9
(0FC7)
  CMPXCHG
Mq
           
group #10
(8F)
POP
Ev
             
group #11
(0FB9)
UD2 UD2 UD2 UD2 UD2 UD2 UD2 UD2
group #12
(C6..C7)
MOV              
group #13
(0F71)
    PSRLW
Pq,Ib/
(66) PSRLW
Vo,Ib
  PSRAW
Pq,Ib/
(66) PSRAW
Vo,Ib
  PSLLW
Pq,Ib/
(66) PSLLW
Vo,Ib
 
group #14
(0F72)
    PSRLD
Pq,Ib/
(66) PSRLD
Vo,Ib
  PSRAD
Pq,Ib/
(66) PSRAD
Vo,Ib
  PSLLD
Pq,Ib/
(66) PSLLD
Vo,Ib
 
group #15
(0F73)
    PSRLQ
Pq,Ib/
(66) PSRLQ
Vo,Ib
 
 
(66) PSRLDQ
Vo,Ib
    PSLLQ
Pq,Ib/
(66) PSLLQ
Vo,Ib
 
 
(66) PSLLDQ
Vo,Ib
group #16
(0FAE)
FXSAVE
M512
FXRSTOR
M512
LDMXCSR
Md
STMXCSR
Md
  LFENCE MFENCE CLFLUSH M/
SFENCE
group #17
(0F18)
PREFETCHNTA
M
PREFETCHT0
M
PREFETCHT1
M
PREFETCHT2
M
       

How to read the decoding tables

Operand Addressing Method Codes
A direct address; no mod R/M byte; address of operand is encoded in instruction; no base register, index register, or scaling factor can be applied; example: JMP (EA)
C reg field of mod R/M byte selects a control register
D reg field of mod R/M byte selects a debug register
E mod R/M byte follows opcode and specifies operand; operand is either a general register or a memory address
F flags register
G reg field of mod R/M byte selects a general register
I immediate data; value of operand is encoded in subsequent bytes of instruction
J instruction contains a relative offset to be added to the instruction pointer register
M mod R/M byte may refer only to memory
O no mod R/M byte; offset of operand is coded as a word or double word (depending on address size attribute) in instruction; no base register, index register, or scaling factor can be applied; example: MOV (A0..A3)
P reg field of mod R/M byte selects a 64-bit MMX register
Q mod R/M byte follows opcode and specifies operand; operand is either an MMX register or a memory address
R mod field of mod R/M byte may refer only to a general register
S reg field of mod R/M byte selects a segment register
T reg field of mod R/M byte selects a test register
V reg field of mod R/M byte selects a 128-bit XMM register
W mod R/M byte follows opcode and specifies operand; operand is either an XMM register or a memory address
X memory addressed by DS:eSI register pair; eg. MOVS, CMPS, OUTS, LODS
Y memory addressed by ES:eDI register pair; eg. MOVS, CMPS, INS, STOS, SCAS

Operand Type Codes
b byte (regardless of operand size attribute)
w word (regardless of operand size attribute)
d dword (regardless of operand size attribute)
q qword (regardless of operand size attribute)
o oword (regardless of operand size attribute)
c byte or word, depending on operand size attribute
v word or doubleword, depending on operand size attribute
a two word or two doubleword operands in memory, depending on operand size attribute (used only by BOUND)
p 32-bit or 48-bit pointer, depending on operand size attribute
s six-byte pseudo-descriptor