최근 수정 시각 : 2024-10-13 11:52:55
상위 문서: x86 <rowcolor=#fff> x86 · AMD64 확장 명령어 집합 인텔 주도 확장 명령어 범용 APX SIMD MMX · SSE SSE2 · SSE3 · SSSE3 · SSE4.1 · SSE4.2 · AVX AVX2 · AVX-512 · AVX10 · AMXAVX-512: F · CD · DQ · BW · VL · IFMA · VBMI · VBMI2 · VNNI · VAES · GFNI · BITALG AVX: AVX-VNNI · AVX-IFMA AVX10: AVX10.1 · AVX10.2 비트 조작 BMI1 · BMI2 · ADX 보안 및 암호 AES-NI · CLMUL · RDRAND · RDSEED · SHA · MPX · SGX · TME · MKTME 가상화 및 기타 VT-x(VMX) · SMX · TSX AMD 주도 확장 명령어 SIMD 및 비트 연산 3DNow! PREFETCHW · F16C · XOP · FMA FMA4 · FMA3 비트 조작 ABM 보안 및 암호 SME 가상화 및 기타 AMD-V
[clearfix]x86 아키텍처의 명령어 목록. AMD64 확장에 대해서는 다루지 않는다.r : 레지스터 m : 메모리 imm : 상수 (ib: 8-bit, iw: 16-bit, id: 32-bit) 1.2.1. 인텔 문법과 AT&T 문법 문법 Intel AT&T 파라미터 순서 instr dest, src
mov eax, 42
destination을 좌측, source를 우측에 표기한다. instr src, dest
movl $42, %eax
source를 좌측, destination을 우측에 표기한다. 파라미터 표기 add eax, 1
어셈블러가 자동으로 타입을 파악한다. addl $1, %eax
immediate는 $
, register는 %
기호를 앞에 붙여 표기한다. 피연산자 크기 mov eax, 1234
레지스터명으로부터 자동으로 결정된다. movl $1234, %eax
크기를 나타내는 접미사를 사용하여 명시한다. 메모리 주소 표기 lea esi, [ebx+eax*8+4]
lea 4(%ebx,%eax,8), %esi
x86 어셈블리는 크게 인텔 문법과 AT&T 문법으로 나뉜다. 인텔 문법은 Windows 환경에서 널리 쓰이며(예: Visual C++), AT&T 문법은 Unix 환경에서 널리 쓰인다(예: GCC). 여기서는 인텔 문법을 기준으로 설명한다. * 16진수 숫자는 뒤에 h
를 붙여서 표기한다. * 2진수 숫자는 뒤에 b
를 붙여서 표기한다. x86 ISA는 다음과 같은 가변길이 인코딩을 사용한다. (Prefixes) [Opcode] (Mod R/M) (SIB) (Displacement) (Immediate)
(Prefixes): 4가지 그룹으로 구분되며 각 그룹에 속하는 접두사(각 1 바이트)가 선택적으로 붙을 수 있다. [Opcode] : 1-3 바이트 길이로 수행하고자 하는 명령어의 종류를 지정한다. 이때 일부 SSE 명령어의 경우 prefix를 사용하는 것과 동일하게 인코딩되어 있으나(예: CVTDQ2PD
: F3 0F E6h
) 이는 opcode의 일부로, prefix로 취급되지 않는다.(Mod R/M): 피연산자의 형태(레지스터/메모리) 및 메모리 주소 형식을 지정한다. 명령어에 따라 선택적으로 요구한다. (SIB): [base + index * scale (+ disp.)]
형식으로 계산되는 메모리의 base 레지스터, index 레지스터 및 scale을 지정한다. 명령어에 따라 선택적으로 요구한다. (Displacement): 1/2/4 바이트 크기의 displacement로 명령어에 따라 선택적으로 요구한다. (Immediate): 1/2/4 바이트 크기의 immediate(명령어에 인코딩되는 숫자) 값으로 명령어에 따라 선택적으로 요구한다. x86 접두사는 다음과 같이 4가지 그룹으로 나뉜다.Group 1: Lock and repeat prefixes 메모리 접근의 독점 또는 명령어의 반복 수행을 지정하는 명령어이다. F0h
(0xF0): LOCK 접두사. 명령어가 수행되는 동안 해당 명령어가 접근하는 주소에 대한 lock을 수행한다.F2h
(0xF2), F3h
(0xF3): 반복 접두사. 문자열을 다루는 명령어 앞에 붙어 해당 명령어가 특정 조건에 따라 반복적으로 수행되도록 하는 접두사이다. 이에 해당하지 않는 명령어에 사용하는 것은 정의되지 않은 동작이나, repz ret
과 같이 사용되는 경우가 존재한다.Group 2: Segment override prefixes 메모리 세그멘트를 지정하는 접두사이다. 2Eh
(0x2E): CS segment override36h
(0x36): SS segment override3Eh
(0x3E): DS segment override26h
(0x26): ES segment override64h
(0x64): FS segment override65h
(0x65): GS segment overrideGroup 3: Operand-size override prefix 66h
(0x66): 명령어의 피연산자의 크기가 기본값과 다름을 나타내는 접두사이다.Group 4: Address-size override prefix 67h
(0x67): 명령어가 사용하는 주소의 크기가 기본값과 다름을 나타내는 접두사이다. 이때 접두사는 각 Group에서 최대 1개씩 붙을 수 있으며 임의의 순서로 배치될 수 있으나, 어셈블러에서는 Group 2 - Group 4 - Group 3 - Group 1 순서로 배치하는 것으로 보인다.0: 55 push ebp
1: 89 e5 mov ebp,esp
3: 57 push edi
4: 8b 5d 08 mov ebx,DWORD PTR [ebp+0x8]
7: 8b 7d 0a mov edi,DWORD PTR [ebp+0xa]
a: 26 67 66 8b 41 02 mov ax,WORD PTR es:[bx+di+0x2]
10: 8b 5d 0c mov ebx,DWORD PTR [ebp+0xc]
13: 8b 7d 0e mov edi,DWORD PTR [ebp+0xe]
16: 26 67 66 f0 0f b1 01 lock cmpxchg WORD PTR es:[bx+di],ax
1d: 8b 5d 08 mov ebx,DWORD PTR [ebp+0x8]
20: 8b 7d 0a mov edi,DWORD PTR [ebp+0xa]
23: 26 67 66 89 41 02 mov WORD PTR es:[bx+di+0x2],ax
29: 5f pop edi
2a: c9 leave
2b: c3 ret
====# x86 Opcode #==== 1-byte 0 1 2 3 4 5 6 7 8 9 A B C D E F 00 ADD OR * r/m += r r += r/m a += imm r/m |= r r |= r/m a |= imm 10 ADC SBB r/m += r r += r/m a += imm r/m -= r r -= r/m a -= imm 20 AND DAA SUB DAS r/m &= r r &= r/m a &= imm r/m -= r r -= r/m a -= imm 30 XOR AAA CMP AAS r/m ^= r r ^= r/m a ^= imm r/m - r r - r/m a - imm 40 INC DEC EAX ECX EDX EBX ESP EBP ESI EDI EAX ECX EDX EBX ESP EBP ESI EDI 50 PUSH POP EAX ECX EDX EBX ESP EBP ESI EDI EAX ECX EDX EBX ESP EBP ESI EDI 60 PUSHAD POPAD BOUND ARPL segment override size override PUSH IMUL PUSH IMUL INS OUTS FS GS 70 Jcc JO JNO JB JC JNAE JAE JNB JNC JE JZ JNE JNZ JBE JNA JA JNBE JS JNS JP JPE JNP JPO JL JNGE JGE JNL JLE JNG JG JNLE 80 ALU (imm) TEST XCHG MOV MOV LEA MOV POP r/m = r r = r/m 90 NOP XCHG EAX CWD CDQ CALLF WAIT PUSHFD POPFD SAHF LAHF ECX EDX EBX ESP EBP ESI EDI A0 MOV EAX MOVS CMPS TEST STOS LODS SCAS a = (seg:offset) (seg:offset) = a B0 MOV (imm) r8 = imm8 r16(r32) = imm16(imm32) C0 SHIFT imm RETN LES LDS MOV imm ENTER LEAVE RETF INT3 INT imm INTO IRETD D0 SHIFT 1 SHIFT CL AAM AAD SALC XLAT FPU E0 LOOPcc LOOP JECXZ IN imm OUT imm CALL JMP JMPF JMP short IN DX OUT DX LOOPNZ LOOPZ F0 LOCK INT1 ICEBP REPcc HLT CMC CLC STC CLI STI CLD STD REPNE REPE
=====# 1-byte opcode 목록 #===== =====# 2-byte 이상 opcode #===== 명령어 확장 Opcode i286 SLDT i286 0F 00 /0
STR i286 0F 00 /1
LLDT i286 0F 00 /2
LTR i286 0F 00 /3
VERR i286 0F 00 /4
VERW i286 0F 00 /5
SGDT i286 0F 01 /0
SIDT i286 0F 01 /1
LGDT i286 0F 01 /2
LIDT i286 0F 01 /3
SMSW i286 0F 01 /4
LMSW i286 0F 01 /6
LAR i286 0F 02
LSL i286 0F 03
CLTS i286 0F 06
i386 SETcc i386 0F 90+cc
PUSH FS i386 0F A0
POP FS i386 0F A1
PUSH GS i386 0F A8
POP GS i386 0F A9
BT i386 0F A3
0F BA /4
BTS i386 0F AB
0F BA /5
BTR i386 0F B3
0F BA /6
BTC i386 0F BB
0F BA /7
BSF i386 0F BC
BSR i386 0F BD
SHLD i386 0F A4..A5
SHRD i386 0F AC..AD
IMUL i386 0F AF
LSS i386 0F B2
LFS i386 0F B4
LGS i386 0F B5
MOVZX i386 0F B6..B7
MOVSX i386 0F BE..BF
i486 INVLPG i486 0F 01 /7
INVD i486 0F 08
WBINVD i486 0F 09
CMPXCHG i486 0F B0..B1
XADD i486 0F C0..C1
BSWAP i486 0F C8+r
i586 WRMSR i586 0F 30
RDTSC i586 0F 31
RDMSR i586 0F 32
CPUID i586 0F A2
RSM i586 0F AA
CMPXCHG8B i586 0F C7
i686 UD2 i686 0F 0B
NOP i686 0F 1F /0
RDPMC i686 0F 33
SYSENTER i686 0F 34
SYSEXIT i686 0F 35
CMOVcc i686 0F 40+cc
필드 mod reg/opcode r/m 비트 수 2-bit 3-bit 3-bit
Mod R/M 바이트는 3개의 필드로 구성되어 있다.mod operand의 모드를 지정한다. r/m 필드와 결합되어 사용된다. 32-bit addressing에서 r/m 필드의 값이 100
(esp)인 경우 SIB를 사용한다. 00
: (m) (레지스터/SIB) 또는 disp16/disp32 값에 해당하는 주소를 지정한다.01
: (m) (레지스터/SIB) 값에 disp8을 더한 주소를 지정한다.10
: (m) (레지스터/SIB) 값에 disp16/disp32를 더한 주소를 지정한다.11
: (r) 레지스터의 값을 operand로 사용한다.reg/opcode 레지스터 번호 또는 일부 명령어의 경우 opcode 정보를 담고 있다. r/m
필드 scale index base 비트 수 2-bit 3-bit 3-bit
32-bit addressing에서 선택적으로 사용되는 바이트이다. [base + index * scale]
에 해당하는 주소를 지정하는 데 사용된다.scale 00
: 1 (byte)01
: 2 (bytes)10
: 4 (bytes)11
: 8 (bytes)Index 해당하는 레지스터의 값을 사용한다. 단, 100
(esp)인 경우 0으로 계산한다. (esp를 index에 사용할 수 없다.) Base 해당하는 레지스터의 값을 사용한다. 단, 101
(ebp)인 경우 mod에 따라 다음의 값을 사용한다. 00
: [scaled index] + disp32
01
: [scaled index] + disp8 + [EBP]
10
: [scaled index] + disp32 + [EBP]
범용 레지스터: A: Accumulator, C: Count, D: Data, B: Base SP: Stack Pointer, BP: Base Pointer SI: Source Index, DI: Destination Index 특수 레지스터: 세그멘트 레지스터(CS/DS/SS/ES/FS/GS) 플래그 레지스터(EFLAGS) 명령어 포인터(EIP) 접두사/접미사: -L/H: 8비트 (L: 하위 8비트, H: 상위 8비트) -X: 16비트/32비트 E-: 32비트 번호 / 종류 0 1 2 3 4 5 6 7 8비트 정수 AL CL DL BL AH, SPL CH, BPL DH, SIL BH, DIL 16비트 정수 AX CX DX BX SP BP SI DI 32비트 정수 EAX ECX EDX EBX ESP EBP ESI EDI 80비트 x87 ST0 ST1 ST2 ST3 ST4 ST5 ST6 ST7 64비트 MMX MM0 MM1 MM2 MM3 MM4 MM5 MM6 MM7 128비트 SSE XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7
번호 레지스터 설명 비고 0 ES Extra Segment 1 CS Code Segment 2 SS Stack Segment 3 DS Data Segment 4 FS 80386에서 추가 5 GS 80386에서 추가
상태 플래그 CF(0): Carry Flag PF(2): Parity Flag AF(4): Auxiliary Carry Flag ZF(6): Zero Flag SF(7): Sign Flag 제어 플래그 시스템 플래그 TF(8): Trap Flag IF(9): Interrupt Enable Flag OF(11): Overflow Flag IOPL(12-13): I/O Privilege Level NT(14): Nested Task RF(16): Resume Flag VM(17): Virtual-8086 Mode AC(18): Alignment Check VIF(19): Virtual Interrupt Flag VIP(20): Virtual Interrupt Pending ID(21): ID Flag 조건 코드는 상태 플래그의 값에 따라 동작을 수행하는 데 사용되는 코드로, 총 16가지가 존재한다. 번호 cc 플래그 조건 설명 0000 O OF = 1 Overflow 0001 NO OF = 0 No Overflow 0010 B NAE CF = 1 Below Neither Above nor Equal DESTu < SRCu 0011 NB AE CF = 0 Not Below Above or Equal DESTu >= SRCu 0100 E Z ZF = 1 Equal Zero DEST == SRC 0101 NE NZ ZF = 0 Not Equal Not Zero DEST != SRC 0110 BE NA (CF = 1) | (ZF = 1) Below or Equal Not Above DESTu <= SRCu 0111 NBE A (CF = 0) & (ZF = 0) Neither Below nor Equal Above DESTu > SRCu 1000 S SF = 1 Sign 1001 NS SF = 0 Not Sign 1010 P PE PF = 1 Parity Parity Even 1011 NP PO PF = 0 No Parity Parity Odd 1100 L NGE SF ^ OF = 1 Less Neither Greater nor Eqaul DESTs < SRCs 1101 NL GE SF ^ OF = 0 Not Less Greater or Equal DESTs >= SRCs 1110 LE NG (SF ^ OF | ZF) = 1 Less or Equal Not Greater DESTs <= SRCs 1111 NLE G (SF ^ OF | ZF) = 0 Neither Less nor Equal Greater DESTs > SRCs
제어 레지스터 (CR0-CR4) 디버그 레지스터 (DR0-DR7) GDTR, LDTR, IDTR x87은 8개의 80-bit 레지스터(R0-R7
)를 스택처럼 사용한다. 레지스터는 각 레지스터의 번호가 아닌 스택 상의 상대적인 위치(ST(i)
)로 접근하고, 다수의 명령어에 ST(0)
이 피연산자로 고정되어 있으므로 병렬적인 실행이 어렵다.1.5.2. Control Word 16-bit x87 FPU control word는 x87 FPU의 작동을 제어한다. FINIT
/FNINIT
또는 FSAVE
/FNSAVE
명령어가 실행되는 경우 이 값은 037Fh
로 초기화된다. (RC = 00b
, PC = 11b
, all floating-point exceptions are masked.)(5-0) 마스크 비트: 비트가 설정되어 있는 경우 해당하는 예외의 발생을 막는다. IM(0): Invalid Operation DM(1): Denormal Operand ZM(2): Zero Divide OM(3): Overflow UM(4): Underflow PM(5): Precision (12-8) PC(9-8): Precision Control; 00b
— Single Precision, 10b
— Double Precision, 11b
— Double Extended Precision. RC(11-10): Rounding Control; 00b
— Round to nearest (even), 01b
— Round down(toward -inf), 10b
— Round up(toward +inf), 11b
— Round toward zero (Truncate). X(12): Infinity Control 16-bit tag word는 x87 FPU의 8개 레지스터 각각의 내용을 나타낸다. (레지스터당 2-bit 태그)00
— Valid01
— Zero10
— Special: Invalid (NaN, unsupported), infinity, or denormal11
— Empty 인코딩 포맷 First Byte Second Byte 15-21 10 9 8 7-6 5 4 3 2-0 1 11011
opA 1 mod 1 opB r/m 2 11011
MF opA mod opB r/m 3 11011
d P opA 11
opB R ST(i) 4 11011
0 0 1 11
1 op 5 11011
0 1 1 11
1 op
MF: Memory Format; 00 — 32-bit real, 01 — 32-bit integer, 10 — 64-bit real, 11 — 16-bit integer d: Destination; 0 — ST(0), 1 — ST(i) P: Pop; 0 — Do not pop, 1 — Pop R: Reverse; 0 — ST(0) op ST(i), 1 — ST(i) op ST(0) R^d: 0 — Destination OP Source, 1 — Source OP Destination 0 1 R / d ST(0) = ST(0) op ST(i) ST(0) = ST(i) op ST(0) 0 ST(i) = ST(0) op ST(i) ST(i) = ST(i) op ST(0) 1
x87의 명령어 인코딩은 다음과 같이 나눌 수 있다.mod ≠ 11: 메모리 접근을 수반하는 명령어 - Format 1: 11011xx1 mm1xxrrr
FPU 상태 저장 및 불러오기, 80비트 자료형 및 64비트 정수 등 특수 자료형의 load/store 명령어를 인코딩하는 형식이다. ■ ■ DB /4
, DB /6
, DD /5
는 사용되지 않는다. - Format 2: 11011xxx mmxxxrrr
(Format 1로 해석 가능한 경우 제외) 32비트/64비트 부동소수점 및 16비트/32비트 정수 형식의 load/store 및 메모리 피연산자를 사용하는 fadd, fsub, fmul, fdiv, fcom 등의 연산/비교 명령어를 인코딩하는 형식이다. ■ ■ D9 /1
은 사용되지 않는다. opc / r /0 /1 /2 /3 /4 /5 /6 /7 D8 FADD m32fp FMUL m32fp FCOM m32fp FCOMP m32fp FSUB m32fp FSUBR m32fp FDIV m32fp FDIVR m32fp DC FADD m64fp FMUL m64fp FCOM m64fp FCOMP m64fp FSUB m64fp FSUBR m64fp FDIV m64fp FDIVR m64fp DA FIADD m32int FIMUL m32int FICOM m32int FICOMP m32int FISUB m32int FISUBR m32int FIDIV m32int FIDIVR m32int DE FIADD m16int FIMUL m16int FICOM m16int FICOMP m16int FISUB m16int FISUBR m16int FIDIV m16int FIDIVR m16int D9 FLD fp32 FST fp32 FSTP fp32 FLDENV FLDCW FSTENV FNSTENV FSTCW FNSTCW DD FLD fp64 FISTTP int64 FST fp64 FSTP fp64 FRSTOR FSAVE FNSAVE FSTSW FNSTSW DB FILD int32 FISTTP int32 FIST int32 FISTP int32 FLD fp80 FSTP fp80 DF FILD int16 FISTTP int16 FIST int16 FISTP int16 FBLD bcd80 FILD int64 FBSTP bcd80 FISTP int64
mod = 11: 메모리를 사용하지 않는 명령어 - Format 3: 11011xxx 11xxxrrr
x87 스택 레지스터를 사용하는 fadd, fsub, fmul, fdiv, fcom 등의 연산/비교 명령어와 fld, fst, fxch 등의 레지스터 간 데이터 이동 명령어를 인코딩하는 형식이다. - Format 4: - Format 5: opA:opB 0:00 0:01 0:10 0:11 1:00 1:01 1:10 1:11 d:P R 0:0 0 FADD FCOM FSUB FDIV FLD FNOP Format 4 1:0 0 FSUBR FDIVR FFREE FST FUCOM 1:1 0 FADDP FCOMP FSUBRP FDIVRP FFREEP FSTP FUCOMP 0:0 1 FMUL FCOMP FSUBR FDIVR FXCH FSTPNCE Format 4 1:0 1 FSUB FDIV FSTP 1:1 1 FMULP FCOMPP FSUBP FDIVP 0:1 0 FCMOVB FCMOVBE FCMOVNB FCMOVMBE Format 5 0:1 1 FCMOVE FCMOVU FCMOVNE FCMOVNU
=====# Format 1 #===== opA opB 명령어 추가 시점 Mnemonic HEX 비고 00
00
FLDENV
8087 FLDENV m14byte
D9 /4
32-bit 모드에서는 66h
접두사 필요 80387 FLDENV m28byte
00
01
FLDCW
8087 FLDCW m2byte
D9 /5
00
10
FNSTENV
8087 FNSTENV m14byte
D9 /6
32-bit 모드에서는 66h
접두사 필요 80387 FNSTENV m28byte
00
11
FNSTCW
8087 FNSTCW m2byte
D9 /7
01
01
FLD
8087 FLD m80fp
DB /5
01
11
FSTP
8087 FSTP m80fp
DB /7
10
00
FRSTOR
8087 FRSTOR m94byte
DD /4
32-bit 모드에서는 66h
접두사 필요 80387 FRSTOR m108byte
10
10
FNSAVE
8087 FNSAVE m94byte
DD /6
32-bit 모드에서는 66h
접두사 필요 80387 FNSAVE m108byte
10
11
FNSTSW
8087 FNSTSW m2byte
DD /7
11
00
FBLD
8087 FBLD m80bcd
DF /4
11
01
FILD
8087 FILD m64int
DF /5
11
10
FBSTP
8087 FBSTP m80bcd
DF /6
11
11
FISTP
8087 FISTP m64int
DF /7
=====# Format 2 #===== opA opB 명령어 추가 시점 MF Mnemonic HEX 비고 0
000
FADD
8087 00
FADD m32fp
D8 /0
10
FADD m64fp
DC /0
0
000
FIADD
8087 01
FIADD m32int
DA /0
11
FIADD m16int
DE /0
0
001
FMUL
8087 00
FMUL m32fp
D8 /1
10
FMUL m64fp
DC /1
0
001
FIMUL
8087 01
FIMUL m32int
DA /1
11
FIMUL m16int
DE /1
0
010
FCOM
8087 00
FCOM m32fp
D8 /2
10
FCOM m64fp
DC /2
0
010
FICOM
8087 01
FICOM m32int
DA /2
11
FICOM m16int
DE /2
0
011
FCOMP
8087 00
FCOMP m32fp
D8 /3
10
FCOMP m64fp
DC /3
0
011
FICOMP
8087 01
FICOMP m32int
DA /3
11
FICOMP m16int
DE /3
0
100
FSUB
8087 00
FSUB m32fp
D8 /4
10
FSUB m64fp
DC /4
0
100
FISUB
8087 01
FISUB m32int
DA /4
11
FISUB m16int
DE /4
0
101
FSUBR
8087 00
FSUBR m32fp
D8 /5
10
FSUBR m64fp
DC /5
0
101
FISUBR
8087 01
FISUBR m32int
DA /5
11
FISUBR m16int
DE /5
0
110
FDIV
8087 00
FDIV m32fp
D8 /6
10
FDIV m64fp
DC /6
0
110
FIDIV
8087 01
FIDIV m32int
DA /6
11
FIDIV m16int
DE /6
0
111
FDIVR
8087 00
FDIVR m32fp
D8 /7
10
FDIVR m64fp
DC /7
0
111
FIDIVR
8087 01
FIDIVR m32int
DA /7
11
FIDIVR m16int
DE /7
1
000
FLD
8087 00
FLD m32fp
D9 /0
10
FLD m64fp
DD /0
1
000
FILD
8087 01
FILD m32int
DB /0
11
FILD m16int
DF /0
1
001
FISTTP
SSE3 10
FISTTP m64int
DD /1
01
FISTTP m32int
DB /1
11
FISTTP m16int
DF /1
1
010
FST
8087 00
FST m32fp
D9 /2
10
FST m64fp
DD /2
1
010
FIST
8087 01
FIST m32int
DB /2
11
FIST m16int
DF /2
1
011
FSTP
8087 00
FSTP m32fp
D9 /3
10
FSTP m64fp
DD /3
1
011
FISTP
8087 01
FISTP m32int
DB /3
11
FISTP m16int
DF /3
=====# Format 3 #===== opA opB R P 명령어 추가 시점 d Mnemonic HEX 비고 0
00
0 0 FADD
8087 0 FADD st(0),st(i)
D8 C0+i
1 FADD st(i),st(0)
DC C0+i
0
00
0 1 FADDP
8087 1 FADDP st(i),st(0)
DE C0+i
FADDP
DE C1
0
00
1 0 FMUL
8087 0 FMUL st(0),st(i)
D8 C8+i
1 FMUL st(i),st(0)
DC C8+i
0
00
1 1 FMULP
8087 1 FMULP st(i),st(0)
DE C8+i
FMULP
DE C9
0
01
0 0 FCOM
8087 * FCOM st(i)
D8 D0+i
DC D0+i
FCOM
D8 D1
DC D1
0
01
0 1 FCOMP
8087 1 FCOMP st(i)
DE D0+i
FCOMP
DE D1
0
01
1 0 FCOMP
8087 * FCOMP st(i)
D8 D8+i
DC D8+i
FCOMP
D8 D9
DC D9
0
01
1 1 FCOMPP
8087 1 FCOMPP
DE D9
0
10
0 0 FSUB
8087 0 FSUB st(0),st(i)
D8 E0+i
1 1 FSUB st(i),st(0)
DC E8+i
0
10
1 1 FSUBP
8087 1 FSUBP st(i),st(0)
DE E8+i
FSUBP
DE E9
0
10
1 0 FSUBR
8087 0 FSUBR st(0),st(i)
D8 E8+i
0 1 FSUBR st(i),st(0)
DC E0+i
0
10
0 1 FSUBRP
8087 1 FSUBRP st(i),st(0)
DE E0+i
FSUBRP
DE E1
0
11
0 0 FDIV
8087 0 FDIV st(0),st(i)
D8 F0+i
1 1 FDIV st(i),st(0)
DC F8+i
0
11
1 1 FDIVP
8087 1 FDIVP st(i),st(0)
DE F8+i
FDIVP
DE F9
0
11
1 0 FDIVR
8087 0 FDIVR st(0),st(i)
D8 F8+i
0 1 FDIVR st(i),st(0)
DC F0+i
0
11
0 1 FDIVRP
8087 1 FDIVRP st(i),st(0)
DE F0+i
FDIVRP
DE F1
1
00
0 0 FLD
8087 0 FLD st(i)
D9 C0+i
1
00
0 0 FFREE
8087 1 FFREE st(i)
DD C0+i
1
00
0 1 FFREEP
8087 1 FFREEP st(i)
DF C0+i
1
00
1 0 FXCH
8087 0 FXCH st(i)
D9 C8+i
1 DD C8+i
1 1 DF C8+i
1
01
0 0 FNOP
8087 0 FNOP
D9 D0
1
01
0 0 FST
8087 1 FST st(i)
DD D0+i
1
01
0 1 FSTP
8087 1 FSTP st(i)
DF D0+i
1
01
1 0 FSTPNCE
8087 0 FSTPNCE st(i)
D9 D8+i
1
01
1 0 FSTP
8087 1 FSTP st(i)
DD D8+i
1
10
0 0 FUCOM
80387 1 FUCOM st(i)
DD E0+i
FUCOM
DD E1
1
10
0 1 FNSTSW
80287 1 FNSTSW AX
DF E0
1
10
1 0 FUCOMP
80387 1 FUCOMP st(i)
DD E8+i
FUCOMP
DD E9
1
10
1 1 FUCOMPP
80387 0 FUCOMPP
DA E9
opA opB R P 명령어 추가 시점 d Mnemonic HEX 비고 0
00
0 1 FCMOVcc
Pentium Pro 0 FCMOVB st(0),st(i)
DA C0+i
0
00
1 FCMOVE st(0),st(i)
DA C8+i
0
01
0 FCMOVBE st(0),st(i)
DA D0+i
0
01
1 FCMOVU st(0),st(i)
DA D8+i
1
00
0 FCMOVNB st(0),st(i)
DB C0+i
1
00
1 FCMOVNE st(0),st(i)
DB C8+i
1
01
0 FCMOVNBE st(0),st(i)
DB D0+i
1
01
1 FCMOVNU st(0),st(i)
DB D8+i
1
10
1 1 FUCOMI
Pentium Pro 0 FUCOMI st(0),st(i)
DB E8+i
1
10
1 1 FUCOMIP
Pentium Pro 1 FUCOMIP st(0),st(i)
DF E8+i
1
11
0 1 FCOMI
Pentium Pro 0 FCOMI st(0),st(i)
DB F0+i
1
11
0 1 FCOMIP
Pentium Pro 1 FCOMIP st(0),st(i)
DF F0+i
=====# Format 4 #===== op[4:3] op[2:0] 명령어 추가 시점 Mnemonic HEX 비고 00
000
FCHS
8087 FCHS
D9 E0
00
001
FABS
8087 FABS
D9 E1
00
100
FTST
8087 FTST
D9 E4
00
101
FXAM
8087 FXAM
D9 E5
01
000
FLD1
8087 FLD1
D9 E8
01
001
FLD2T
8087 FLD2T
D9 E9
01
010
FLD2E
8087 FLD2E
D9 EA
01
011
FLDPI
8087 FLDPI
D9 EB
01
100
FLDLG2
8087 FLDLG2
D9 EC
01
101
FLDLN2
8087 FLDLN2
D9 ED
01
110
FLDZ
8087 FLDZ
D9 EE
10
000
F2XM1
8087 F2XM1
D9 F0
10
001
FYL2X
8087 FYL2X
D9 F1
10
010
FPTAN
8087 FPTAN
D9 F2
10
011
FPATAN
8087 FPATAN
D9 F3
10
100
FXTRACT
8087 FXTRACT
D9 F4
10
101
FPREM1
80387 FPREM1
D9 F5
Round to nearest (IEEE-754 compliant) 10
110
FDECSTP
8087 FDECSTP
D9 F6
10
111
FINCSTP
8087 FINCSTP
D9 F7
11
000
FPREM
8087 FPREM
D9 F8
Truncate 11
001
FYL2XP1
8087 FYL2XP1
D9 F9
11
010
FSQRT
8087 FSQRT
D9 FA
11
011
FSINCOS
80387 FSINCOS
D9 FB
11
100
FRNDINT
8087 FRNDINT
D9 FC
11
101
FSCALE
8087 FSCALE
D9 FD
11
110
FSIN
80387 FSIN
D9 FE
11
111
FCOS
80387 FCOS
D9 FF
=====# Format 5 #===== op[4:3] op[2:0] 명령어 추가 시점 Mnemonic HEX 비고 00
000
FENI8087_NOP
8087 FENI8087_NOP
DB E0
32-bit x87 FPU에서는 NOP으로 다뤄짐 00
001
FDISI8087_NOP
8087 FDISI8087_NOP
DB E1
32-bit x87 FPU에서는 NOP으로 다뤄짐 00
010
FNCLEX
8087 FNCLEX
DB E2
00
011
FNINIT
8087 FNINIT
DB E3
00
100
FSETPM287_NOP
8087 FSETPM287_NOP
DB E4
32-bit x87 FPU에서는 NOP으로 다뤄짐
x87 FPU 레지스터(R0-R7)의 하위 64비트를 MMX 레지스터(MM0-MM7)로 사용한다. 각 MMX 명령어가 실행되면 x87 FPU tag word 전체가 valid(00b
)로 설정된다. EMMS(E mpty MM X S tate) 명령어는 x87 FPU tag word 전체를 empty(11b
)로 설정한다.Granularity Field (gg): 피연산자의 크기를 나타낸다. gg Granularity of Data 00 Packed Bytes 01 Packed Words 10 Packed Doublewords 11 Quadword
레지스터 인코딩: MMX 레지스터가 사용된 경우: MMX 레지스터는 ModR/M 바이트의 r 또는 r/m 필드에 인코딩된다. 범용 레지스터가 사용된 경우: MMX 명령어에서 범용 레지스터를 사용하는 경우 이는 ModR/M 바이트의 r/m 필드에 인코딩된다. 2. 명령어 목록2.1.1. x86 사칙연산 명령어 Opcode 추가 시점 Mnemonic 형식 비고 00 /r
8086/8088 ADD r/m8,r8
r/m += r 01 /r
8086/8088 ADD r/m16,r16
r/m += r 32-bit 모드에서는 66h
접두사 필요 80386 ADD r/m32,r32
02 /r
8086/8088 ADD r8,r/m8
r += r/m 03 /r
8086/8088 ADD r16,r/m16
r += r/m 32-bit 모드에서는 66h
접두사 필요 80386 ADD r32,r/m32
04 ib
8086/8088 ADD al,imm8
a += imm 05 iw
8086/8088 ADD ax,imm16
a += imm 32-bit 모드에서는 66h
접두사 필요 05 id
80386 ADD eax,imm32
80 /0 ib
8086/8088 ADD r/m8,imm8
r/m += imm 81 /0 iw
8086/8088 ADD r/m16,imm16
r/m += imm 32-bit 모드에서는 66h
접두사 필요 81 /0 id
80386 ADD r/m32,imm32
83 /0 ib
8086/8088 ADD r/m16,imm8
r/m += imm 32-bit 모드에서는 66h
접두사 필요 80386 ADD r/m32,imm8
Opcode 추가 시점 Mnemonic 형식 비고 40+rw
8086/8088 INC r16
r += 1 32-bit 모드에서는 66h
접두사 필요 40+rd
80386 INC r32
FE /0
8086/8088 INC r/m8
r/m += 1 FF /0
8086/8088 INC r/m16
r/m += 1 32-bit 모드에서는 66h
접두사 필요 80386 INC r/m32
Opcode 추가 시점 Mnemonic 형식 비고 10 /r
8086/8088 ADC r/m8,r8
r/m += r + CF 11 /r
8086/8088 ADC r/m16,r16
r/m += r + CF 32-bit 모드에서는 66h
접두사 필요 80386 ADC r/m32,r32
12 /r
8086/8088 ADC r8,r/m8
r += r/m + CF 13 /r
8086/8088 ADC r16,r/m16
r += r/m + CF 32-bit 모드에서는 66h
접두사 필요 80386 ADC r32,r/m32
14 ib
8086/8088 ADC al,imm8
a += imm + CF 15 iw
8086/8088 ADC ax,imm16
a += imm + CF 32-bit 모드에서는 66h
접두사 필요 15 id
80386 ADC eax,imm32
80 /2 ib
8086/8088 ADC r/m8,imm8
r/m += imm + CF 81 /2 iw
8086/8088 ADC r/m16,imm16
r/m += imm + CF 32-bit 모드에서는 66h
접두사 필요 81 /2 id
80386 ADC r/m32,imm32
83 /2 ib
8086/8088 ADC r/m16,imm8
r/m += imm + CF 32-bit 모드에서는 66h
접두사 필요 80386 ADC r/m32,imm8
Opcode 추가 시점 Mnemonic 형식 비고 28 /r
8086/8088 SUB r/m8,r8
r/m -= r 29 /r
8086/8088 SUB r/m16,r16
r/m -= r 32-bit 모드에서는 66h
접두사 필요 80386 SUB r/m32,r32
2A /r
8086/8088 SUB r8,r/m8
r -= r/m 2B /r
8086/8088 SUB r16,r/m16
r -= r/m 32-bit 모드에서는 66h
접두사 필요 80386 SUB r32,r/m32
2C ib
8086/8088 SUB al,imm8
a -= imm 2D iw
8086/8088 SUB ax,imm16
a -= imm 32-bit 모드에서는 66h
접두사 필요 2D id
80386 SUB eax,imm32
80 /5 ib
8086/8088 SUB r/m8,imm8
r/m -= imm 81 /5 iw
8086/8088 SUB r/m16,imm16
r/m -= imm 32-bit 모드에서는 66h
접두사 필요 81 /5 id
80386 SUB r/m32,imm32
83 /5 ib
8086/8088 SUB r/m16,imm8
r/m -= imm 32-bit 모드에서는 66h
접두사 필요 80386 SUB r/m32,imm8
Opcode 추가 시점 Mnemonic 형식 비고 48+rw
8086/8088 DEC r16
r -= 1 32-bit 모드에서는 66h
접두사 필요 48+rd
80386 DEC r32
FE /1
8086/8088 DEC r/m8
r/m -= 1 FF /1
8086/8088 DEC r/m16
r/m -= 1 32-bit 모드에서는 66h
접두사 필요 80386 DEC r/m32
Opcode 추가 시점 Mnemonic 형식 비고 18 /r
8086/8088 SBB r/m8,r8
r/m -= r + CF 19 /r
8086/8088 SBB r/m16,r16
r/m -= r + CF 32-bit 모드에서는 66h
접두사 필요 80386 SBB r/m32,r32
1A /r
8086/8088 SBB r8,r/m8
r -= r/m + CF 1B /r
8086/8088 SBB r16,r/m16
r -= r/m + CF 32-bit 모드에서는 66h
접두사 필요 80386 SBB r32,r/m32
1C ib
8086/8088 SBB al,imm8
a -= imm + CF 1D iw
8086/8088 SBB ax,imm16
a -= imm + CF 32-bit 모드에서는 66h
접두사 필요 1D id
80386 SBB eax,imm32
80 /3 ib
8086/8088 SBB r/m8,imm8
r/m -= imm + CF 81 /3 iw
8086/8088 SBB r/m16,imm16
r/m -= imm + CF 32-bit 모드에서는 66h
접두사 필요 81 /3 id
80386 SBB r/m32,imm32
83 /3 ib
8086/8088 SBB r/m16,imm8
r/m -= imm + CF 32-bit 모드에서는 66h
접두사 필요 80386 SBB r/m32,imm8
Opcode 추가 시점 Mnemonic 형식 비고 F6 /3
8086/8088 NEG r/m8
r/m = -(r/m) F7 /3
8086/8088 NEG r/m16
r/m = -(r/m) 32-bit 모드에서는 66h
접두사 필요 80386 NEG r/m32
Opcode 추가 시점 Mnemonic 형식 비고 38 /r
8086/8088 CMP r/m8,r8
temp = r/m - r 39 /r
8086/8088 CMP r/m16,r16
temp = r/m - r 32-bit 모드에서는 66h
접두사 필요 80386 CMP r/m32,r32
3A /r
8086/8088 CMP r8,r/m8
temp = r - r/m 3B /r
8086/8088 CMP r16,r/m16
temp = r - r/m 32-bit 모드에서는 66h
접두사 필요 80386 CMP r32,r/m32
3C ib
8086/8088 CMP al,imm8
temp = a - imm 3D iw
8086/8088 CMP ax,imm16
temp = a - imm 32-bit 모드에서는 66h
접두사 필요 3D id
80386 CMP eax,imm32
80 /7 ib
8086/8088 CMP r/m8,imm8
temp = r/m - imm 81 /7 iw
8086/8088 CMP r/m16,imm16
temp = r/m - imm 32-bit 모드에서는 66h
접두사 필요 81 /7 id
80386 CMP r/m32,imm32
83 /7 ib
8086/8088 CMP r/m16,imm8
temp = r/m - imm 32-bit 모드에서는 66h
접두사 필요 80386 CMP r/m32,imm8
SUB
연산을 수행 후 결과값을 레지스터에 저장하지 않고 플래그만 설정하는 명령어이다. Opcode 추가 시점 Mnemonic 형식 비고 F6 /4
8086/8088 MUL r/m8
ax = al * (r/m8);
F7 /4
8086/8088 MUL r/m16
dx:ax = ax * (r/m16);
32-bit 모드에서는 66h
접두사 필요 80386 MUL r/m32
edx:eax = eax * (r/m32);
Opcode 추가 시점 Mnemonic 형식 비고 0F AF /r
80386 IMUL r16,r/m16
r *= r/m 32-bit 모드에서는 66h
접두사 필요 IMUL r32,r/m32
69 /r iw
80186 IMUL r16,r/m16,imm16
r = r/m * imm 32-bit 모드에서는 66h
접두사 필요 69 /r id
80386 IMUL r32,r/m32,imm32
r = r/m * imm 6B /r ib
80186 IMUL r16,r/m16,imm8
r = r/m * imm 32-bit 모드에서는 66h
접두사 필요 80386 IMUL r32,r/m32,imm8
r = r/m * imm F6 /5
8086/8088 IMUL r/m8
ax = al * (r/m8);
F7 /5
8086/8088 IMUL r/m16
dx:ax = ax * (r/m16);
32-bit 모드에서는 66h
접두사 필요 80386 IMUL r/m32
edx:eax = eax * (r/m32);
Opcode 추가 시점 Mnemonic 형식 비고 F6 /6
8086/8088 DIV r/m8
al = ax / (r/m8);
ah = ax % (r/m8);
F7 /6
8086/8088 DIV r/m16
ax = dx:ax / (r/m16);
dx = dx:ax % (r/m16);
32-bit 모드에서는 66h
접두사 필요 80386 DIV r/m32
eax = edx:eax / (r/m32);
edx = edx:eax % (r/m32);
Opcode 추가 시점 Mnemonic 형식 비고 F6 /7
8086/8088 IDIV r/m8
al = ax / (r/m8);
ah = ax % (r/m8);
F7 /7
8086/8088 IDIV r/m16
ax = dx:ax / (r/m16);
dx = dx:ax % (r/m16);
32-bit 모드에서는 66h
접두사 필요 80386 IDIV r/m32
eax = edx:eax / (r/m32);
edx = edx:eax % (r/m32);
2.1.2. x86 논리연산 명령어 Opcode 추가 시점 Mnemonic 형식 비고 20 /r
8086/8088 AND r/m8,r8
r/m &= r 21 /r
8086/8088 AND r/m16,r16
r/m &= r 32-bit 모드에서는 66h
접두사 필요 80386 AND r/m32,r32
22 /r
8086/8088 AND r8,r/m8
r &= r/m 23 /r
8086/8088 AND r16,r/m16
r &= r/m 32-bit 모드에서는 66h
접두사 필요 80386 AND r32,r/m32
24 ib
8086/8088 AND al,imm8
a &= imm 25 iw
8086/8088 AND ax,imm16
a &= imm 32-bit 모드에서는 66h
접두사 필요 25 id
80386 AND eax,imm32
80 /4 ib
8086/8088 AND r/m8,imm8
r/m &= imm 81 /4 iw
8086/8088 AND r/m16,imm16
r/m &= imm 32-bit 모드에서는 66h
접두사 필요 81 /4 id
80386 AND r/m32,imm32
83 /4 ib
8086/8088 AND r/m16,imm8
r/m &= imm 32-bit 모드에서는 66h
접두사 필요 80386 AND r/m32,imm8
Opcode 추가 시점 Mnemonic 형식 비고 08 /r
8086/8088 OR r/m8,r8
r/m |= r 09 /r
8086/8088 OR r/m16,r16
r/m |= r 32-bit 모드에서는 66h
접두사 필요 80386 OR r/m32,r32
0A /r
8086/8088 OR r8,r/m8
r |= r/m 0B /r
8086/8088 OR r16,r/m16
r |= r/m 32-bit 모드에서는 66h
접두사 필요 80386 OR r32,r/m32
0C ib
8086/8088 OR al,imm8
a |= imm 0D iw
8086/8088 OR ax,imm16
a |= imm 32-bit 모드에서는 66h
접두사 필요 0D id
80386 OR eax,imm32
80 /1 ib
8086/8088 OR r/m8,imm8
r/m |= imm 81 /1 iw
8086/8088 OR r/m16,imm16
r/m |= imm 32-bit 모드에서는 66h
접두사 필요 81 /1 id
80386 OR r/m32,imm32
83 /1 ib
8086/8088 OR r/m16,imm8
r/m |= imm 32-bit 모드에서는 66h
접두사 필요 80386 OR r/m32,imm8
Opcode 추가 시점 Mnemonic 형식 비고 30 /r
8086/8088 XOR r/m8,r8
r/m ^= r 31 /r
8086/8088 XOR r/m16,r16
r/m ^= r 32-bit 모드에서는 66h
접두사 필요 80386 XOR r/m32,r32
32 /r
8086/8088 XOR r8,r/m8
r ^= r/m 33 /r
8086/8088 XOR r16,r/m16
r ^= r/m 32-bit 모드에서는 66h
접두사 필요 80386 XOR r32,r/m32
34 ib
8086/8088 XOR al,imm8
a ^= imm 35 iw
8086/8088 XOR ax,imm16
a ^= imm 32-bit 모드에서는 66h
접두사 필요 35 id
80386 XOR eax,imm32
80 /6 ib
8086/8088 XOR r/m8,imm8
r/m ^= imm 81 /6 iw
8086/8088 XOR r/m16,imm16
r/m ^= imm 32-bit 모드에서는 66h
접두사 필요 81 /6 id
80386 XOR r/m32,imm32
83 /6 ib
8086/8088 XOR r/m16,imm8
r/m ^= imm 32-bit 모드에서는 66h
접두사 필요 80386 XOR r/m32,imm8
Opcode 추가 시점 Mnemonic 형식 비고 F6 /2
8086/8088 NOT r/m8
r/m = ~(r/m) F7 /2
8086/8088 NOT r/m16
r/m = ~(r/m) 32-bit 모드에서는 66h
접두사 필요 80386 NOT r/m32
Opcode 추가 시점 Mnemonic 형식 비고 84 /r
8086/8088 TEST r/m8,r8
temp = r/m & r 85 /r
8086/8088 TEST r/m16,r16
temp = r/m & r 32-bit 모드에서는 66h
접두사 필요 80386 TEST r/m32,r32
A8 ib
8086/8088 TEST al,imm8
temp = a & imm A9 iw
8086/8088 TEST ax,imm16
temp = a & imm 32-bit 모드에서는 66h
접두사 필요 A9 id
80386 TEST eax,imm32
F6 /0 ib
8086/8088 TEST r/m8,imm8
temp = r/m & imm F7 /0 iw
8086/8088 TEST r/m16,imm16
temp = r/m & imm 32-bit 모드에서는 66h
접두사 필요 F7 /0 id
80386 TEST r/m32,imm32
AND
연산을 수행 후 결과값을 레지스터에 저장하지 않고 플래그만 설정하는 명령어이다.2.1.3. x86 Shift 명령어 Barrel Shifter를 사용하는 명령어의 목록이다. 1만큼 rotate/shift하는 명령어가 별도의 opcode에 인코딩된 것이 특징이다. Opcode 추가 시점 Mnemonic 설명 비고 C0 /0 ib
80186 ROL r/m8,imm8
C1 /0 ib
80186 ROL r/m16,imm8
32-bit 모드에서는 66h
접두사 필요 80386 ROL r/m32,imm8
D0 /0
8086/8088 ROL r/m8,1
D1 /0
8086/8088 ROL r/m16,1
32-bit 모드에서는 66h
접두사 필요 80386 ROL r/m32,1
D2 /0
8086/8088 ROL r/m8,CL
D3 /0
8086/8088 ROL r/m16,CL
32-bit 모드에서는 66h
접두사 필요 80386 ROL r/m32,CL
Opcode 추가 시점 Mnemonic 설명 비고 C0 /1 ib
80186 ROR r/m8,imm8
C1 /1 ib
80186 ROR r/m16,imm8
32-bit 모드에서는 66h
접두사 필요 80386 ROR r/m32,imm8
D0 /1
8086/8088 ROR r/m8,1
D1 /1
8086/8088 ROR r/m16,1
32-bit 모드에서는 66h
접두사 필요 80386 ROR r/m32,1
D2 /1
8086/8088 ROR r/m8,CL
D3 /1
8086/8088 ROR r/m16,CL
32-bit 모드에서는 66h
접두사 필요 80386 ROR r/m32,CL
Opcode 추가 시점 Mnemonic 설명 비고 C0 /2 ib
80186 RCL r/m8,imm8
C1 /2 ib
80186 RCL r/m16,imm8
32-bit 모드에서는 66h
접두사 필요 80386 RCL r/m32,imm8
D0 /2
8086/8088 RCL r/m8,1
D1 /2
8086/8088 RCL r/m16,1
32-bit 모드에서는 66h
접두사 필요 80386 RCL r/m32,1
D2 /2
8086/8088 RCL r/m8,CL
D3 /2
8086/8088 RCL r/m16,CL
32-bit 모드에서는 66h
접두사 필요 80386 RCL r/m32,CL
Opcode 추가 시점 Mnemonic 설명 비고 C0 /3 ib
80186 RCR r/m8,imm8
C1 /3 ib
80186 RCR r/m16,imm8
32-bit 모드에서는 66h
접두사 필요 80386 RCR r/m32,imm8
D0 /3
8086/8088 RCR r/m8,1
D1 /3
8086/8088 RCR r/m16,1
32-bit 모드에서는 66h
접두사 필요 80386 RCR r/m32,1
D2 /3
8086/8088 RCR r/m8,CL
D3 /3
8086/8088 RCR r/m16,CL
32-bit 모드에서는 66h
접두사 필요 80386 RCR r/m32,CL
Opcode 추가 시점 Mnemonic 형식 비고 C0 /4 ib
80186 SHL r/m8,imm8
r/m <<= imm & 0x1f C1 /4 ib
80186 SHL r/m16,imm8
r/m <<= imm & 0x1f 32-bit 모드에서는 66h
접두사 필요 80386 SHL r/m32,imm8
D0 /4
8086/8088 SHL r/m8
r/m <<= 1 D1 /4
8086/8088 SHL r/m16
r/m <<= 1 32-bit 모드에서는 66h
접두사 필요 80386 SHL r/m32
D2 /4
8086/8088 SHL r/m8,CL
r/m <<= cl & 0x1f D3 /4
8086/8088 SHL r/m16,CL
r/m <<= cl & 0x1f 32-bit 모드에서는 66h
접두사 필요 80386 SHL r/m32,CL
SHL
명령어와 SAL
명령어는 동일한 연산을 수행한다. Opcode 추가 시점 Mnemonic 형식 비고 C0 /5 ib
80186 SHR r/m8,imm8
r/m >>= imm & 0x1f C1 /5 ib
80186 SHR r/m16,imm8
r/m >>= imm & 0x1f 32-bit 모드에서는 66h
접두사 필요 80386 SHR r/m32,imm8
D0 /5
8086/8088 SHR r/m8
r/m >>= 1 D1 /5
8086/8088 SHR r/m16
r/m >>= 1 32-bit 모드에서는 66h
접두사 필요 80386 SHR r/m32
D2 /5
8086/8088 SHR r/m8,CL
r/m >>= cl & 0x1f D3 /5
8086/8088 SHR r/m16,CL
r/m >>= cl & 0x1f 32-bit 모드에서는 66h
접두사 필요 80386 SHR r/m32,CL
Opcode 추가 시점 Mnemonic 형식 비고 C0 /7 ib
80186 SAR r/m8,imm8
r/m >>= imm & 0x1f C1 /7 ib
80186 SAR r/m16,imm8
r/m >>= imm & 0x1f 32-bit 모드에서는 66h
접두사 필요 80386 SAR r/m32,imm8
D0 /7
8086/8088 SAR r/m8
r/m >>= 1 D1 /7
8086/8088 SAR r/m16
r/m >>= 1 32-bit 모드에서는 66h
접두사 필요 80386 SAR r/m32
D2 /7
8086/8088 SAR r/m8,CL
r/m >>= cl & 0x1f D3 /7
8086/8088 SAR r/m16,CL
r/m >>= cl & 0x1f 32-bit 모드에서는 66h
접두사 필요 80386 SAR r/m32,CL
Opcode 추가 시점 Mnemonic 설명 비고 0F A4
80386 SHLD r/m16,r16,imm8
32-bit 모드에서는 66h
접두사 필요 SHLD r/m32,r32,imm8
0F A5
80386 SHLD r/m16,r16,CL
32-bit 모드에서는 66h
접두사 필요 SHLD r/m32,r32,CL
Opcode 추가 시점 Mnemonic 설명 비고 0F AC
80386 SHRD r/m16,r16,imm8
32-bit 모드에서는 66h
접두사 필요 SHRD r/m32,r32,imm8
0F AD
80386 SHRD r/m16,r16,CL
32-bit 모드에서는 66h
접두사 필요 SHRD r/m32,r32,CL
2.1.4. x86 메모리 관련 명령어 Opcode 추가 시점 Mnemonic 형식 비고 88 /r
8086/8088 MOV r/m8,r8
r/m = r 89 /r
8086/8088 MOV r/m16,r16
r/m = r 32-bit 모드에서는 66h
접두사 필요 80386 MOV r/m32,r32
8A /r
8086/8088 MOV r8,r/m8
r = r/m 8B /r
8086/8088 MOV r16,r/m16
r = r/m 32-bit 모드에서는 66h
접두사 필요 80386 MOV r32,r/m32
B0+rb ib
8086/8088 MOV r8,imm8
B8+rw iw
8086/8088 MOV r16,imm16
32-bit 모드에서는 66h
접두사 필요 B8+rd id
80386 MOV r32,imm32
C6 /0
8086/8088 MOV r/m8,imm8
C7 /0
8086/8088 MOV r/m16,imm16
32-bit 모드에서는 66h
접두사 필요 80386 MOV r/m32,imm32
2.1.4.1.1. MOV Sreg / MOV (seg:offset) Opcode 추가 시점 Mnemonic 형식 비고 8C /r
8086/8088 MOV r/m16,Sreg
r/m = Sreg 8E /r
8086/8088 MOV Sreg,r/m16
Sreg = r/m CS는 불러들일 수 없음. SS 값 변경시 다음 명령어까지 인터럽트 억제 A0 /r
8086/8088 MOV al,moffs8
a = (seg:offset) A1 /r
8086/8088 MOV ax,moffs16
a = (seg:offset) 32-bit 모드에서는 66h
접두사 필요 80386 MOV eax,moffs32
A2 /r
8086/8088 MOV moffs8,al
(seg:offset) = a A3 /r
8086/8088 MOV moffs16,ax
(seg:offset) = a 32-bit 모드에서는 66h
접두사 필요 80386 MOV moffs32,eax
Opcode 추가 시점 Mnemonic 형식 비고 86 /r
8086/8088 XCHG r/m8,r8
XCHG r8,r/m8
87 /r
8086/8088 XCHG r/m16,r16
XCHG r16,r/m16
32-bit 모드에서는 66h
접두사 필요 80386 XCHG r/m32,r32
XCHG r32,r/m32
90+rw
8086/8088 XCHG ax,r16
XCHG r16,ax
32-bit 모드에서는 66h
접두사 필요 90+rd
80386 XCHG eax,r32
XCHG r32,eax
Opcode 추가 시점 Mnemonic 설명 비고 0F B0 /r
80486 CMPXCHG r/m8,r8
0F B1 /r
80486 CMPXCHG r/m16,r16
32-bit 모드에서는 66h
접두사 필요 CMPXCHG r/m32,r32
LOCK 접두사와 함께 사용하는 경우 원자적으로 실행된다.
Opcode 추가 시점 Mnemonic 설명 비고 0F C7 /1 m64
Pentium CMPXCHG8B m64
레지스터 operand는 허용되지 않는다.
LOCK 접두사와 함께 사용하는 경우 원자적으로 실행된다.
Opcode 추가 시점 Mnemonic 형식 비고 50+rw
8086/8088 PUSH r16
*--SP = r 32-bit 모드에서는 66h
접두사 필요 50+rd
80386 PUSH r32
6A
80186 PUSH imm8
*--SP = imm 68
80186 PUSH imm16
*--SP = imm 32-bit 모드에서는 66h
접두사 필요 80386 PUSH imm32
FF /6
8086/8088 PUSH r/m16
*--SP = r/m 32-bit 모드에서는 66h
접두사 필요 80386 PUSH r/m32
67h
접두사 사용 시 16-bit 스택 포인터인 SP
레지스터가 사용된다. PUSH 연산 실행 시 16-bit 모드 또는 66h
접두사 사용 시 스택 포인터가 2 감소하고, 32-bit 모드에서는 스택 포인터가 4 감소한다.2.1.4.4.1. PUSH CS/SS/DS/ES/FS/GS Opcode 추가 시점 Mnemonic 형식 비고 0E
8086/8088 PUSH CS
*--SP = CS 16
8086/8088 PUSH SS
*--SP = SS 1E
8086/8088 PUSH DS
*--SP = DS 06
8086/8088 PUSH ES
*--SP = ES 0F A0
80386 PUSH FS
*--SP = FS 0F A8
80386 PUSH GS
*--SP = GS
Opcode 추가 시점 Mnemonic 설명 비고 60
80186 PUSHA
32-bit 모드에서는 66h
접두사 필요 80386 PUSHAD
Opcode 추가 시점 Mnemonic 형식 비고 9C
8086/8088 PUSHF
*--SP = FLAGS 32-bit 모드에서는 66h
접두사 필요 80386 PUSHFD
*--SP = EFLAGS
Opcode 추가 시점 Mnemonic 형식 비고 58+rw
8086/8088 POP r16
r = *SP++ 32-bit 모드에서는 66h
접두사 필요 58+rd
80386 POP r32
8F /0
8086/8088 POP r/m16
r/m = *SP++ 32-bit 모드에서는 66h
접두사 필요 80386 POP r/m32
Opcode 추가 시점 Mnemonic 형식 비고 0F
8086/8088 POP CS
CS = *SP++ 8086/8088에만 존재 17
8086/8088 POP SS
SS = *SP++ 1F
8086/8088 POP DS
DS = *SP++ 07
8086/8088 POP ES
ES = *SP++ 0F A1
80386 POP SS
FS = *SP++ 다음 명령어까지 인터럽트 억제 0F A9
80386 POP SS
GS = *SP++
67h
접두사 사용 시 16-bit 스택 포인터인 SP
레지스터가 사용된다. POP 연산 실행 시 16-bit 모드 또는 66h
접두사 사용 시 스택 포인터가 2 증가하고, 32-bit 모드에서는 스택 포인터가 4 증가한다.POP CS
명령어는 CS
세그먼트를 스택에서 제거한 값으로 덮어씌워 명령어 실행 흐름을 변경시키나 IP
는 변경하지 않기 때문에 쓸모가 없어 삭제되었고 공식 문서에서 CS
값을 변경하려면 CS:IP
를 스택에서 꺼내 덮어씌우는 RETF
명령어를 사용하라고 안내하고 있다. POP SS
명령어의 경우 스택 세그먼트 변경시 스택 포인터 또한 변경되어야 하므로 다음 명령어에서 SP
를 변경할 때까지 인터럽트를 억제시킨다. Opcode 추가 시점 Mnemonic 설명 비고 61
80186 POPA
32-bit 모드에서는 66h
접두사 필요 80386 POPAD
Opcode 추가 시점 Mnemonic 형식 비고 9D
8086/8088 POPF
FLAGS = *SP++ 32-bit 모드에서는 66h
접두사 필요 80386 POPFD
EFLAGS = *SP++
Opcode 추가 시점 Mnemonic 설명 비고 98
8086/8088 CBW
AX ← sign-extend of AL 32-bit 모드에서는 66h
접두사 필요 80386 CWDE
EAX ← sign-extend of AX
Opcode 추가 시점 Mnemonic 설명 비고 99
8086/8088 CWD
DX:AX ← sign-extend of AX 32-bit 모드에서는 66h
접두사 필요 80386 CDQ
EDX:EAX ← sign-extend of EAX
Opcode 추가 시점 Mnemonic 설명 비고 0F B6 /r
80386 MOVZX r16,r/m8
Move byte to word, zero-extension 32-bit 모드에서는 66h
접두사 필요 MOVZX r32,r/m8
Move byte to doubleword, zero-extension 0F B7 /r
80386 MOVZX r32,r/m16
Move word to doubleword, zero-extension
Opcode 추가 시점 Mnemonic 설명 비고 0F BE /r
80386 MOVSX r16,r/m8
Move byte to word, sign-extension 32-bit 모드에서는 66h
접두사 필요 MOVSX r32,r/m8
Move byte to doubleword, sign-extension 0F BF /r
80386 MOVSX r32,r/m16
Move word to doubleword, sign-extension
Opcode 추가 시점 Mnemonic 형식 비고 8D /r
8086/8088 LEA r16,m
r = [base + index * size + offset] 32-bit 모드에서는 66h
접두사 필요 80386 LEA r32,m
메모리 주소를 계산하는 명령어이다. 일부 컴파일러에서는 작은 상수를 곱하는 코드를 최적화할 때 사용한다. 66h 67h Operand Size Address Size 설명 O O 16 16 16-bit 주소가 계산되어 16-bit 레지스터에 저장된다. O - 16 32 32-bit 주소가 계산되어 하위 16-bit가 16-bit 레지스터에 저장된다. - O 32 16 16-bit 주소가 계산되어 zero-extend된 다음 32-bit 레지스터에 저장된다. - - 32 32 32-bit 주소가 계산되어 32-bit 레지스터에 저장된다.
Opcode 추가 시점 Mnemonic 설명 비고 C8 iw 00
80186 ENTER imm16,0
Create a stack frame for a procedure C8 iw 01
80186 ENTER imm16,1
Create a nested stack frame for a procedure C8 iw ib
ENTER imm16,imm8
16-bit 모드 또는 66h
접두사 사용 시 스택에서 BP
레지스터 값에 대한 push를 수행하고, 32-bit 모드에서는 EBP
레지스터 값에 대한 push를 수행한다.
Opcode 추가 시점 Mnemonic 형식 비고 C9
80186 LEAVE
SP = BP; BP = *SP++; 80386 LEAVE
ESP = EBP; EBP = *ESP++;
67h
접두사 사용 시 16-bit 스택 포인터인 SP
레지스터가 사용된다. 16-bit 모드 또는 66h
접두사 사용 시 스택에서 BP
레지스터 값에 대한 pop을 수행하고, 32-bit 모드에서는 EBP
레지스터 값에 대한 pop을 수행한다. Opcode 추가 시점 Mnemonic 설명 비고 62 /r
80186 BOUND r16,m16&16
32-bit 모드에서는 66h
접두사 필요 80386 BOUND r32,m32&32
Opcode 추가 시점 Mnemonic 설명 비고 0F C8+rd
80486 BSWAP r32
Reverses the byte order of a 32-bit register. 16-bit 레지스터에 대한 동작은 정의되지 않음
32-bit 레지스터 내의 바이트 순서를 뒤집는 명령어이다. 16-bit 레지스터 내의 바이트 순서를 뒤집고자 하는 경우 XCHG
명령어를 사용할 수 있다. (예: xchg ah,al
) Opcode 추가 시점 Mnemonic 설명 비고 0F C0 /r
80486 XADD r/m8,r8
Exchange r8 and r/m8; load sum into r/m8. 0F C1 /r
80486 XADD r/m16,r16
Exchange r16 and r/m16; load sum into r/m16. 32-bit 모드에서는 66h
접두사 필요 XADD r/m32,r32
Exchange r32 and r/m32; load sum into r/m32.
LOCK 접두사와 함께 사용하는 경우 원자적으로 실행된다. Opcode 추가 시점 Mnemonic 설명 비고 D7
8088/8086 XLAT m8
XLATB
Set AL
to memory byte DS:[(E)BX + unsigned AL]
16-bit 모드 또는 67h
접두사 사용시 메모리 주소로 DS:[BX+unsigned AL]
을, 32-bit 모드에서는 DS:[EBX+unsigned AL]
을 사용한다. Opcode 추가 시점 Mnemonic 설명 비고 9F
8086/8088 LAHF
Load: AH ← EFLAGS(SF:ZF:0:AF:0:PF:1:CF)
Opcode 추가 시점 Mnemonic 설명 비고 9E
8086/8088 SAHF
Loads SF, ZF, AF, PF, and CF from AH into EFLAGS register
2.1.4.19. LDS/LES/LFS/LGS/LSS Opcode 추가 시점 Mnemonic 설명 비고 C5 /r
8086/8088 LDS r16,m16:16
Load DS:r16 with far pointer from memory 32-bit 모드에서는 66h
접두사 필요 80386 LDS r32,m16:32
Load DS:r32 with far pointer from memory C4 /r
8086/8088 LES r16,m16:16
Load ES:r16 with far pointer from memory 32-bit 모드에서는 66h
접두사 필요 80386 LES r32,m16:32
Load ES:r32 with far pointer from memory 0F B2 /r
80386 LSS r16,m16:16
Load SS:r16 with far pointer from memory 32-bit 모드에서는 66h
접두사 필요 LSS r32,m16:32
Load SS:r32 with far pointer from memory 0F B4 /r
80386 LFS r16,m16:16
Load FS:r16 with far pointer from memory 32-bit 모드에서는 66h
접두사 필요 LFS r32,m16:32
Load FS:r32 with far pointer from memory 0F B5 /r
80386 LGS r16,m16:16
Load GS:r16 with far pointer from memory 32-bit 모드에서는 66h
접두사 필요 LGS r32,m16:32
Load GS:r32 with far pointer from memory
2.1.5. x86 제어/조건부 명령어 Opcode 추가 시점 Mnemonic 설명 비고 EB cb
8086/8088 JMP rel8
Jump short, relative E9 cw
8086/8088 JMP rel16
Jump near, relative 32-bit 모드에서는 66h
접두사 필요 E9 cd
80386 JMP rel32
EA cd
8086/8088 JMP ptr16:16
Jump far, absolute 32-bit 모드에서는 66h
접두사 필요 EA cp
80386 JMP ptr16:32
FF /4
8086/8088 JMP r/m16
Jump near, absolute indirect 32-bit 모드에서는 66h
접두사 필요 80386 JMP r/m32
FF /5
8086/8088 JMP m16:16
Jump far, absolute indirect 32-bit 모드에서는 66h
접두사 필요 80386 JMP m16:32
Opcode 추가 시점 Mnemonic 설명 비고 70+cc cb
8086/8088 Jcc rel8
Jump short if (condition) 0F 80+cc cw
80386 Jcc rel16
Jump near if (condition) 32-bit 모드에서는 66h
접두사 필요 0F 80+cc cd
80386 Jcc rel32
Opcode 추가 시점 Mnemonic 설명 비고 E3 cb
8086/8088 JCXZ rel8
Jump short if CX register is 0 32-bit 모드에서는 67h
접두사 필요 80386 JECXZ rel8
Jump short if ECX register is 0
Opcode 추가 시점 Mnemonic 설명 비고 E8 cw
8086/8088 CALL rel16
Call near, relative 32-bit 모드에서는 66h
접두사 필요 E8 cd
80386 CALL rel32
9A cd
8086/8088 CALL ptr16:16
Call far, absolute 32-bit 모드에서는 66h
접두사 필요 9A cp
80386 CALL ptr16:32
FF /2
8086/8088 CALL r/m16
Call near, absolute indirect 32-bit 모드에서는 66h
접두사 필요 80386 CALL r/m32
FF /3
8086/8088 CALL m16:16
Call far, absolute indirect 32-bit 모드에서는 66h
접두사 필요 80386 CALL m16:32
Opcode 추가 시점 Mnemonic 설명 비고 C3
8086/8088 RET
Near return to calling procedure CB
8086/8088 RET
Far return to calling procedure C2 iw
8086/8088 RET imm16
Near return to calling procedure and pop imm16 bytes from stack CA iw
8086/8088 RET imm16
Far return to calling procedure and pop imm16 bytes from stack
66h
접두사 사용 시 16-bit IP
가 사용된다. Opcode 추가 시점 Mnemonic 설명 비고 E2 cb
8086/8088 LOOP rel8
Decrement count; Jump short if count != 0 E1 cb
8086/8088 LOOPE rel8
LOOPZ rel8
Decrement count; Jump short if count != 0 and ZF = 1 E0 cb
8086/8088 LOOPNE rel8
LOOPNZ rel8
Decrement count; Jump short if count != 0 and ZF = 0
2.1.5.6. INT n/INTO/INT3/INT1 Opcode 추가 시점 Mnemonic 설명 비고 CC
8086/8088 INT 3
Interrupt 3—trap to debugger CD ib
8086/8088 INT imm8
Interrupt vector number specified by immediate byte CE
8086/8088 INTO
Interrupt 4—if overflow flag is 1 F1
80386 INT1
ICEBP
Opcode 추가 시점 Mnemonic 설명 비고 CF
8086/8088 IRET
Interrupt return 32-bit 모드에서는 66h
접두사 필요 80386 IRETD
Opcode 추가 시점 Mnemonic 설명 비고 0F 40+cc /r
Pentium Pro CMOVcc r16, r/m16
Move if (condition) 32-bit 모드에서는 66h
접두사 필요 CMOVcc r32, r/m32
Opcode 추가 시점 Mnemonic 설명 비고 0F 90+cc
80386 SETcc r/m8
Set byte if (condition)
2.1.6. x86 프로세서 제어 명령어 Opcode 추가 시점 Mnemonic 해당 명령어 설명 비고 F0
8086/8088 LOCK
메모리 세그멘트를 지정하는 접두사이다.2Eh
(0x2E): CS segment override36h
(0x36): SS segment override3Eh
(0x3E): DS segment override26h
(0x26): ES segment override64h
(0x64): FS segment override65h
(0x65): GS segment override Opcode 추가 시점 Mnemonic 비고 D8..DF
8086/8088 외부 장치(x87 FPU)에 접근하는 명령어이다.
x87 섹션 참조. Opcode 추가 시점 Mnemonic 설명 비고 9B
8086/8088 WAIT
FWAIT
Check pending unmasked floating-point exceptions.
Opcode 추가 시점 Mnemonic 설명 비고 F4
8086/8088 HLT
Halt
인터럽트 또는 특정한 신호가 활성화될 때까지 명령어의 실행을 멈추고 프로세서를 HALT 상태로 둔다. 하이퍼쓰레딩이 활성화된 경우 해당 명령어를 실행한 논리 프로세서만이 비활성화되고, 같은 코어에 존재하는 다른 논리 프로세서에는 적용되지 않는다.2.1.7. x86 플래그 제어 및 기타 명령어 Opcode 추가 시점 Mnemonic 설명 비고 F8
8086/8088 CLC
Clear carry CF = 0
Opcode 추가 시점 Mnemonic 설명 비고 F5
8086/8088 CMC
Complement carry CF = ~CF
Opcode 추가 시점 Mnemonic 설명 비고 F9
8086/8088 STC
Set carry CF = 1
Opcode 추가 시점 Mnemonic 설명 비고 FC
8086/8088 CLC
Clear direction DF = 0
Opcode 추가 시점 Mnemonic 설명 비고 FD
8086/8088 STD
Set direction DF = 1
Opcode 추가 시점 Mnemonic 설명 비고 FA
8086/8088 CLI
Clear interrupt IF = 0
Opcode 추가 시점 Mnemonic 설명 비고 FB
8086/8088 STI
Set interrupt IF = 1
Opcode 추가 시점 Mnemonic 설명 비고 0F A2
Pentium CPUID
CPU Identification
EAX 레지스터 값에 따라 EAX, EBX, ECX, EDX 레지스터에 프로세서 정보를 반환한다. Opcode 추가 시점 Mnemonic 설명 비고 0F 00 /2
80286 LLDT r/m16
Load segment selector r/m16 into LDTR
Opcode 추가 시점 Mnemonic 설명 비고 0F 00 /0
80286 SLDT r/m16
Stores segment selector from LDTR in r/m16 80386 SLDT r32
Stores segment selector from LDTR in low-order 16 bits of r32
Opcode 추가 시점 Mnemonic 설명 비고 0F 00 /3
80286 LTR r/m16
Load r/m16 into task register
Opcode 추가 시점 Mnemonic 설명 비고 0F 00 /1
80286 STR r/m16
Stores segment selector from TR in r/m16
Opcode 추가 시점 Mnemonic 설명 비고 0F 01 /2
80286 LGDT m16&32
Load m into GDTR
6-byte 메모리로부터 GDTR의 값을 불러온다. DEST[0:15]로부터 GDTR(Limit)을, DEST[16:48]로부터 GDTR(Base) 값을 불러오며 16-bit 모드 또는 66h
접두사가 붙은 경우 DEST[16:48]의 상위 8 bit 값을 무시한다(0으로 간주). Opcode 추가 시점 Mnemonic 설명 비고 0F 01 /0
80286 SGDT m
Store GDTR to m
GDTR의 값이 6-byte 메모리에 기록되며, DEST[0:15]에 GDTR(Limit)이, 16-bit 또는 66h
접두사가 붙은 경우 DEST[16:39]에 GDTR(Base), DEST[40:47]에 0
이, 32-bit의 겨우 DEST[16:48]에 GDTR(Base) 값이 기록된다. Opcode 추가 시점 Mnemonic 설명 비고 0F 01 /3
80286 LIDT m16&32
Load m into IDTR
6-byte 메모리로부터 IDTR의 값을 불러온다. DEST[0:15]로부터 IDTR(Limit)을, DEST[16:48]로부터 IDTR(Base) 값을 불러오며 16-bit 모드 또는 66h
접두사가 붙은 경우 DEST[16:48]의 상위 8 bit 값을 무시한다(0으로 간주). Opcode 추가 시점 Mnemonic 설명 비고 0F 01 /1
80286 SIDT m
Store IDTR to m
IDTR의 값이 6-byte 메모리에 기록되며, DEST[0:15]에 IDTR(Limit)이, 16-bit 또는 66h
접두사가 붙은 경우 DEST[16:39]에 IDTR(Base), DEST[40:47]에 0
이, 32-bit의 겨우 DEST[16:48]에 IDTR(Base) 값이 기록된다. Opcode 추가 시점 Mnemonic 설명 비고 0F 01 /6
80286 LMSW r/m16
Loads r/m16 in machine status word of CR0
Opcode 추가 시점 Mnemonic 설명 비고 0F 01 /4
80286 SMSW r/m16
Store machine status word to r/m16 32-bit 모드에서는 66h
접두사 필요 80386 SMSW r32/m16
Opcode 추가 시점 Mnemonic 설명 비고 0F 00 /4
80286 VERR r/m16
Set ZF=1 if segment specified with r/m16 can be read
Opcode 추가 시점 Mnemonic 설명 비고 0F 00 /5
80286 VERW r/m16
Set ZF=1 if segment specified with r/m16 can be written
Opcode 추가 시점 Mnemonic 설명 비고 63 /r
80286 ARPL r/m16,r16
Adjust RPL of r/m16 to not less than RPL of r16
Opcode 추가 시점 Mnemonic 설명 비고 0F 02 /r
80286 LAR r16,r/m16
32-bit 모드에서는 66h
접두사 필요 80386 LAR r32,r/m32
Opcode 추가 시점 Mnemonic 설명 비고 0F 03 /r
80286 LSL r16,r/m16
32-bit 모드에서는 66h
접두사 필요 80386 LSL r32,r/m32
Opcode 추가 시점 Mnemonic 설명 비고 0F 06
80286 CLTS
Clears TS flag in CR0
Opcode 추가 시점 Mnemonic 설명 비고 0F 08
80486 INVD
내부 캐시에만 존재하고 메모리에 기록되지 않은 데이터는 사라지므로 WBINVD
명령어를 사용하는 것이 좋다.
Opcode 추가 시점 Mnemonic 설명 비고 0F 09
80486 WBINVD
Opcode 추가 시점 Mnemonic 설명 비고 0F 01 /7
80486 INVLPG m
Invalidate TLB Entry for page that contains m
Opcode 추가 시점 Mnemonic 설명 비고 0F AA
i386SL RSM
Resume operation of interrupted program
Opcode 추가 시점 Mnemonic 설명 비고 0F 32
Pentium RDMSR
Load MSR specified by ECX into EDX:EAX
Opcode 추가 시점 Mnemonic 설명 비고 0F 30
Pentium WRMSR
Write the value in EDX:EAX to MSR specified by ECX
Opcode 추가 시점 Mnemonic 설명 비고 0F 33
Pentium MMX RDPMC
Opcode 추가 시점 Mnemonic 설명 비고 0F 31
Pentium RDTSC
Read time-stamp counter into EDX:EAX
Opcode 추가 시점 Mnemonic 설명 비고 0F 34
Pentium Pro SYSENTER
Fast call to privilege level 0 system procedures
Opcode 추가 시점 Mnemonic 설명 비고 0F 35
Pentium Pro SYSEXIT
Fast return to privilege level 3 user code.
Opcode 추가 시점 Mnemonic 설명 비고 E4
8086/8088 IN al,imm8
Input byte from imm8 I/O port address into AL E5 ib
8086/8088 IN ax,imm8
Input byte from imm8 I/O port address into AX 32-bit 모드에서는 66h
접두사 필요 80386 IN eax,imm8
Input byte from imm8 I/O port address into EAX EC
8086/8088 IN al,dx
Input byte from I/O port in DX into AL ED
8086/8088 IN ax,dx
Input word from I/O port in DX into AX 32-bit 모드에서는 66h
접두사 필요 80386 IN eax,dx
Input doubleword from I/O port in DX into EAX
Opcode 추가 시점 Mnemonic 설명 비고 E6
8086/8088 OUT imm8,al
Output byte in AL to I/O port address imm8 E7 ib
8086/8088 OUT imm8,ax
Output word in AX to I/O port address imm8 32-bit 모드에서는 66h
접두사 필요 80386 OUT imm8,eax
Output doubleword in EAX to I/O port address imm8 EC
8086/8088 OUT dx,al
Output byte in AL to I/O port address in DX ED
8086/8088 OUT dx,ax
Output word in AX to I/O port address in DX 32-bit 모드에서는 66h
접두사 필요 80386 OUT dx,eax
Output doubleword in EAX to I/O port address in DX
Opcode 추가 시점 Mnemonic 설명 비고 0F A3
80386 BT r/m16,r16
Store selected bit in CF flag 32-bit 모드에서는 66h
접두사 필요 BT r/m32,r32
0F BA /4 ib
80386 BT r/m16,imm8
Store selected bit in CF flag 32-bit 모드에서는 66h
접두사 필요 BT r/m32,imm8
Opcode 추가 시점 Mnemonic 설명 비고 0F AB
80386 BTS r/m16,r16
Store selected bit in CF flag and set 32-bit 모드에서는 66h
접두사 필요 BTS r/m32,r32
0F BA /5 ib
80386 BTS r/m16,imm8
Store selected bit in CF flag and set 32-bit 모드에서는 66h
접두사 필요 BTS r/m32,imm8
Opcode 추가 시점 Mnemonic 설명 비고 0F B3
80386 BTR r/m16,r16
Store selected bit in CF flag and clear 32-bit 모드에서는 66h
접두사 필요 BTR r/m32,r32
0F BA /6 ib
80386 BTR r/m16,imm8
Store selected bit in CF flag and clear 32-bit 모드에서는 66h
접두사 필요 BTR r/m32,imm8
Opcode 추가 시점 Mnemonic 설명 비고 0F BB
80386 BTC r/m16,r16
Store selected bit in CF flag and complement 32-bit 모드에서는 66h
접두사 필요 BTC r/m32,r32
0F BA /7 ib
80386 BTC r/m16,imm8
Store selected bit in CF flag and complement 32-bit 모드에서는 66h
접두사 필요 BTC r/m32,imm8
Opcode 추가 시점 Mnemonic 설명 비고 0F BC
80386 BSF r16,r/m16
Bit scan forward on r/m16 32-bit 모드에서는 66h
접두사 필요 BSF r32,r/m32
Bit scan forward on r/m32
Source의 least significant set bit를 찾아 그 위치를 저장한다. Opcode 추가 시점 Mnemonic 설명 비고 0F BD
80386 BSR r16,r/m16
Bit scan reverse on r/m16 32-bit 모드에서는 66h
접두사 필요 BSR r32,r/m32
Bit scan reverse on r/m32
Source의 most significant set bit를 찾아 그 위치를 저장한다. Opcode 추가 시점 Mnemonic 해당 명령어 중단 조건 1 중단 조건 2 비고 F3
8086/8088 REP
INS
, OUTS
, MOVS
, LODS
, STOS
ECX=0 None 8086/8088 REPE
REPZ
CMPS
, SCAS
ECX=0 ZF=0 Find nonmatching F2
8086/8088 REPNE
REPNZ
CMPS
, SCAS
ECX=0 ZF=1 Find matching
2.1.11.2. MOVS/MOVSB/MOVSW/MOVSD Opcode 추가 시점 Mnemonic 설명 비고 A4
8086/8088 MOVS m8,m8
MOVSB
A5
8086/8088 MOVS m16,m16
MOVSW
32-bit 모드에서는 66h
접두사 필요 80386 MOVS m32,m32
MOVSD
2.1.11.3. CMPS/CMPSB/CMPSW/CMPSD Opcode 추가 시점 Mnemonic 설명 비고 A6
8086/8088 CMPS m8,m8
CMPSB
A7
8086/8088 CMPS m16,m16
CMPSW
32-bit 모드에서는 66h
접두사 필요 80386 CMPS m32,m32
CMPSD
2.1.11.4. LODS/LODSB/LODSW/LODSD Opcode 추가 시점 Mnemonic 설명 비고 AC
8086/8088 LODS m8
LODSB
AD
8086/8088 LODS m16
LODSW
32-bit 모드에서는 66h
접두사 필요 80386 LODS m32
LODSD
2.1.11.5. SCAS/SCASB/SCASW/SCASD Opcode 추가 시점 Mnemonic 설명 비고 AE
8086/8088 SCAS m8
SCASB
AF
8086/8088 SCAS m16
SCASW
32-bit 모드에서는 66h
접두사 필요 80386 SCAS m32
SCASD
2.1.11.6. STOS/STOSB/STOSW/STOSD Opcode 추가 시점 Mnemonic 설명 비고 AA
8086/8088 STOS m8
STOSB
AB
8086/8088 STOS m16
STOSW
32-bit 모드에서는 66h
접두사 필요 80386 STOS m32
STOSD
2.1.11.7. INS/INSB/INSW/INSD Opcode 추가 시점 Mnemonic 설명 비고 6C
80186 INS m8,dx
INSB
6D
80186 INS m16,dx
INSW
32-bit 모드에서는 66h
접두사 필요 80386 INS m32,dx
INSD
2.1.11.8. OUTS/OUTSB/OUTSW/OUTSD Opcode 추가 시점 Mnemonic 설명 비고 6E
80186 OUTS dx,m8
OUTSB
6F
80186 OUTS dx,m16
OUTSW
32-bit 모드에서는 66h
접두사 필요 80386 OUTS dx,m32
OUTSD
Opcode 추가 시점 Mnemonic 설명 비고 37
8086/8088 AAA
ASCII adjust AL after addition
Opcode 추가 시점 Mnemonic 설명 비고 3F
8086/8088 AAS
ASCII adjust AL after subtraction
Opcode 추가 시점 Mnemonic 설명 비고 D4 0A
8086/8088 AAM
ASCII adjust AX after multiply D4 ib
8086/8088 (No mnemonic) Adjust AX after multiply to number base imm8
Opcode 추가 시점 Mnemonic 설명 비고 D5 0A
8086/8088 AAD
ASCII adjust AX before division D5 ib
8086/8088 (No mnemonic) Adjust AX before division to number base imm8
Opcode 추가 시점 Mnemonic 설명 비고 27
8086/8088 DAA
Decimal adjust AL after addition
예: 79h
+ 35h
= AEh
→ 14h
(DAA) Opcode 추가 시점 Mnemonic 설명 비고 2F
8086/8088 DAS
Decimal adjust AL after subtraction
예: 35h
- 47h
= EEh
→ 88h
(DAS)2.2. x87 FPU 명령어 Opcode 추가 시점 Mnemonic 설명 비고 D9 /0
8087 FLD m32fp
PUSH(m32fp) DD /0
FLD m64fp
PUSH(m64fp) DB /5
8087 FLD m80fp
PUSH(m80fp) D9 C0+i
8087 FLD st(i)
PUSH(st(i))
Opcode 추가 시점 Mnemonic 설명 비고 D9 /2
8087 FST m32fp
m32fp = st(0) DD /2
FST m64fp
m64fp = st(0) DD D0+i
8087 FST st(i)
st(i) = st(0)
Opcode 추가 시점 Mnemonic 설명 비고 D9 /3
8087 FSTP m32fp
m32fp = st(0); POP() DD /3
FSTP m64fp
m64fp = st(0); POP() DB /7
8087 FSTP m80fp
m80fp = st(0); POP() DD D8+i
8087 FST st(i)
st(i) = st(0); POP()
Opcode 추가 시점 Mnemonic 설명 비고 D9 C8+i
8087 FXCH st(i)
st(0) <-> st(i) D9 C9
FXCH
st(0) <-> st(1)
Opcode 추가 시점 Mnemonic 설명 비고 DA C0+i
Pentium Pro FCMOVB st(0),st(i)
Move if below (CF=1) DA C8+i
FCMOVE st(0),st(i)
Move if equal (ZF=1) DA D0+i
FCMOVBE st(0),st(i)
Move if below or equal (CF=1 or ZF=1) DA D8+i
FCMOVU st(0),st(i)
Move if unordered (PF=1) DB C0+i
FCMOVNB st(0),st(i)
Move if not below (CF=0) DB C8+i
FCMOVNE st(0),st(i)
Move if not equal (ZF=0) DB D0+i
FCMOVNBE st(0),st(i)
Move if not below or equal (CF=0 and ZF=0) DB D8+i
FCMOVNU st(0),st(i)
Move if not unordered (PF=0)
EFLAGS
레지스터에 있는 상태 플래그의 값에 따라 이동 연산을 수행한다. Opcode 추가 시점 Mnemonic 설명 비고 DF /0
8087 FILD m16int
PUSH(m16int) DB /0
FILD m32int
PUSH(m32int) DF /5
8087 FILD m64int
PUSH(m64int)
Opcode 추가 시점 Mnemonic 설명 비고 DF /2
8087 FIST m16int
m16int = st(0) DB /2
FIST m32int
m32int = st(0)
Opcode 추가 시점 Mnemonic 설명 비고 DF /3
8087 FISTP m16int
m16int = st(0); POP() DB /3
FISTP m32int
m32int = st(0); POP() DF /7
8087 FISTP m64int
m64int = st(0); POP()
만약 ST(0)의 값이 정수가 아닐 경우 반올림 모드에 따라 정수로 변환한다. Opcode 추가 시점 Mnemonic 설명 비고 DF /1
SSE3 FISTTP m16int
m16int = st(0); POP() DB /1
FISTTP m32int
m32int = st(0); POP() DD /1
FISTTP m64int
m64int = st(0); POP()
만약 ST(0)의 값이 정수가 아닐 경우 버림을 적용하여 정수로 변환한다. Opcode 추가 시점 Mnemonic 설명 비고 DF /4
8087 FBLD m80bcd
PUSH(m80bcd)
Opcode 추가 시점 Mnemonic 설명 비고 DF /6
8087 FBSTP m80bcd
m80bcd = st(0); POP()
2.2.1.12. FLD1/FLDL2T/FLDL2E/FLDPI/FLDLG2/FLDLN2/FLDZ Opcode 추가 시점 Mnemonic 설명 비고 D9 E8
8087 FLD1
Push [math(+1.0)] onto the FPU register stack. D9 E9
FLDL2T
Push [math(\log_2 10)] onto the FPU register stack. D9 EA
FLDL2E
Push [math(\log_2 e)] onto the FPU register stack. D9 EB
FLDPI
Push [math(\pi)] onto the FPU register stack. D9 EC
FLDLG2
Push [math(\log_{10} 2)] onto the FPU register stack. D9 ED
FLDLN2
Push [math(\log_e 2)] onto the FPU register stack. D9 EE
FLDZ
Push [math(+0.0)] onto the FPU register stack.
2.2.2. x87 사칙연산 명령어 Opcode 추가 시점 Mnemonic 설명 비고 D8 /0
8087 FADD m32fp
st(0) += m32fp DC /0
FADD m64fp
st(0) += m64fp D8 C0+i
8087 FADD st(0), st(i)
st(0) += st(i) DC C0+i
8087 FADD st(i), st(0)
st(i) += st(0)
Opcode 추가 시점 Mnemonic 설명 비고 DE C0+i
8087 FADDP st(i), st(0)
st(i) += st(0); POP() DE C1
FADDP
st(1) += st(0); POP()
Opcode 추가 시점 Mnemonic 설명 비고 D8 /4
8087 FSUB m32fp
st(0) -= m32fp DC /4
FSUB m64fp
st(0) -= m64fp D8 E0+i
8087 FSUB st(0), st(i)
st(0) -= st(i) DC E8+i
8087 FSUB st(i), st(0)
st(i) -= st(0)
Opcode 추가 시점 Mnemonic 설명 비고 DE E8+i
8087 FSUBP st(i), st(0)
st(i) -= st(0); POP() DE E9
FSUBP
st(1) -= st(0); POP()
Opcode 추가 시점 Mnemonic 설명 비고 D8 /5
8087 FSUBR m32fp
st(0) = m32fp - st(0) DC /5
FSUBR m64fp
st(0) = m64fp - st(0) D8 E8+i
8087 FSUBR st(0), st(i)
st(0) = st(i) - st(0) DC E0+i
8087 FSUBR st(i), st(0)
st(i) = st(0) - st(i)
Opcode 추가 시점 Mnemonic 설명 비고 DE E0+i
8087 FSUBRP st(i), st(0)
st(i) = st(0) - st(i); POP() DE E1
FSUBRP
st(1) = st(0) - st(1); POP()
Opcode 추가 시점 Mnemonic 설명 비고 D8 /1
8087 FMUL m32fp
st(0) *= m32fp DC /1
FMUL m64fp
st(0) *= m64fp D8 C8+i
8087 FMUL st(0), st(i)
st(0) *= st(i) DC C8+i
8087 FMUL st(i), st(0)
st(i) *= st(0)
Opcode 추가 시점 Mnemonic 설명 비고 DE C8+i
8087 FMULP st(i), st(0)
st(i) *= st(0); POP() DE C9
FMULP
st(1) *= st(0); POP()
Opcode 추가 시점 Mnemonic 설명 비고 D8 /6
8087 FDIV m32fp
st(0) /= m32fp DC /6
FDIV m64fp
st(0) /= m64fp D8 F0+i
8087 FDIV st(0), st(i)
st(0) /= st(i) DC F8+i
8087 FDIV st(i), st(0)
st(i) /= st(0)
Opcode 추가 시점 Mnemonic 설명 비고 DE F8+i
8087 FDIVP st(i), st(0)
st(i) /= st(0); POP() DE F9
FDIVP
st(1) /= st(0); POP()
Opcode 추가 시점 Mnemonic 설명 비고 D8 /7
8087 FDIVR m32fp
st(0) = m32fp / st(0) DC /7
FDIVR m64fp
st(0) = m64fp / st(0) D8 F8+i
8087 FDIVR st(0), st(i)
st(0) = st(i) / st(0) DC F0+i
8087 FDIVR st(i), st(0)
st(i) = st(0) / st(i)
Opcode 추가 시점 Mnemonic 설명 비고 DE F0+i
8087 FDIVRP st(i), st(0)
st(i) = st(0) / st(i); POP() DE F1
FDIVRP
st(1) = st(0) / st(1); POP()
Opcode 추가 시점 Mnemonic 설명 비고 D9 E0
8087 FCHS
st(0) = -st(0)
Opcode 추가 시점 Mnemonic 설명 비고 D9 E1
8087 FABS
Replace ST(0) with its absolute value.
Opcode 추가 시점 Mnemonic 설명 비고 D9 FA
8087 FABS
Computes square root of ST(0) and stores the result in ST(0).
Opcode 추가 시점 Mnemonic 설명 비고 D9 F8
8087 FPREM
st(0) −= (Q ∗ st(1)) Truncate
Opcode 추가 시점 Mnemonic 설명 비고 D9 F5
80387 FPREM1
st(0) −= (Q ∗ st(1)) Round to nearest (IEEE-754 compliant)
Opcode 추가 시점 Mnemonic 설명 비고 D9 FC
8087 FRNDINT
Round ST(0) to an integer.
Opcode 추가 시점 Mnemonic 설명 비고 D9 F4
8087 FXTRACT
st(0) = Exponent(ST), PUSH(Significand(ST))
Opcode 추가 시점 Mnemonic 설명 비고 DA /0
8087 FIADD m32int
st(0) += m32int DE /0
FIADD m16int
st(0) += m16int
Opcode 추가 시점 Mnemonic 설명 비고 DA /4
8087 FISUB m32int
st(0) -= m32int DE /4
FISUB m16int
st(0) -= m16int
Opcode 추가 시점 Mnemonic 설명 비고 DA /5
8087 FISUBR m32int
st(0) = m32int - st(0) DE /5
FISUBR m16int
st(0) = m16int - st(0)
Opcode 추가 시점 Mnemonic 설명 비고 DA /1
8087 FIMUL m32int
st(0) *= m32int DE /1
FIMUL m16int
st(0) *= m16int
Opcode 추가 시점 Mnemonic 설명 비고 DA /6
8087 FIDIV m32int
st(0) /= m32int DE /6
FIDIV m16int
st(0) /= m16int
Opcode 추가 시점 Mnemonic 설명 비고 DA /7
8087 FIDIVR m32int
st(0) = m32int / st(0) DE /7
FIDIVR m16int
st(0) = m16int / st(0)
2.2.3.1. FCOM/FCOMP/FCOMPP Opcode 추가 시점 Mnemonic 설명 비고 D8 /2
8087 FCOM m32fp
Compare ST(0) with m32fp. DC /2
FCOM m64fp
Compare ST(0) with m64fp. D8 D0+i
8087 FCOM st(i)
Compare ST(0) with ST(i). D8 D1
FCOM
Compare ST(0) with ST(1). D8 /3
8087 FCOMP m32fp
Compare ST(0) with m32fp and pop register stack. DC /3
FCOMP m64fp
Compare ST(0) with m64fp and pop register stack. D8 D8+i
8087 FCOMP st(i)
Compare ST(0) with ST(i) and pop register stack. D8 D9
FCOMP
Compare ST(0) with ST(1) and pop register stack. DE D9
8087 FCOMPP
Compare ST(0) with ST(1) and pop register stack twice.
2.2.3.2. FUCOM/FUCOMP/FUCOMPP Opcode 추가 시점 Mnemonic 설명 비고 DD E0+i
80387 FUCOM st(i)
Compare ST(0) with ST(i) DD E1
FUCOM
Compare ST(0) with ST(1) DD E8+i
80387 FUCOMP st(i)
Compare ST(0) with ST(i) and pop register stack DD E9
FUCOMP
Compare ST(0) with ST(1) and pop register stack DA E9
80387 FUCOMPP
Compare ST(0) with ST(1) and pop register stack twice
Opcode 추가 시점 Mnemonic 설명 비고 DE /2
8087 FICOM m16int
Compare ST(0) with m16int DA /2
FICOM m32int
Compare ST(0) with m32int DE /3
8087 FICOMP m16int
Compare ST(0) with m16int and pop stack register DA /3
FICOMP m32int
Compare ST(0) with m32int and pop stack register
2.2.3.4. FCOMI/FCOMIP/FUCOMI/FUCOMIP Opcode 추가 시점 Mnemonic 설명 비고 DB F0+i
Pentium Pro FCOMI st(0),st(i)
DF F0+i
Pentium Pro FCOMIP st(0),st(i)
DB E8+i
Pentium Pro FUCOMI st(0),st(i)
DF E8+i
Pentium Pro FUCOMIP st(0),st(i)
Opcode 추가 시점 Mnemonic 설명 비고 D9 E4
8087 FTST
Compare ST(0) with 0.0.
Opcode 추가 시점 Mnemonic 설명 비고 D9 E5
8087 FXAM
Classify value or number in ST(0)
2.2.4. x87 특수 함수 명령어 Opcode 추가 시점 Mnemonic 설명 비고 D9 FE
80387 FSIN
Replace ST(0) with its sine.
Opcode 추가 시점 Mnemonic 설명 비고 D9 FF
80387 FCOS
Replace ST(0) with its cosine
Opcode 추가 시점 Mnemonic 설명 비고 D9 FB
80387 FSINCOS
Opcode 추가 시점 Mnemonic 설명 비고 D9 F2
8087 FPTAN
Replace ST(0) with its tangent and push 1 onto the FPU stack.
Opcode 추가 시점 Mnemonic 설명 비고 D9 F3
8087 FPATAN
Replace ST(1) with arctan(ST(1)/ST(0)) and pop the register stack
Opcode 추가 시점 Mnemonic 설명 비고 D9 F1
8087 FYL2X
Replace [math(\textrm{ST}(1))] with [math((\textrm{ST}(1) ∗ \log_2 \textrm{ST}(0)))] and pop the register stack
Opcode 추가 시점 Mnemonic 설명 비고 D9 F9
8087 FYL2XP1
Replace [math(\textrm{ST}(1))] with [math(\textrm{ST}(1) ∗ \log_2(\textrm{ST}(0) + 1.0))] and pop the register stack
Opcode 추가 시점 Mnemonic 설명 비고 D9 F0
8087 F2XM1
Replace [math(\textrm{ST}(0))] with [math(2^{\textrm{ST}(0)} – 1)]
Opcode 추가 시점 Mnemonic 설명 비고 D9 FD
8087 FSCALE
Scale ST(0) by ST(1).
2.2.5. x87 FPU 제어 명령어 Opcode 추가 시점 Mnemonic 설명 비고 D9 F7
8087 FINCSTP
Increment the TOP field in the FPU status register
Opcode 추가 시점 Mnemonic 설명 비고 D9 F6
8087 FDECSTP
Decrement TOP field in FPU status word.
Opcode 추가 시점 Mnemonic 설명 비고 DD C0+i
8087 FFREE st(i)
Sets tag for ST(i) to empty
Opcode 추가 시점 Mnemonic 설명 비고 9B DB E3
8087 FINIT
DB E3
8087 FNINIT
Opcode 추가 시점 Mnemonic 설명 비고 9B DB E2
8087 FCLEX
DB E2
8087 FNCLEX
Opcode 추가 시점 Mnemonic 설명 비고 9B D9 /7
8087 FSTCW m2byte
D9 /7
8087 FNSTCW m2byte
Opcode 추가 시점 Mnemonic 설명 비고 D9 /5
8087 FLDCW m2byte
Opcode 추가 시점 Mnemonic 설명 비고 9B D9 /6
8087 FSTENV m14byte
32-bit 모드에서는 66h
접두사 필요 80387 FSTENV m28byte
D9 /6
8087 FNSTENV m14byte
32-bit 모드에서는 66h
접두사 필요 80387 FNSTENV m28byte
Opcode 추가 시점 Mnemonic 설명 비고 D9 /4
8087 FLDENV m14byte
32-bit 모드에서는 66h
접두사 필요 80387 FLDENV m28byte
Opcode 추가 시점 Mnemonic 설명 비고 9B DD /6
8087 FSAVE m94byte
32-bit 모드에서는 66h
접두사 필요 80387 FSAVE m108byte
DD /6
8087 FNSAVE m94byte
32-bit 모드에서는 66h
접두사 필요 80387 FNSAVE m108byte
Opcode 추가 시점 Mnemonic 설명 비고 DD /4
8087 FRSTOR m94byte
32-bit 모드에서는 66h
접두사 필요 80387 FRSTOR m108byte
Opcode 추가 시점 Mnemonic 설명 비고 9B DD /7
8087 FSTSW m2byte
9B DF E0
80287 FSTSW ax
DD /7
8087 FNSTSW m2byte
DF E0
80287 FNSTSW ax
Opcode 추가 시점 Mnemonic 설명 비고 D9 D0
8087 FNOP
No operation is performed.
Opcode 추가 시점 Mnemonic 설명 비고 0F AE /0
Pentium II FXSAVE m512byte
Opcode 추가 시점 Mnemonic 설명 비고 0F AE /1
Pentium II FXRSTOR m512byte
스트리밍 SIMD 확장 문서 참조AMD에서 만든 대응 명령어 3DNow!는 사실상 사장되었다. 인텔 IA-32 소프트웨어 개발자 매뉴얼에서는 SSE에 포함된 MMX 명령어 또한 MMX 명령어로 분류하므로 이 또한 MMX 문단에 작성하나, SSE 확장과 함께 추가되었음을 명시한다. (NP
: No Prefix. 접두사 없음.) 3.1.1. MMX 메모리 및 변환 명령어 Opcode 추가 시점 Mnemonic 형식 Intrinsics 비고 NP 0F 6E /r
Pentium MMX MOVD mm,r/m32
mm = r/m32 _mm_cvtsi32_si64 NP 0F 7E /r
Pentium MMX MOVD r/m32,mm
r/m32 = mm _mm_cvtsi64_si32 66 0F 6E /r
Pentium 4 (SSE2) MOVD xmm,r/m32
xmm = r/m32 _mm_cvtsi32_si128 66 0F 7E /r
Pentium 4 (SSE2) MOVD r/m32,xmm
r/m32 = xmm _mm_cvtsi128_si32
Opcode 추가 시점 Mnemonic 형식 비고 NP 0F 6F /r
Pentium MMX MOVQ mm,mm/m64
mm = mm/m64 NP 0F 7F /r
Pentium MMX MOVQ mm/m64,mm
mm/m64 = mm F3 0F 7E /r
Pentium 4 (SSE2) MOVQ xmm1,xmm2/m64
xmm1 = xmm2/m64 66 0F D6 /r
Pentium 4 (SSE2) MOVQ xmm2/m64,xmm1
xmm2/m64 = xmm1
Opcode 추가 시점 Mnemonic 설명 비고 NP 0F 63 /r
Pentium MMX PACKSSWB mm1,mm2/m64
66 0F 63 /r
Pentium 4 (SSE2) PACKSSWB xmm1,xmm2/m128
Opcode 추가 시점 Mnemonic 설명 비고 NP 0F 6B /r
Pentium MMX PACKSSDW mm1,mm2/m64
66 0F 6B /r
Pentium 4 (SSE2) PACKSSDW xmm1,xmm2/m128
Opcode 추가 시점 Mnemonic 설명 비고 NP 0F 67 /r
Pentium MMX PACKUSWB mm1,mm2/m64
66 0F 67 /r
Pentium 4 (SSE2) PACKUSWB xmm1,xmm2/m128
Opcode 추가 시점 Mnemonic 설명 비고 NP 0F 68 /r
Pentium MMX PUNPCKHBW mm1,mm2/m64
66 0F 68 /r
Pentium 4 (SSE2) PUNPCKHBW xmm1,xmm2/m128
Opcode 추가 시점 Mnemonic 설명 비고 NP 0F 69 /r
Pentium MMX PUNPCKHWD mm1,mm2/m64
66 0F 69 /r
Pentium 4 (SSE2) PUNPCKHWD xmm1,xmm2/m128
Opcode 추가 시점 Mnemonic 설명 비고 NP 0F 6A /r
Pentium MMX PUNPCKHDQ mm1,mm2/m64
66 0F 6A /r
Pentium 4 (SSE2) PUNPCKHDQ xmm1,xmm2/m128
Opcode 추가 시점 Mnemonic 설명 비고 NP 0F 60 /r
Pentium MMX PUNPCKLBW mm1,mm2/m32
66 0F 60 /r
Pentium 4 (SSE2) PUNPCKLBW xmm1,xmm2/m128
Opcode 추가 시점 Mnemonic 설명 비고 NP 0F 61 /r
Pentium MMX PUNPCKLWD mm1,mm2/m32
66 0F 61 /r
Pentium 4 (SSE2) PUNPCKLWD xmm1,xmm2/m128
Opcode 추가 시점 Mnemonic 설명 비고 NP 0F 62 /r
Pentium MMX PUNPCKLDQ mm1,mm2/m32
66 0F 62 /r
Pentium 4 (SSE2) PUNPCKLDQ xmm1,xmm2/m128
3.1.2. MMX Packed Arithmetic 명령어3.1.2.1. PADDB/PADDW/PADDD Opcode 추가 시점 Mnemonic 형식 비고 NP 0F FC /r
Pentium MMX PADDW mm,mm/m64
mm += mm/m64 NP 0F FD /r
PADDD mm,mm/m64
NP 0F FE /r
PADDQ mm,mm/m64
66 0F FC /r
Pentium 4 (SSE2) PADDW xmm1,xmm2/m128
xmm1 += xmm2/m128 66 0F FD /r
PADDD xmm1,xmm2/m128
66 0F FE /r
PADDQ xmm1,xmm2/m128
Opcode 추가 시점 Mnemonic 형식 비고 NP 0F EC /r
Pentium MMX PADDSB mm,mm/m64
mm += mm/m64 NP 0F ED /r
PADDSW mm,mm/m64
66 0F EC /r
Pentium 4 (SSE2) PADDSB xmm1,xmm2/m128
xmm1 += xmm2/m128 66 0F ED /r
PADDSW xmm1,xmm2/m128
Opcode 추가 시점 Mnemonic 형식 비고 NP 0F DC /r
Pentium MMX PADDUSB mm,mm/m64
mm += mm/m64 NP 0F DD /r
PADDUSW mm,mm/m64
66 0F DC /r
Pentium 4 (SSE2) PADDUSB xmm1,xmm2/m128
xmm1 += xmm2/m128 66 0F DD /r
PADDUSW xmm1,xmm2/m128
3.1.2.4. PSUBB/PSUBW/PSUBD Opcode 추가 시점 Mnemonic 형식 비고 NP 0F F8 /r
Pentium MMX PSUBW mm,mm/m64
mm -= mm/m64 NP 0F F9 /r
PSUBD mm,mm/m64
NP 0F FA /r
PSUBQ mm,mm/m64
66 0F F8 /r
Pentium 4 (SSE2) PSUBW xmm1,xmm2/m128
xmm1 -= xmm2/m128 66 0F F9 /r
PSUBD xmm1,xmm2/m128
66 0F FA /r
PSUBQ xmm1,xmm2/m128
Opcode 추가 시점 Mnemonic 형식 비고 NP 0F E8 /r
Pentium MMX PSUBSB mm,mm/m64
mm -= mm/m64 NP 0F E9 /r
PSUBSW mm,mm/m64
66 0F E8 /r
Pentium 4 (SSE2) PSUBSB xmm1,xmm2/m128
xmm1 -= xmm2/m128 66 0F E9 /r
PSUBSW xmm1,xmm2/m128
Opcode 추가 시점 Mnemonic 형식 비고 NP 0F D8 /r
Pentium MMX PSUBUSB mm,mm/m64
mm -= mm/m64 NP 0F D9 /r
PSUBUSW mm,mm/m64
66 0F D8 /r
Pentium 4 (SSE2) PSUBUSB xmm1,xmm2/m128
xmm1 -= xmm2/m128 66 0F D9 /r
PSUBUSW xmm1,xmm2/m128
Opcode 추가 시점 Mnemonic 설명 비고 NP 0F E5 /r
Pentium MMX PMULHW mm,mm/m64
66 0F E5 /r
Pentium 4 (SSE2) PMULHW xmm1,xmm2/m128
Opcode 추가 시점 Mnemonic 설명 비고 NP 0F D5 /r
Pentium MMX PMULLW mm,mm/m64
66 0F D5 /r
Pentium 4 (SSE2) PMULLW xmm1,xmm2/m128
Opcode 추가 시점 Mnemonic 설명 비고 NP 0F F5 /r
Pentium MMX PMADDWD mm,mm/m64
[* DEST[31:0] ← (DEST[15:0] ∗ SRC[15:0]) + (DEST[31:16] ∗ SRC[31:16]);
DEST[63:32] ← (DEST[47:32] ∗ SRC[47:32]) + (DEST[63:48] ∗ SRC[63:48]);
] 66 0F F5 /r
Pentium 4 (SSE2) PMADDWD xmm1,xmm2/m128
[* DEST[31:0] ← (DEST[15:0] ∗ SRC[15:0]) + (DEST[31:16] ∗ SRC[31:16]);
DEST[63:32] ← (DEST[47:32] ∗ SRC[47:32]) + (DEST[63:48] ∗ SRC[63:48]);
DEST[95:64] ← (DEST[79:64] ∗ SRC[79:64]) + (DEST[95:80] ∗ SRC[95:80]);
DEST[127:96] ← (DEST[111:96] ∗ SRC[111:96]) + (DEST[127:112] ∗ SRC[127:112]);
]
3.1.3. MMX Comparison 명령어3.1.3.1. PCMPEQB/PCMPEQW/PCMPEQD Opcode 추가 시점 Mnemonic 형식 비고 NP 0F 74 /r
Pentium MMX PCMPEQB mm,mm/m64
mm == mm/m64 NP 0F 75 /r
PCMPEQW mm,mm/m64
NP 0F 76 /r
PCMPEQD mm,mm/m64
66 0F 74 /r
Pentium 4 (SSE2) PCMPEQB xmm1,xmm2/m128
xmm1 == xmm2/m128 66 0F 75 /r
PCMPEQW xmm1,xmm2/m128
66 0F 76 /r
PCMPEQD xmm1,xmm2/m128
3.1.3.2. PCMPGTB/PCMPGTW/PCMPGTD Opcode 추가 시점 Mnemonic 형식 비고 NP 0F 64 /r
Pentium MMX PCMPGTB mm,mm/m64
mm > mm/m64 NP 0F 65 /r
PCMPGTW mm,mm/m64
NP 0F 66 /r
PCMPGTD mm,mm/m64
66 0F 64 /r
Pentium 4 (SSE2) PCMPGTB xmm1,xmm2/m128
xmm1 > xmm2/m128 66 0F 65 /r
PCMPGTW xmm1,xmm2/m128
66 0F 66 /r
PCMPGTD xmm1,xmm2/m128
3.1.4. MMX Bitwise 명령어 Opcode 추가 시점 Mnemonic 설명 비고 NP 0F DB /r
Pentium MMX PAND mm,mm/m64
mm &= mm/m64 66 0F DB /r
Pentium 4 (SSE2) PAND xmm1,xmm2/m128
xmm1 &= xmm2/m128
Opcode 추가 시점 Mnemonic 설명 비고 NP 0F DF /r
Pentium MMX PANDN mm,mm/m64
mm = ~mm & mm/m64 66 0F DF /r
Pentium 4 (SSE2) PANDN xmm1,xmm2/m128
xmm1 = ~xmm1 & xmm2/m128
Opcode 추가 시점 Mnemonic 설명 비고 NP 0F EB /r
Pentium MMX POR mm,mm/m64
mm |= mm/m64 66 0F EB /r
Pentium 4 (SSE2) POR xmm1,xmm2/m128
xmm1 |= xmm2/m128
Opcode 추가 시점 Mnemonic 설명 비고 NP 0F EF /r
Pentium MMX PXOR mm,mm/m64
mm ^= mm/m64 66 0F EF /r
Pentium 4 (SSE2) PXOR xmm1,xmm2/m128
xmm1 ^= xmm2/m128
3.1.5. MMX Shift/Rotate 명령어3.1.5.1. PSLLW/PSLLD/PSLLQ Opcode 추가 시점 Mnemonic 형식 비고 NP 0F 71 /6 ib
Pentium MMX PSLLW mm,imm8
mm <<= imm8 NP 0F 72 /6 ib
PSLLD mm,imm8
NP 0F 73 /6 ib
PSLLQ mm,imm8
NP 0F F1 /r
Pentium MMX PSLLW mm,mm/m64
mm <<= mm/m64 NP 0F F2 /r
PSLLD mm,mm/m64
NP 0F F3 /r
PSLLQ mm,mm/m64
66 0F 71 /6 ib
Pentium 4 (SSE2) PSLLW xmm1,imm8
xmm1 <<= imm8 66 0F 72 /6 ib
PSLLD xmm1,imm8
66 0F 73 /6 ib
PSLLQ xmm1,imm8
66 0F F1 /r
Pentium 4 (SSE2) PSLLW xmm1,xmm2/m128
xmm1 <<= xmm2/m128 66 0F F2 /r
PSLLD xmm1,xmm2/m128
66 0F F3 /r
PSLLQ xmm1,xmm2/m128
3.1.5.2. PSRLW/PSRLD/PSRLQ Opcode 추가 시점 Mnemonic 형식 비고 NP 0F 71 /2 ib
Pentium MMX PSRLW mm,imm8
mm >>= imm8 NP 0F 72 /2 ib
PSRLD mm,imm8
NP 0F 73 /2 ib
PSRLQ mm,imm8
NP 0F D1 /r
Pentium MMX PSRLW mm,mm/m64
mm >>= mm/m64 NP 0F D2 /r
PSRLD mm,mm/m64
NP 0F D3 /r
PSRLQ mm,mm/m64
66 0F 71 /2 ib
Pentium 4 (SSE2) PSRLW xmm1,imm8
xmm1 >>= imm8 66 0F 72 /2 ib
PSRLD xmm1,imm8
66 0F 73 /2 ib
PSRLQ xmm1,imm8
66 0F D1 /r
Pentium 4 (SSE2) PSRLW xmm1,xmm2/m128
xmm1 >>= xmm2/m128 66 0F D2 /r
PSRLD xmm1,xmm2/m128
66 0F D3 /r
PSRLQ xmm1,xmm2/m128
Opcode 추가 시점 Mnemonic 형식 비고 NP 0F 71 /4 ib
Pentium MMX PSRAW mm,imm8
mm >>= imm8 NP 0F 72 /4 ib
PSRAD mm,imm8
NP 0F E1 /r
Pentium MMX PSRAW mm,mm/m64
mm >>= mm/m64 NP 0F E2 /r
PSRAD mm,mm/m64
66 0F 71 /4 ib
Pentium 4 (SSE2) PSRAW xmm1,imm8
xmm1 >>= imm8 66 0F 72 /4 ib
PSRAD xmm1,imm8
66 0F E1 /r
Pentium 4 (SSE2) PSRAW xmm1,xmm2/m128
xmm1 >>= xmm2/m128 66 0F E2 /r
PSRAD xmm1,xmm2/m128
Opcode 추가 시점 Mnemonic 설명 비고 0F 77
Pentium MMX EMMS
Set the x87 FPU tag word to empty. x87FPUTagWord ← FFFFh
;
SSE의 초기 버전은 단정밀도(32-bit) 부동소수점만을 지원한다. (Scalar/Packed)3.2.1. SSE 메모리 관련 명령어 Opcode 추가 시점 Mnemonic 설명 비고 NP 0F 10 /r
Pentium III (SSE) MOVUPS xmm1,xmm2/m128
xmm1 = xmm2/m128 NP 0F 11 /r
Pentium III (SSE) MOVUPS xmm2/m128,xmm1
xmm2/m128 = xmm1
Opcode 추가 시점 Mnemonic 설명 비고 F3 0F 10 /r
Pentium III (SSE) MOVSS xmm1,xmm2/m32
xmm1[0] = xmm2[0]/m32 F3 0F 11 /r
Pentium III (SSE) MOVSS xmm2/m32,xmm1
xmm2[0]/m32 = xmm1[0]
3.2.3. SSE Packed Arithmetic 명령어3.2.4. SSE Comparison 명령어3.2.5. SSE Bitwise 명령어3.2.6. SSE Shuffle/Unpack 명령어 SSE2에서는 배정밀도(64-bit) 부동소수점 및 MMX 명령어 등을 지원한다.3.3.1. SSE2 메모리 관련 명령어3.3.3. SSE2 Packed Arithmetic 명령어3.3.4. SSE2 Comparison 명령어3.3.5. SSE2 Bitwise 명령어3.3.6. SSE2 Shuffle/Unpack 명령어 SSE3에서는 이전 SSE/SSE2와 달리 벡터 내의 각 항별로 다른 연산을 적용하거나(홀수번째 항은 덧셈, 짝수번째 항은 뺄셈) 한 벡터 내의 여러 항들 사이의 덧셈/뺄셈 연산을 지원해 3D 작업 등을 더 빠르게 수행할 수 있도록 하였다.