๐ฅ Explore this must-read post from Hacker News ๐
๐ Category:
๐ Hereโs what youโll learn:
x86 architecture
1 byte opcodes
| xxh | ย x0h ย |
x1h | x2h | x3h | x4h | x5h | x6h | x7h | |
| ย 0xh ย |
ADD Eb,Gb |
ADD Ev,Gv |
ADD Gb,Eb |
ADD Gv,Ev |
ADD AL,Ib |
ADD rAX,Iz |
PUSHI64 ES |
POPI64 ES |
|
| ย 1xh ย |
ADC Eb,Gb |
ADC Ev,Gv |
ADC Gb,Eb |
ADC Gv,Ev |
ADC AL,Ib |
ADC rAX,Iz |
PUSHI64 SS |
POPI64 SS |
|
| ย 2xh ย |
AND Eb,Gb |
AND Ev,Gv |
AND Gb,Eb |
AND Gv,Ev |
AND AL,Ib |
AND rAx,Iz |
ES: | DAAI64 | |
| ย 3xh ย |
XOR Eb,Gb |
XOR Ev,Gv |
XOR Gb,Eb |
XOR Gv,Ev |
XOR AL,Ib |
XOR rAX,Iz |
SS: | AAAI64 | |
| ย 4xh ย !REX2ย |
INCI64 eAXย | INCI64 eCX | INCI64 eDX | INCI64 eBX | INCI64 eSP | INCI64 eBP | INCI64 eSI | INCI64 eDI | |
| REX | |||||||||
| ย 5xh ย |
PUSHD64 rAX / r8 / r16 / r24 |
PUSHD64 rCX / r9 / r17 / r25 |
PUSHD64 rDX / r10 / r18 / r26 |
PUSHD64 rBX / r11 / r19 / r27 |
PUSHD64 rSP / r12 / r20 / r28 |
PUSHD64 rBP / r13 / r21 / r29 |
PUSHD64 rSI / r14 / r22 / r30 |
PUSHD64 rDI / r15 / r23 / r31 |
|
| REX2.W1 PUSHPF64ย Rq | |||||||||
| ย 6xh ย |
PUSHAI64 PUSHADI64 (80186+) |
POPAI64 POPADI64 (80186+) |
BOUNDI64 Gv,Ma (80186+) |
ARPLI64 Ew,Gw (80286+) |
FS: (80386+) Hint Alt Taken for Jcc (P4) |
GS: (80386+) |
OPSIZE: (80386+) |
ADSIZE: (80386+) |
|
| L1OM MVEX EVEX | MOVSXDย Gv,Ed (PM64) |
||||||||
| ย 7xh ย !REX2ย |
JODf64 Jb |
JNODf64 Jb |
JBDf64 Jb |
JNBDf64 Jb |
JZDf64 Jb | JNZDf64 Jb | JBEDf64 Jb |
JNBEDf64 Jb |
|
| JKZDv64 vKw,Jbv (K1OM) |
JKNZDv64 vKw,Jbv (K1OM) |
||||||||
| ย 8xh ย |
group #1 Eb,Ib |
group #1 Ev,Iz |
group #1*I64 Eb,Ib |
group #1 Ev,Ib |
TEST Eb,Gb |
TEST Ev,Gv |
XCHG Eb,Gb |
XCHG Ev,Gv |
|
| ย 9xh ย |
(F3h) PAUSE XCHG rAX,rAX |
ย XCHG rCX,rAXย XCHG ย ย r9,rAXย XCHG r17,rAX XCHG r25,rAX |
ย XCHG rDX,rAXย XCHG r10,rAXย XCHG r18,rAX XCHG r26,rAX |
ย XCHG rBX,rAXย XCHG r11,rAXย XCHG r19,rAX XCHG r27,rAX |
ย XCHG rSP,rAXย XCHG r12,rAXย XCHG r20,rAX XCHG r28,rAX |
ย XCHG rBP,rAXย XCHG r13,rAXย XCHG r21,rAX XCHG r29,rAX |
ย XCHG rSI,rAXย XCHG r14,rAXย XCHG r22,rAX XCHG r30,rAX |
ย XCHG rDI,rAXย XCHG r15,rAXย XCHG r23,rAX XCHG r31,rAX |
|
| XCHG ย ย r8,rAX XCHG r16,rAX XCHG r24,rAX |
|||||||||
| ย Axh ย !REX2ย |
MOV AL,Ob |
MOV rAX,Ov |
MOV Ob,AL |
MOV Ov,rAX |
MOVS Yb,Xb |
MOVS Yv,Xv |
CMPS Yb,Xb |
CMPS Yv,Xv |
|
| REX2.W0 JMPABS Aq |
|||||||||
| ย Bxh ย |
(!REX) MOV AL,Ib ย (REX) MOV AL,Ib MOV ย ย R8B,Ib MOV R16B,Ib MOV R24B,Ib |
(!REX) MOV CL,Ib ย (REX) MOV CL,Ib MOV ย ย R9B,Ib MOV R17B,Ib MOV R25B,Ib |
(!REX) MOV DL,Ib ย (REX) MOV DL,Ib MOV R10B,Ib MOV R18B,Ib MOV R26B,Ib |
(!REX) MOV BL,Ib ย (REX) MOV BL,Ib MOV R11B,Ib MOV R19B,Ib MOV R27B,Ib |
(!REX) MOV AH,Ib (REX) MOV SPL,Ib MOV R12B,Ib MOV R20B,Ib MOV R28B,Ib |
(!REX) MOV CH,Ib (REX) MOV BPL,Ib MOV R13B,Ib MOV R21B,Ib MOV R29B,Ib |
(!REX) MOV DH,Ib (REX) ย MOV SIL,Ib MOV R14B,Ib MOV R22B,Ib MOV R30B,Ib |
(!REX) MOV BH,Ib (REX) ย MOV DIL,Ib MOV R15B,Ib MOV R23B,Ib MOV R31B,Ib |
|
| ย Cxh ย |
group #2 Eb,Ib (80186+) |
group #2 Ev,Ib (80186+) |
RET nearDf64 Iw |
RET nearDf64 ย |
LESI64 Gv,Mp (w:v) | LDSI64 Gv,Mp (w:v) | group #11 Eb,Ib |
group #11 Ev,Iz |
|
| VEX3 | VEX2 | ||||||||
| ย Dxh ย |
group #2 Eb,1 |
group #2 Ev,1 |
group #2 Eb,CL |
group #2 Ev,CL |
ย AAMI64 Ib | ย AADI64 Ib | ย S(ET)ALCI64 | XLAT | |
| reserved | REX2 | L1OM | UDB | ||||||
| ย Exh ย !REX2ย |
LOOPNEDf64 LOOPNZDf64 Jb |
LOOPEDf64 LOOPZDf64 Jb |
ย LOOPDf64 Jb |
JCXZDf64 JECXDf64 JRCXDf64 Jb |
IN AL,Ib |
IN eAX,Ib |
OUT Ib,AL |
OUT Ib,eAX |
|
| ย Fxh ย |
LOCK: | #UD (80186/80188) UMPF: (80286) INT1 aka ICEBP (80386+) |
ย REPNE: BND: (MPX) XACQUIRE: (HLE) |
REP: REPE: ย XRELEASE: (HLE) |
HLT | CMC | group #3 Eb |
group #3 Ev |
|
| notes on 90h |
XCHG ย ย AX,ย ย AX โ classic 16-bit NOP (8086) | If CPUID does indicate support, then a REP prefix will apply PAUSE semantics to a NOP. |
The blame for that “special treatment” of PM64 O32 NOP โ effectively D64 โ falls on me. ย I did spot that zeroing the upper 32 bits of RAX leads to undesired non-NOP behavior, but failed to convince our team in 2001 to use one of the freed up 1-byte opcodes (a la UDB). |
||||||
| XCHG eAX,eAX โ wider 32-bit NOP (80386) | |||||||||
| XCHG ย rAX,ย rAX โ wider 64-bit NOP (x86-64) | In PM64 with O32, XCHG EAX,EAX must not zero the upper 32 bits of RAX. Thus it is D64.
|
||||||||
| XCHG ย ย ย rN,ย rAX (N=8 | ,16,24) is not a NOP! | ||||||||
| xxh | ย x8h ย |
x9h | xAh | xBh | xCh | xDh | xEh | xFh |
| ย 0xh ย |
OR Eb,Gb |
OR Ev,Gv |
OR Gb,Eb |
OR Gv,Ev |
OR AL,Ib |
OR rAX,Iz |
|
POP CS (8086/8088) #UD (80186/80188) 2 byte opcodes (80286+) |
| ย 1xh ย |
SBB Eb,Gb |
SBB Ev,Gv |
SBB Gb,Eb |
SBB Gv,Ev |
SBB AL,Ib |
SBB rAX,Iz |
PUSHI64 DS |
POPI64 DS |
| ย 2xh ย |
SUB Eb,Gb |
SUB Ev,Gv |
SUB Gb,Eb |
SUB Gv,Ev |
SUB AL,Ib |
SUB rAX,Iz |
CS:   Hint Not Taken for Jcc (P4) |
DASI64 |
| ย 3xh ย |
CMP Eb,Gb |
CMP Ev,Gv |
CMP Gb,Eb |
CMP Gv,Ev |
CMP AL,Ib |
CMP rAX,Iz |
DS: CET: (CET) Hint Taken for Jcc (P4) |
AASI64 |
| ย 4xh ย !REX2ย |
DECI64 eAXย | DECI64 eCX | DECI64 eDX | DECI64 eBX | DECI64 eSP | DECI64 eBP | DECI64 eSI | DECI64 eDI |
| REX | ||||||||
| ย 5xh ย |
POPD64 rAX / r8 / r16 / r24 |
POPD64 rCX / r9 / r17 / r25 |
POPD64 rDX / r10 / r18 / r26 |
POPD64 rBX / r11 / r19 / r27 |
POPD64 rSP / r12 / r20 / r28 |
POPD64 rBP / r13 / r21 / r29 |
POPD64 rSI / r14 / r22 / r30 |
POPD64 rDI / r15 / r23 / r31 |
| REX2.W1 POPPF64ย Rq | ||||||||
| ย 6xh ย |
PUSHD64 Iz (80186+) |
IMUL Gv,Ev,Iz (80186+) |
PUSHD64 Ib (80186+) |
IMUL Gv,Ev,Ib (80186+) |
INS Yb,DX (80186+) |
INS Yz,DX (80186+) |
OUTS DX,Xb (80186+) |
OUTS DX,Xz (80186+) |
| ย 7xh ย !REX2ย |
JSDf64 Jb |
JNSDf64 Jb |
JPDf64 Jb |
JNPDf64 Jb |
JLDf64 Jb |
JNLDf64 Jb |
JLEDf64 Jb |
JNLEDf64 Jb |
| ย 8xh ย |
MOV Eb,Gb |
MOV Ev,Gv |
MOV Gb,Eb |
MOV Gv,Ev |
MOV Mw,Sw MOV Rv,Sw |
LEA Gv,M ย |
MOV Sw,Mw MOV Sw,Rv |
group #1A |
| ย 9xh ย |
CBW (8088) CWDE (80386+) CDQE (PM64) |
CWD (8088) CDQ (80386+) CQO (PM64) |
CALLI64 Ap (w:z) |
WAIT FWAIT |
PUSHFD64 Fv |
POPFD64 Fv |
SAHF (LM: if AHF64) |
LAHF (LM: if AHF64) |
| ย Axh ย !REX2ย |
TEST AL,Ib |
TEST rAX,Iz |
STOS Yb,AL |
STOS Yv,rAX |
LODS AL,Xb |
LODS rAX,Xv |
SCAS Yb,AL |
SCAS Yv,rAX |
| ย Bxh ย |
MOV rAX,Iv MOV ย ย r8,Iv MOV r16,Iv MOV r24,Iv |
MOV rCX,Iv MOV ย ย r9,Iv MOV r17,Iv MOV r25,Iv |
MOV rDX,Iv MOV r10,Iv MOV r18,Iv MOV r26,Iv |
MOV rBX,Iv MOV r11,Iv MOV r19,Iv MOV r27,Iv |
MOV rSP,Iv MOV r12,Iv MOV r20,Iv MOV r28,Iv |
MOV rBP,Iv MOV r13,Iv MOV r21,Iv MOV r29,Iv |
MOV rSI,Iv MOV r14,Iv MOV r22,Iv MOV r30,Iv |
MOV rDI,Iv MOV r15,Iv MOV r23,Iv MOV r31,Iv |
| ย Cxh ย |
ENTERD64 Iw,Ib (80186+) |
LEAVED64 ย (80186+) |
RET far Iw |
RET far ย |
INT3 | INT Ib |
INTOI64 | IRET |
| ย Dxh ย |
ESC 0 |
ESC 1 |
ESC 2 |
ESC 3 |
ESC 4 |
ESC 5 |
ESC 6 |
ESC 7 |
| ย Exh ย !REX2ย |
CALLDf64 Jz |
JMPDf64 Jz |
JMPI64 Ap (w:z) |
JMPDf64 Jb |
IN AL,DX |
IN eAX,DX |
OUT DX,AL |
OUT DX,eAX |
| ย Fxh ย |
CLC | STC | ย ย CLIย (F0h) CLX (REX32) |
ย ย STIย (F0h) STX (REX32) |
CLD | STD | group #4 INC/DEC |
group #5 INC/DEC/etc. |
On 8086/8088 processors the following behavior was supported instead.
| xxh | ย x0h ย |
x1h | x2h | x3h | x4h | x5h | x6h | x7h |
| … | … | |||||||
| ย 6xh ย |
JO* Jb |
JNO* Jb |
JB* Jb |
JNB* Jb |
JZ* Jb |
JNZ* Jb |
JBE* Jb |
JNBE* Jb |
| ย 7xh ย |
JO Jb |
JNO Jb |
JB Jb |
JNB Jb |
JZ Jb |
JNZ Jb |
JBE Jb |
JNBE Jb |
| ย 8xh ย |
group #1 Eb,Ib |
group #1 Ew,Iw |
group #1* Eb,Ib |
group #1 Ew,Ib |
TEST Eb,Gb |
TEST Ew,Gw |
XCHG Eb,Gb |
XCHG Ew,Gw |
| … | … | |||||||
| ย Cxh ย |
RET* near Iw |
RET* near ย |
RET near Iw |
RET near ย |
LES Gw,Mp (w:w) ย |
LDS Gw,Mp (w:w) ย |
group #11 Eb,Ib |
group #11 Ew,Iw |
| LES Gw,(IND:TMP) ย |
LDS Gw,(IND:TMP) ย |
|||||||
| … | … | |||||||
| ย Fxh ย |
LOCK: | LOCK:* | REPNE: | REP: REPE: |
HLT | CMC | group #3 Eb |
group #3 Ew |
| xxh | ย x8h ย |
x9h | xAh | xBh | xCh | xDh | xEh | xFh |
| … | … | |||||||
| ย 6xh ย |
JS* Jb |
JNS* Jb |
JP* Jb |
JNP* Jb |
JL* Jb |
JNL* Jb |
JLE* Jb |
JNLE* Jb |
| ย 7xh ย |
JS Jb |
JNS Jb |
JP Jb |
JNP Jb |
JL Jb |
JNL Jb |
JLE Jb |
JNLE Jb |
| ย 8xh ย |
MOV Eb,Gb |
MOV Ew,Gw |
MOV Gb,Eb |
MOV Gw,Ew |
MOV Mw,Sw MOV Rw,Sw |
LEA Gv,M ย |
MOV Sw,Mw MOV Sw,Rw |
group #1A |
| LEA Gv,IND ย |
||||||||
| … | … | |||||||
| ย Cxh ย |
RET* far Iw |
RET* far ย |
RET far Iw |
RET far ย |
INT3 | INT Ib |
INTO | IRET |
| … | … | |||||||
| ย Fxh ย |
CLC | STC | CLI | STI | CLD | STD | group #4 INC/DEC |
group #5 INC/DEC/etc. |
note: The opcodes marked with * are aliases to other opcodes.
ยฉ 1996-2025 by Christian Ludloff. All rights reserved. Use at your own risk.
๐ฌ Share your opinion below!
#๏ธโฃ #sandpile.org #x86 #architecture #byte #opcodes
๐ Posted on 1761935413
