x86/명령어 목록

덤프버전 :


파일:나무위키+상위문서.png   상위 문서: x86

명령어 집합
CISC
AMD64x86 · M68K · 68xx · Z80 · 8080 · MOS 65xx · VAX
RISC
AArch64 ARM · RISC-V · MIPS · DEC Alpha · POWER PowerPC · CELL-BE
LoongArch · OpenRISC · PA-RISC · SPARC · Blackfin · SuperH · AVR32 AVR
VLIW
EPIC
E2K · IA-64 · Crusoe


x86 · AMD64 확장 명령어 집합
인텔 주도 확장 명령어
범용
APX
SIMD
MMX · SSE SSE2 · SSE3 · SSSE3 · SSE4.1 · SSE4.2 · AVX AVX2 · AVX-512 · AVX10 · AMX
AVX-512: F · CD · DQ · BW · VL · IFMA · VBMI · VBMI2 · VNNI · VAES · GFNI · BITALGVPCLMULQDQ · VPOPCNTDQ · VP2INTERSECT · BF16
(Xeon Phi): ER · PF · 4FMAPS · 4VNNIW
AVX[1]: 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! · F16C · XOP · FMA FMA4 · FMA3
비트 조작
ABM
보안 및 암호
SME
가상화 및 기타
AMD-V


1. 개요
1.1. 약어 설명
1.2. 표기법
1.2.1. 인텔 문법과 AT&T 문법
1.2.2. 16진수 및 2진수
1.3. 명령어 인코딩
1.3.1. x86 접두사
1.3.2. x86 Opcode
1.3.2.1. 1-byte opcode 목록
1.3.2.2. 2-byte 이상 opcode
1.3.3. Mod R/M
1.3.4. SIB
1.4. 레지스터
1.4.1. 범용 레지스터
1.4.2. 세그멘트 레지스터
1.4.3. 플래그 레지스터
1.4.3.1. 조건 코드
1.5. x87 FPU
1.5.1. 레지스터
1.5.2. Control Word
1.5.3. Tag Word
1.5.4. 명령어 인코딩
1.5.4.1. Format 1
1.5.4.2. Format 2
1.5.4.3. Format 3
1.5.4.4. Format 4
1.5.4.5. Format 5
1.6. MMX
1.6.1. 레지스터
1.6.2. Tag Word
1.6.3. 인코딩
2. 명령어 목록
2.1. x86 명령어
2.1.1. x86 사칙연산 명령어
2.1.1.1. ADD
2.1.1.2. ADC
2.1.1.3. SUB
2.1.1.4. SBB
2.1.1.5. NEG
2.1.1.6. CMP
2.1.1.7. MUL
2.1.1.8. IMUL
2.1.1.9. DIV
2.1.1.10. IDIV
2.1.2. x86 논리연산 명령어
2.1.2.1. AND
2.1.2.3. XOR
2.1.2.4. NOT
2.1.2.5. TEST
2.1.3. x86 Shift 명령어
2.1.3.1. ROL
2.1.3.2. ROR
2.1.3.3. RCL
2.1.3.4. RCR
2.1.3.5. SHL / SAL
2.1.3.6. SHR
2.1.3.7. SAR
2.1.3.8. SHLD
2.1.3.9. SHRD
2.1.4. x86 메모리 관련 명령어
2.1.4.1. MOV
2.1.4.1.1. MOV Sreg / MOV (seg:offset)
2.1.4.2. XCHG
2.1.4.3. CMPXCHG
2.1.4.3.1. CMPXCHG8B
2.1.4.4. PUSH
2.1.4.4.1. PUSH CS/SS/DS/ES/FS/GS
2.1.4.4.2. PUSHA/PUSHAD
2.1.4.4.3. PUSHF/PUSHFD
2.1.4.5. POP
2.1.4.5.1. POP SS/DS/ES/FS/GS
2.1.4.5.2. POPA/POPAD
2.1.4.5.3. POPF/POPFD
2.1.4.6. CBW/CWDE
2.1.4.7. CWD/CDQ
2.1.4.8. MOVZX
2.1.4.9. MOVSX
2.1.4.11. ENTER
2.1.4.12. LEAVE
2.1.4.13. BOUND
2.1.4.14. BSWAP
2.1.4.15. XADD
2.1.4.16. XLAT
2.1.4.17. LAHF
2.1.4.18. SAHF
2.1.4.19. LDS/LES/LFS/LGS/LSS
2.1.5. x86 제어/조건부 명령어
2.1.5.1. JMP
2.1.5.2. Jcc
2.1.5.2.1. JCXZ/JECXZ
2.1.5.3. CALL
2.1.5.4. RET(RETN/RETF)
2.1.5.5. LOOP/LOOPcc
2.1.5.6. INT n/INTO/INT3/INT1
2.1.5.7. IRET/IRETD
2.1.5.8. CMOVcc
2.1.5.9. SETcc
2.1.6. x86 프로세서 제어 명령어
2.1.6.1. LOCK prefix
2.1.6.2. Segment prefix
2.1.6.3. ESC
2.1.6.4. WAIT
2.1.6.5. HLT
2.1.7. x86 플래그 제어 및 기타 명령어
2.1.7.1. CLC
2.1.7.2. CMC
2.1.7.3. STC
2.1.7.4. CLD
2.1.7.5. STD
2.1.7.6. CLI
2.1.7.7. STI
2.1.7.8. CPUID
2.1.8. x86 시스템 명령어
2.1.8.1. LLDT
2.1.8.2. SLDT
2.1.8.3. LTR
2.1.8.4. STR
2.1.8.5. LGDT
2.1.8.6. SGDT
2.1.8.7. LIDT
2.1.8.8. SIDT
2.1.8.9. LMSW
2.1.8.10. SMSW
2.1.8.11. VERR
2.1.8.12. VERW
2.1.8.13. ARPL
2.1.8.16. CLTS
2.1.8.17. INVD
2.1.8.18. WBINVD
2.1.8.19. INVLPG
2.1.8.21. RDMSR
2.1.8.22. WRMSR
2.1.8.23. RDPMC
2.1.8.24. RDTSC
2.1.8.25. SYSENTER
2.1.8.26. SYSEXIT
2.1.9. x86 IO 명령어
2.1.10. 비트 조작 명령어
2.1.11. 문자열 조작 명령어
2.1.11.1. REP prefix
2.1.11.2. MOVS/MOVSB/MOVSW/MOVSD
2.1.11.3. CMPS/CMPSB/CMPSW/CMPSD
2.1.11.4. LODS/LODSB/LODSW/LODSD
2.1.11.5. SCAS/SCASB/SCASW/SCASD
2.1.11.6. STOS/STOSB/STOSW/STOSD
2.1.11.7. INS/INSB/INSW/INSD
2.1.11.8. OUTS/OUTSB/OUTSW/OUTSD
2.1.12. BCD 명령어
2.2. x87 FPU 명령어
2.2.1. x87 메모리 명령어
2.2.1.1. FLD
2.2.1.2. FST
2.2.1.3. FSTP
2.2.1.4. FXCH
2.2.1.5. FCMOVcc
2.2.1.6. FILD
2.2.1.7. FIST
2.2.1.8. FISTP
2.2.1.9. FISTTP
2.2.1.10. FBLD
2.2.1.11. FBSTP
2.2.1.12. FLD1/FLDL2T/FLDL2E/FLDPI/FLDLG2/FLDLN2/FLDZ
2.2.2. x87 사칙연산 명령어
2.2.2.1. FADD
2.2.2.2. FADDP
2.2.2.3. FSUB
2.2.2.4. FSUBP
2.2.2.5. FSUBR
2.2.2.6. FSUBRP
2.2.2.7. FMUL
2.2.2.8. FMULP
2.2.2.9. FDIV
2.2.2.10. FDIVP
2.2.2.11. FDIVR
2.2.2.12. FDIVRP
2.2.2.13. FCHS
2.2.2.14. FABS
2.2.2.15. FSQRT
2.2.2.16. FPREM
2.2.2.17. FPREM1
2.2.2.18. FRNDINT
2.2.2.19. FXTRACT
2.2.2.20. FIADD
2.2.2.21. FISUB
2.2.2.22. FISUBR
2.2.2.23. FIMUL
2.2.2.24. FIDIV
2.2.2.25. FIDIVR
2.2.3. x87 비교 명령어
2.2.3.1. FCOM/FCOMP/FCOMPP
2.2.3.2. FUCOM/FUCOMP/FUCOMPP
2.2.3.3. FICOM/FICOMP
2.2.3.4. FCOMI/FCOMIP/FUCOMI/FUCOMIP
2.2.3.5. FTST
2.2.3.6. FXAM
2.2.4. x87 특수 함수 명령어
2.2.4.1. FSIN
2.2.4.2. FCOS
2.2.4.3. FSINCOS
2.2.4.4. FPTAN
2.2.4.5. FPATAN
2.2.4.6. FYL2X
2.2.4.7. FYL2XP1
2.2.4.8. F2XM1
2.2.4.9. FSCALE
2.2.5. x87 FPU 제어 명령어
2.2.5.1. FINCSTP
2.2.5.2. FDECSTP
2.2.5.3. FFREE
2.2.5.4. FINIT/FNINIT
2.2.5.5. FCLEX/FNCLEX
2.2.5.6. FSTCW/FNSTCW
2.2.5.7. FLDCW
2.2.5.8. FSTENV/FNSTENV
2.2.5.9. FLDENV
2.2.5.10. FSAVE/FNSAVE
2.2.5.11. FRSTOR
2.2.5.12. FSTSW/FNSTSW
2.2.5.13. FNOP
2.2.5.14. FXSAVE
2.2.5.15. FXRSTOR
3. SIMD 명령어 목록
3.1. MMX 확장
3.1.1. MMX 메모리 및 변환 명령어
3.1.1.1. MOVD
3.1.1.2. MOVQ
3.1.1.3. PACKSSWB
3.1.1.4. PACKSSDW
3.1.1.5. PACKUSWB
3.1.1.6. PUNPCKHBW
3.1.1.7. PUNPCKHWD
3.1.1.8. PUNPCKHDQ
3.1.1.9. PUNPCKLBW
3.1.1.10. PUNPCKLWD
3.1.1.11. PUNPCKLDQ
3.1.2. MMX Packed Arithmetic 명령어
3.1.2.1. PADDB/PADDW/PADDD
3.1.2.2. PADDSB/PADDSW
3.1.2.3. PADDUSB/PADDUSW
3.1.2.4. PSUBB/PSUBW/PSUBD
3.1.2.5. PSUBSB/PSUBSW
3.1.2.6. PSUBUSB/PSUBUSW
3.1.2.7. PMULHW
3.1.2.8. PMULLW
3.1.2.9. PMADDWD
3.1.3. MMX Comparison 명령어
3.1.3.1. PCMPEQB/PCMPEQW/PCMPEQD
3.1.3.2. PCMPGTB/PCMPGTW/PCMPGTD
3.1.4. MMX Bitwise 명령어
3.1.4.1. PAND
3.1.4.2. PANDN
3.1.4.3. POR
3.1.4.4. PXOR
3.1.5. MMX Shift/Rotate 명령어
3.1.5.1. PSLLW/PSLLD/PSLLQ
3.1.5.2. PSRLW/PSRLD/PSRLQ
3.1.5.3. PSRAW/PSRAD
3.1.6. MMX 제어 명령어
3.1.6.1. EMMS
3.2. SSE 확장
3.2.1. SSE 메모리 관련 명령어
3.2.1.1. MOVUPS
3.2.1.2. MOVSS
3.2.1.3. MOVLPS
3.2.1.4. MOVHLPS
3.2.1.5. MOVHPS
3.2.1.6. MOVLHPS
3.2.1.7. MOVAPS
3.2.2. SSE 변환 명령어
3.2.3. SSE Packed Arithmetic 명령어
3.2.4. SSE Comparison 명령어
3.2.5. SSE Bitwise 명령어
3.2.6. SSE Shuffle/Unpack 명령어
3.2.7. 기타 SSE 명령어
3.3. SSE2 확장
3.3.1. SSE2 메모리 관련 명령어
3.3.2. SSE2 변환 명령어
3.3.3. SSE2 Packed Arithmetic 명령어
3.3.4. SSE2 Comparison 명령어
3.3.5. SSE2 Bitwise 명령어
3.3.6. SSE2 Shuffle/Unpack 명령어
3.3.7. 기타 SSE2 명령어
3.4. SSE3 확장



1. 개요[편집]


x86 아키텍처의 명령어 목록. AMD64 확장에 대해서는 다루지 않는다.


1.1. 약어 설명[편집]


  • r : 레지스터
  • m : 메모리
  • imm : 상수 (ib: 8-bit, iw: 16-bit, id: 32-bit)


1.2. 표기법[편집]



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). 여기서는 인텔 문법을 기준으로 설명한다.


1.2.2. 16진수 및 2진수[편집]


* 16진수 숫자는 뒤에
h
를 붙여서 표기한다.
* 2진수 숫자는 뒤에
b
를 붙여서 표기한다.


1.3. 명령어 인코딩[편집]


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(명령어에 인코딩되는 숫자) 값으로 명령어에 따라 선택적으로 요구한다.


1.3.1. x86 접두사[편집]


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 override
    • 36h
      (0x36): SS segment override
    • 3Eh
      (0x3E): DS segment override
    • 26h
      (0x26): ES segment override
    • 64h
      (0x64): FS segment override
    • 65h
      (0x65): GS segment override

  • Group 3: Operand-size override prefix
    • 66h
      (0x66): 명령어의 피연산자의 크기가 기본값과 다름을 나타내는 접두사이다.

  • Group 4: Address-size override prefix
    • 67h
      (0x67): 명령어가 사용하는 주소의 크기가 기본값과 다름을 나타내는 접두사이다.

이때 접두사는 각 Group에서 최대 1개씩 붙을 수 있으며 임의의 순서로 배치될 수 있으나[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

[1] "For each instruction, one prefix may be used from each of these groups and be placed in any order. Using redundant prefixes (more than one prefix from a group) is reserved and may cause unpredictable behavior.", IA-32 Intel® Architecture Software Developer’s Manual Volume 2: Instruction Set Reference(Order Number 245471-012), 2003.



1.3.2. x86 Opcode[편집]


1-byte
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
00
ADD
[2]
[3]
OR
[4]
*[5]
r/m += r
r += r/m
a += imm
r/m |= r
r |= r/m
a |= imm
10
ADC
[6]
[7]
SBB
[8]
[9]
r/m += r
r += r/m
a += imm
r/m -= r
r -= r/m
a -= imm
20
AND
[10]
DAA[i]
SUB
[11]
DAS[i]
r/m &= r
r &= r/m
a &= imm
r/m -= r
r -= r/m
a -= imm
30
XOR
[12]
AAA[i]
CMP
[13]
AAS[i]
r/m ^= r
r ^= r/m
a ^= imm
r/m - r
r - r/m
a - imm
40
INC[a]
DEC[a]
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[i]
POPAD[i]
BOUND[i]
ARPL
segment
override
size
override
PUSH
IMUL
PUSH
IMUL
INS
OUTS
FS
GS
[14]
[15]
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)[16]
TEST
XCHG
MOV
MOV
LEA
MOV
POP
r/m = r[17]
r = r/m[18]
[19]
[20]
90
NOP[21]
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[r]
LES
LDS
MOV imm
ENTER
LEAVE
RETF[r]
INT3
INT imm
INTO
IRETD
[22]
D0
SHIFT 1
SHIFT CL
AAM[i]
AAD[i]
SALC
XLAT
FPU[23]
[24]
[25]
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
[26]
CLC
STC
CLI
STI
CLD
STD
[27]
[28]
REPNE
REPE
[2] PUSH ES[3] POP ES[4] PUSH CS[5] 8086/8088에서는
POP CS
명령어로 동작하였으나, 80186부터는 사용되지 않으며 이후 2-byte 이상 opcode를 나타내는 escape로 사용된다.
[6] PUSH SS[7] POP SS[8] PUSH DS[9] POP DS[10] ES segment override prefix[i] A B C D E F G H I AMD64 확장의 64-bit 모드에서는 지원되지 않는다.[11] CS segment override prefix[12] SS segment override prefix[13] DS segment override prefix[a] A B AMD64 확장에서는 REX 접두사로 사용되는 opcode이다.[14] operand size override[15] address size override[16] (ADD/OR/ADC/SBB/AND/SUB/XOR/CMP) imm;
80+sw
로 인코딩된다. Opcode
82h
80h
와 동일하게 동작하는 것으로 보이나, 매뉴얼에는 생략되어 있다.)
[17] RISC의 store 명령어에 대응한다.[18] RISC의 load 명령어에 대응한다.[19]
mov r/m16,Sreg
, segment register의 값을 memory에 저장한다.
[20]
mov Sreg,r/m16
, memory의 값을 segment register에 불러온다.
[21]
xchg eax,eax
로 인코딩된다. Intel 64 매뉴얼 또는 AMD 매뉴얼의 경우 operand size prefix를 붙인
66 90h
(
xchg ax,ax
) 또한 NOP으로 기재되어 있으니 IA-32 매뉴얼에는 등장하지 않는다.
[r] A B 어셈블리 상에서는 RETN/RETF 구분 없이
ret
으로 사용한다.
[22] (ROL/ROR/RCL/RCR/SHL/SHR/SAR) imm[23] x87 명령어를 나타내는 escape이다.[24] (ROL/ROR/RCL/RCR/SHL/SHR/SAR) 1[25] (ROL/ROR/RCL/RCR/SHL/SHR/SAR) CL[26] (TEST/NOT/NEG/(I)MUL/(I)DIV)[27] (INC/DEC/CALL/JMP/PUSH) (Mod R/M)[28] prefix


1.3.2.1. 1-byte opcode 목록[편집]


1.3.2.2. 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[29]
i586
0F AA

CMPXCHG8B
i586
0F C7

i686
UD2[30]
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

[29] i386SL에서 도입되었으나, 전체 모델에 적용된 시점은 486 후기 및 Pentium이다.[30] Raise invalid opcode exception


1.3.3. Mod R/M[편집]


필드
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 값에 해당하는 주소를 지정한다.[31]
    • 01
      : (m) (레지스터/SIB) 값에 disp8을 더한 주소를 지정한다.
    • 10
      : (m) (레지스터/SIB) 값에 disp16/disp32를 더한 주소를 지정한다.
    • 11
      : (r) 레지스터의 값을 operand로 사용한다.
  • reg/opcode
    • 레지스터 번호 또는 일부 명령어의 경우 opcode 정보를 담고 있다.
  • r/m
    • 레지스터 번호를 나타낸다.
[31] r/m 필드의 값이
101
(ebp)인 경우 disp 값을 그대로 사용한다.


1.3.4. SIB[편집]


필드
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]


1.4. 레지스터[편집]


  • 범용 레지스터:
    • 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비트


1.4.1. 범용 레지스터[편집]


번호 / 종류
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[32]
MM0
MM1
MM2
MM3
MM4
MM5
MM6
MM7
128비트 SSE
XMM0
XMM1
XMM2
XMM3
XMM4
XMM5
XMM6
XMM7
[32] x87과 동시에 사용할 수 없다.


1.4.2. 세그멘트 레지스터[편집]


번호
레지스터
설명
비고
0
ES
Extra Segment

1
CS
Code Segment

2
SS
Stack Segment

3
DS
Data Segment

4
FS

80386에서 추가
5
GS

80386에서 추가
[각주]

1.4.3. 플래그 레지스터[편집]


  • 상태 플래그
    • CF(0): Carry Flag
    • PF(2): Parity Flag
    • AF(4): Auxiliary Carry Flag
    • ZF(6): Zero Flag
    • SF(7): Sign Flag
  • 제어 플래그
    • DF(10): Direction 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
[각주]

1.4.3.1. 조건 코드[편집]

조건 코드는 상태 플래그의 값에 따라 동작을 수행하는 데 사용되는 코드로, 총 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
[각주]


1.5. x87 FPU[편집]



1.5.1. 레지스터[편집]


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
[각주]

1.5.3. Tag Word[편집]


16-bit tag word는 x87 FPU의 8개 레지스터 각각의 내용을 나타낸다. (레지스터당 2-bit 태그)
  • 00
    — Valid
  • 01
    — Zero
  • 10
    — Special: Invalid (NaN, unsupported), infinity, or denormal
  • 11
    — Empty
[각주]

1.5.4. 명령어 인코딩[편집]


인코딩 포맷
First Byte
Second Byte
15-11
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
[각주]

1.5.4.1. 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

[33]
00

11

FNSTCW

8087
FNSTCW m2byte

D9 /7

[34]
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

[35]
10

11

FNSTSW

8087
FNSTSW m2byte

DD /7

[36]
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


[33]
FSTENV
명령어는 앞에
9B
(
WAIT
) 명령어가 추가되어 인코딩된다.
[34]
FSTCW
명령어는 앞에
9B
(
WAIT
) 명령어가 추가되어 인코딩된다.
[35]
FSAVE
명령어는 앞에
9B
(
WAIT
) 명령어가 추가되어 인코딩된다.
[36]
FSTSW
명령어는 앞에
9B
(
WAIT
) 명령어가 추가되어 인코딩된다.


1.5.4.2. 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


[각주]

1.5.4.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

[37]
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


[37]
FSTSW
명령어는 앞에
9B
(
WAIT
) 명령어가 추가되어 인코딩된다.

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


[각주]

1.5.4.4. 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

110

FCOS

80387
FCOS

D9 FF


[각주]

1.5.4.5. 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

[38]
00

011

FNINIT

8087
FNINIT

DB E3

[39]
00

100

FSETPM287_NOP

8087
FSETPM287_NOP

DB E4

32-bit x87 FPU에서는 NOP으로 다뤄짐
[38]
FCLEX
명령어는 앞에
9B
(
WAIT
) 명령어가 추가되어 인코딩된다.
[39]
FINIT
명령어는 앞에
9B
(
WAIT
) 명령어가 추가되어 인코딩된다.



1.6. MMX[편집]



1.6.1. 레지스터[편집]


x87 FPU 레지스터(R0-R7)의 하위 64비트를 MMX 레지스터(MM0-MM7)로 사용한다.


1.6.2. Tag Word[편집]


각 MMX 명령어가 실행되면 x87 FPU tag word 전체가 valid(
00b
)로 설정된다. EMMS(Empty MMX State) 명령어는 x87 FPU tag word 전체를 empty(
11b
)로 설정한다.
[각주]

1.6.3. 인코딩[편집]


  • 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. x86 명령어 [편집]



2.1.1. x86 사칙연산 명령어[편집]



2.1.1.1. ADD[편집]

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


[각주]

2.1.1.1.1. INC[편집]

Opcode
추가 시점
Mnemonic
형식
비고
40+rw
[40]
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


[40] AMD64 확장에서 해당 opcode는 REX 접두사를 인코딩하는 데 사용된다.


2.1.1.2. ADC[편집]

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


[각주]

2.1.1.3. SUB[편집]

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


[각주]

2.1.1.3.1. DEC[편집]

Opcode
추가 시점
Mnemonic
형식
비고
48+rw
[41]
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


[41] AMD64 확장에서 해당 opcode는 REX 접두사를 인코딩하는 데 사용된다.


2.1.1.4. SBB[편집]

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


[각주]

2.1.1.5. NEG[편집]

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


[각주]

2.1.1.6. CMP[편집]

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
연산을 수행 후 결과값을 레지스터에 저장하지 않고 플래그만 설정하는 명령어이다.
[각주]

2.1.1.7. MUL[편집]

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);


[각주]

2.1.1.8. IMUL[편집]

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);


[각주]

2.1.1.9. DIV[편집]

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);


[각주]

2.1.1.10. IDIV[편집]

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 논리연산 명령어[편집]



2.1.2.1. AND[편집]

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


[각주]

2.1.2.2. OR[편집]

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


[각주]

2.1.2.3. XOR[편집]

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


[각주]

2.1.2.4. NOT[편집]

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


[각주]

2.1.2.5. TEST[편집]

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에 인코딩된 것이 특징이다.

2.1.3.1. ROL[편집]

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



[각주]

2.1.3.2. ROR[편집]

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



[각주]

2.1.3.3. RCL[편집]

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



[각주]

2.1.3.4. RCR[편집]

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



[각주]

2.1.3.5. SHL / SAL[편집]

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
명령어는 동일한 연산을 수행한다.
[각주]

2.1.3.6. SHR[편집]

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


[각주]

2.1.3.7. SAR[편집]

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


[각주]

2.1.3.8. SHLD[편집]

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


[각주]

2.1.3.9. SHRD[편집]

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 메모리 관련 명령어[편집]



2.1.4.1. MOV[편집]

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


[각주]

2.1.4.2. XCHG[편집]

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


[각주]

2.1.4.3. CMPXCHG[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F B0 /r

80486
CMPXCHG r/m8,r8

[42]

0F B1 /r

80486
CMPXCHG r/m16,r16

[43]
32-bit 모드에서는
66h
접두사 필요
CMPXCHG r/m32,r32

[44]

LOCK 접두사와 함께 사용하는 경우 원자적으로 실행된다.
[42] Compare AL with r/m8. If equal, ZF is set and r8 is loaded into r/m8. Else, clear ZF and load r/m8 into AL.[43] Compare AX with r/m16. If equal, ZF is set and r16 is loaded into r/m16. Else, clear ZF and load r/m16 into AX.[44] Compare EAX with r/m32. If equal, ZF is set and r32 is loaded into r/m32. Else, clear ZF and load r/m32 into AX.


2.1.4.3.1. CMPXCHG8B[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F C7 /1 m64

Pentium
CMPXCHG8B m64

[45]
레지스터 operand는 허용되지 않는다.[46]
LOCK 접두사와 함께 사용하는 경우 원자적으로 실행된다.
[45] Compare EDX:EAX with m64. If equal, set ZF and load ECX:EBX into m64. Else, clear ZF and load m64 into EDX:EAX.[46] 레지스터 operand 사용 시 예외를 발생시킨다. 그러나 LOCK 접두사와 함께 레지스터 operand를 사용하는 경우 프로세서에 따라 LOCK 접두사가 실행되어 예외 처리 과정이 정상적으로 작동하지 않아 프로세서가 뻗어버리는(!) 버그가 발생하기도 한다. 펜티엄 문서에서 언급된 F00F 버그가 이에 해당한다. 문제의 명령어는
lock cmpxchg8b eax
(
F0 0F C7 C8
))


2.1.4.4. PUSH[편집]

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


2.1.4.4.2. PUSHA/PUSHAD[편집]

Opcode
추가 시점
Mnemonic
설명
비고
60

80186
PUSHA

[47]
32-bit 모드에서는
66h
접두사 필요
80386
PUSHAD

[48]


2.1.4.4.3. PUSHF/PUSHFD [편집]

Opcode
추가 시점
Mnemonic
형식
비고
9C

8086/8088
PUSHF

*--SP = FLAGS
32-bit 모드에서는
66h
접두사 필요
80386
PUSHFD

*--SP = EFLAGS

[47] 16-bit 범용 레지스터 전체를 번호 오름차순으로 스택에 push한다. AMD64 확장의 64-bit 모드에서는 지원되지 않는다.[48] 32-bit 범용 레지스터 전체를 번호 오름차순으로 스택에 push한다. AMD64 확장의 64-bit 모드에서는 지원되지 않는다.


2.1.4.5. POP[편집]

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



2.1.4.5.1. POP SS/DS/ES/FS/GS[편집]

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
를 변경할 때까지 인터럽트를 억제시킨다.

2.1.4.5.2. POPA/POPAD[편집]

Opcode
추가 시점
Mnemonic
설명
비고
61

80186
POPA

[49]
32-bit 모드에서는
66h
접두사 필요
80386
POPAD

[50]


2.1.4.5.3. POPF/POPFD [편집]

Opcode
추가 시점
Mnemonic
형식
비고
9D

8086/8088
POPF

FLAGS = *SP++
32-bit 모드에서는
66h
접두사 필요
80386
POPFD

EFLAGS = *SP++

[49] 16-bit 범용 레지스터 전체를 번호 내림차순으로 스택으로부터 pop한다. AMD64 확장의 64-bit 모드에서는 지원되지 않는다.[50] 32-bit 범용 레지스터 전체를 번호 내림차순으로 스택으로부터 pop한다. AMD64 확장의 64-bit 모드에서는 지원되지 않는다.


2.1.4.6. CBW/CWDE[편집]

Opcode
추가 시점
Mnemonic
설명
비고
98

8086/8088
CBW

AX ← sign-extend of AL
32-bit 모드에서는
66h
접두사 필요
80386
CWDE

EAX ← sign-extend of AX

[각주]

2.1.4.7. CWD/CDQ[편집]

Opcode
추가 시점
Mnemonic
설명
비고
99

8086/8088
CWD

DX:AX ← sign-extend of AX
32-bit 모드에서는
66h
접두사 필요
80386
CDQ

EDX:EAX ← sign-extend of EAX

[각주]

2.1.4.8. MOVZX[편집]

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

[각주]

2.1.4.9. MOVSX[편집]

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

[각주]

2.1.4.10. LEA[편집]

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 레지스터에 저장된다.
[각주]

2.1.4.11. ENTER[편집]

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

[51]
16-bit 모드 또는
66h
접두사 사용 시 스택에서
BP
레지스터 값에 대한 push를 수행하고, 32-bit 모드에서는
EBP
레지스터 값에 대한 push를 수행한다.
[51] Nesting level에는 imm8을 32로 나눈 나머지 값(0-31)이 사용됨


2.1.4.12. LEAVE[편집]

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을 수행한다.
[각주]

2.1.4.13. BOUND[편집]

Opcode
추가 시점
Mnemonic
설명
비고
62 /r

80186
BOUND r16,m16&16


32-bit 모드에서는
66h
접두사 필요
80386
BOUND r32,m32&32



[각주]

2.1.4.14. BSWAP[편집]

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
)
[각주]

2.1.4.15. XADD[편집]

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 접두사와 함께 사용하는 경우 원자적으로 실행된다.
[각주]

2.1.4.16. XLAT[편집]

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]
을 사용한다.
[각주]

2.1.4.17. LAHF[편집]

Opcode
추가 시점
Mnemonic
설명
비고
9F

8086/8088
LAHF

Load: AH ← EFLAGS(SF:ZF:0:AF:0:PF:1:CF)

[각주]

2.1.4.18. SAHF[편집]

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 제어/조건부 명령어[편집]



2.1.5.1. JMP[편집]

Opcode
추가 시점
Mnemonic
설명
비고
EB cb

8086/8088
JMP rel8

Jump short, relative

E9 cw

8086/8088
JMP rel16

Jump near, relative
32-bit 모드에서는
66h
접두사 필요[jmp-ip]
E9 cd

80386
JMP rel32


EA cd

8086/8088
JMP ptr16:16

Jump far, absolute
32-bit 모드에서는
66h
접두사 필요[jmp-ip]
EA cp

80386
JMP ptr16:32


FF /4

8086/8088
JMP r/m16

Jump near, absolute indirect
32-bit 모드에서는
66h
접두사 필요[jmp-ip]
80386
JMP r/m32


FF /5

8086/8088
JMP m16:16

Jump far, absolute indirect
32-bit 모드에서는
66h
접두사 필요[jmp-ip]
80386
JMP m16:32



2.1.5.2. Jcc[편집]

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
접두사 필요[jcc-ip]
0F 80+cc cd

80386
Jcc rel32



2.1.5.2.1. JCXZ/JECXZ[편집]

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

[jmp-ip] A B C D 이때 ip는 16-bit로 간주되어 eip의 상위 16-bit가 비워진다.[jcc-ip] 이때 ip는 16-bit로 간주되어 eip의 상위 16-bit가 비워진다.


2.1.5.3. CALL[편집]

Opcode
추가 시점
Mnemonic
설명
비고
E8 cw

8086/8088
CALL rel16

Call near, relative
32-bit 모드에서는
66h
접두사 필요[call-ip]
E8 cd

80386
CALL rel32


9A cd

8086/8088
CALL ptr16:16

Call far, absolute
32-bit 모드에서는
66h
접두사 필요[call-ip]
9A cp

80386
CALL ptr16:32


FF /2

8086/8088
CALL r/m16

Call near, absolute indirect
32-bit 모드에서는
66h
접두사 필요[call-ip]
80386
CALL r/m32


FF /3

8086/8088
CALL m16:16

Call far, absolute indirect
32-bit 모드에서는
66h
접두사 필요[call-ip]
80386
CALL m16:32


[call-ip] A B C D 이때 ip는 16-bit로 간주되어 eip의 상위 16-bit가 비워진다.


2.1.5.4. RET(RETN/RETF)[편집]

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
가 사용된다.
[각주]

2.1.5.5. LOOP/LOOPcc[편집]

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


[52]
[52] 2018년까지 문서화되지 않음


2.1.5.7. IRET/IRETD[편집]

Opcode
추가 시점
Mnemonic
설명
비고
CF

8086/8088
IRET

Interrupt return
32-bit 모드에서는
66h
접두사 필요
80386
IRETD


[각주]

2.1.5.8. CMOVcc[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F 40+cc /r

Pentium Pro
CMOVcc r16, r/m16

Move if (condition)
32-bit 모드에서는
66h
접두사 필요
CMOVcc r32, r/m32


[각주]

2.1.5.9. SETcc[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F 90+cc

80386
SETcc r/m8

Set byte if (condition)

[각주]

2.1.6. x86 프로세서 제어 명령어[편집]



2.1.6.1. LOCK prefix[편집]

Opcode
추가 시점
Mnemonic
해당 명령어
설명
비고
F0

8086/8088
LOCK

[53]
[54]
[55]
[53] ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG, CMPXCH8B, DEC, INC, NEG, NOT, OR, SBB, SUB, XOR, XADD, XCHG.[54] Asserts LOCK# signal for duration of the accompanying instruction[55] destination operand가 memory인 경우에만 사용 가능


2.1.6.2. Segment prefix[편집]

메모리 세그멘트를 지정하는 접두사이다.
  • 2Eh
    (0x2E): CS segment override
  • 36h
    (0x36): SS segment override
  • 3Eh
    (0x3E): DS segment override
  • 26h
    (0x26): ES segment override
  • 64h
    (0x64): FS segment override
  • 65h
    (0x65): GS segment override


2.1.6.3. ESC[편집]

Opcode
추가 시점
Mnemonic
비고
D8..DF

8086/8088

외부 장치(x87 FPU)에 접근하는 명령어이다.
x87 섹션 참조.
[각주]

2.1.6.4. WAIT[편집]

Opcode
추가 시점
Mnemonic
설명
비고
9B

8086/8088
WAIT

FWAIT

Check pending unmasked floating-point exceptions.

[각주]

2.1.6.5. HLT[편집]

Opcode
추가 시점
Mnemonic
설명
비고
F4

8086/8088
HLT

Halt

인터럽트 또는 특정한 신호가 활성화될 때까지 명령어의 실행을 멈추고 프로세서를 HALT 상태로 둔다. 하이퍼쓰레딩이 활성화된 경우 해당 명령어를 실행한 논리 프로세서만이 비활성화되고, 같은 코어에 존재하는 다른 논리 프로세서에는 적용되지 않는다.
[각주]

2.1.7. x86 플래그 제어 및 기타 명령어[편집]



2.1.7.1. CLC[편집]

Opcode
추가 시점
Mnemonic
설명
비고
F8

8086/8088
CLC

Clear carry
CF = 0
[각주]

2.1.7.2. CMC[편집]

Opcode
추가 시점
Mnemonic
설명
비고
F5

8086/8088
CMC

Complement carry
CF = ~CF
[각주]

2.1.7.3. STC[편집]

Opcode
추가 시점
Mnemonic
설명
비고
F9

8086/8088
STC

Set carry
CF = 1
[각주]

2.1.7.4. CLD[편집]

Opcode
추가 시점
Mnemonic
설명
비고
FC

8086/8088
CLC

Clear direction
DF = 0
[각주]

2.1.7.5. STD[편집]

Opcode
추가 시점
Mnemonic
설명
비고
FD

8086/8088
STD

Set direction
DF = 1
[각주]

2.1.7.6. CLI[편집]

Opcode
추가 시점
Mnemonic
설명
비고
FA

8086/8088
CLI

Clear interrupt
IF = 0
[각주]

2.1.7.7. STI[편집]

Opcode
추가 시점
Mnemonic
설명
비고
FB

8086/8088
STI

Set interrupt
IF = 1
[각주]

2.1.7.8. CPUID[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F A2

Pentium
CPUID

CPU Identification

EAX 레지스터 값에 따라 EAX, EBX, ECX, EDX 레지스터에 프로세서 정보를 반환한다.
[각주]

2.1.8. x86 시스템 명령어[편집]



2.1.8.1. LLDT[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F 00 /2

80286
LLDT r/m16

Load segment selector r/m16 into LDTR

[각주]

2.1.8.2. SLDT[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F 00 /0

80286
SLDT r/m16

Stores segment selector from LDTR in r/m16
[56]
80386
SLDT r32

Stores segment selector from LDTR in low-order 16 bits of r32

[56] 16-bit 레지스터 지정시 32-bit 모드에서는
66h
접두사 필요


2.1.8.3. LTR[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F 00 /3

80286
LTR r/m16

Load r/m16 into task register

[각주]

2.1.8.4. STR[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F 00 /1

80286
STR r/m16

Stores segment selector from TR in r/m16

[각주]

2.1.8.5. LGDT[편집]

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으로 간주).
[각주]

2.1.8.6. SGDT[편집]

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) 값이 기록된다.
[각주]

2.1.8.7. LIDT[편집]

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으로 간주).
[각주]

2.1.8.8. SIDT[편집]

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) 값이 기록된다.
[각주]

2.1.8.9. LMSW[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F 01 /6

80286
LMSW r/m16

Loads r/m16 in machine status word of CR0

[각주]

2.1.8.10. SMSW[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F 01 /4

80286
SMSW r/m16

Store machine status word to r/m16
32-bit 모드에서는
66h
접두사 필요
80386
SMSW r32/m16

[57]

[57] Store machine status word in low-order 16 bits of r32/m16; high-order 16 bits of r32 are undefined


2.1.8.11. VERR[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F 00 /4

80286
VERR r/m16

Set ZF=1 if segment specified with r/m16 can be read

[각주]

2.1.8.12. VERW[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F 00 /5

80286
VERW r/m16

Set ZF=1 if segment specified with r/m16 can be written

[각주]

2.1.8.13. ARPL[편집]

Opcode
추가 시점
Mnemonic
설명
비고
63 /r

80286
ARPL r/m16,r16

Adjust RPL of r/m16 to not less than RPL of r16

[각주]

2.1.8.14. LAR[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F 02 /r

80286
LAR r16,r/m16


32-bit 모드에서는
66h
접두사 필요
80386
LAR r32,r/m32




2.1.8.15. LSL[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F 03 /r

80286
LSL r16,r/m16


32-bit 모드에서는
66h
접두사 필요
80386
LSL r32,r/m32




2.1.8.16. CLTS[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F 06

80286
CLTS

Clears TS flag in CR0


2.1.8.17. INVD[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F 08

80486
INVD

[58]

내부 캐시에만 존재하고 메모리에 기록되지 않은 데이터는 사라지므로
WBINVD
명령어를 사용하는 것이 좋다.
[58] Flush internal caches; initiate flushing of external caches.


2.1.8.18. WBINVD[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F 09

80486
WBINVD

[59]

[59] Write back and flush Internal caches; initiate writing-back and flushing of external caches.


2.1.8.19. INVLPG[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F 01 /7

80486
INVLPG m

Invalidate TLB Entry for page that contains m

[각주]

2.1.8.20. RSM[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F AA

i386SL[60]
RSM

Resume operation of interrupted program

[60] i386SL/i486SL/후기 486 및 Pentium 이후 프로세서에서 지원된다.


2.1.8.21. RDMSR[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F 32

Pentium
RDMSR

Load MSR specified by ECX into EDX:EAX

[각주]

2.1.8.22. WRMSR[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F 30

Pentium
WRMSR

Write the value in EDX:EAX to MSR specified by ECX

[각주]

2.1.8.23. RDPMC[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F 33

Pentium MMX
RDPMC

[61]

[61] Read performance-monitoring counter specified by ECX into EDX:EAX


2.1.8.24. RDTSC[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F 31

Pentium
RDTSC

Read time-stamp counter into EDX:EAX

[각주]

2.1.8.25. SYSENTER[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F 34

Pentium Pro
SYSENTER

Fast call to privilege level 0 system procedures

[각주]

2.1.8.26. SYSEXIT[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F 35

Pentium Pro
SYSEXIT

Fast return to privilege level 3 user code.

[각주]

2.1.9. x86 IO 명령어[편집]



2.1.9.1. IN[편집]

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

[각주]

2.1.9.2. OUT[편집]

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

[각주]

2.1.10. 비트 조작 명령어[편집]



2.1.10.1. BT[편집]

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


[각주]

2.1.10.2. BTS[편집]

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


[각주]

2.1.10.3. BTR[편집]

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


[각주]

2.1.10.4. BTC[편집]

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


[각주]

2.1.10.5. BSF[편집]

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를 찾아 그 위치를 저장한다.
[각주]

2.1.10.6. BSR[편집]

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를 찾아 그 위치를 저장한다.
[각주]

2.1.11. 문자열 조작 명령어[편집]



2.1.11.1. REP prefix[편집]

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

[62]

A5

8086/8088
MOVS m16,m16

MOVSW

[63]
32-bit 모드에서는
66h
접두사 필요
80386
MOVS m32,m32

MOVSD

[64]

[62] Move byte at address DS:(E)SI to address ES:(E)DI[63] Move word at address DS:(E)SI to address ES:(E)DI[64] Move doubleword at address DS:(E)SI to address ES:(E)DI


2.1.11.3. CMPS/CMPSB/CMPSW/CMPSD[편집]

Opcode
추가 시점
Mnemonic
설명
비고
A6

8086/8088
CMPS m8,m8

CMPSB

[65]

A7

8086/8088
CMPS m16,m16

CMPSW

[66]
32-bit 모드에서는
66h
접두사 필요
80386
CMPS m32,m32

CMPSD

[67]

[65] Compares byte at address DS:(E)SI with byte at address ES:(E)DI and sets the status flags accordingly[66] Compares word at address DS:(E)SI with word at address ES:(E)DI and sets the status flags accordingly[67] Compares doubleword at address DS:(E)SI with doubleword at address ES:(E)DI and sets the status flags accordingly


2.1.11.4. LODS/LODSB/LODSW/LODSD[편집]

Opcode
추가 시점
Mnemonic
설명
비고
AC

8086/8088
LODS m8

LODSB

[68]

AD

8086/8088
LODS m16

LODSW

[69]
32-bit 모드에서는
66h
접두사 필요
80386
LODS m32

LODSD

[70]

[68] Load byte at address DS:(E)SI into AL[69] Load word at address DS:(E)SI into AX[70] Load doubleword at address DS:(E)SI into EAX


2.1.11.5. SCAS/SCASB/SCASW/SCASD[편집]

Opcode
추가 시점
Mnemonic
설명
비고
AE

8086/8088
SCAS m8

SCASB

[71]

AF

8086/8088
SCAS m16

SCASW

[72]
32-bit 모드에서는
66h
접두사 필요
80386
SCAS m32

SCASD

[73]

[71] Compare AL with byte at ES:(E)DI and set status flags[72] Compare AX with word at ES:(E)DI and set status flags[73] Compare EAX with doubleword at ES(E)DI and set status flags


2.1.11.6. STOS/STOSB/STOSW/STOSD[편집]

Opcode
추가 시점
Mnemonic
설명
비고
AA

8086/8088
STOS m8

STOSB

[74]

AB

8086/8088
STOS m16

STOSW

[75]
32-bit 모드에서는
66h
접두사 필요
80386
STOS m32

STOSD

[76]

[74] Store AL at address ES:(E)DI[75] Store AX at address ES:(E)DI[76] Store EAX at address ES:(E)DI


2.1.11.7. INS/INSB/INSW/INSD[편집]

Opcode
추가 시점
Mnemonic
설명
비고
6C

80186
INS m8,dx

INSB

[77]

6D

80186
INS m16,dx

INSW

[78]
32-bit 모드에서는
66h
접두사 필요
80386
INS m32,dx

INSD

[79]

[77] Input byte from I/O port specified in DX into memory location specified in ES:(E)DI[78] Input word from I/O port specified in DX into memory location specified in ES:(E)DI[79] Input doubleword from I/O port specified in DX into memory location specified in ES:(E)DI


2.1.11.8. OUTS/OUTSB/OUTSW/OUTSD[편집]

Opcode
추가 시점
Mnemonic
설명
비고
6E

80186
OUTS dx,m8

OUTSB

[80]

6F

80186
OUTS dx,m16

OUTSW

[81]
32-bit 모드에서는
66h
접두사 필요
80386
OUTS dx,m32

OUTSD

[82]

[80] Output byte from memory location specified in DS:(E)SI to I/O port specified in DX[81] Output word from memory location specified in DS:(E)SI to I/O port specified in DX[82] Output doubleword from memory location specified in DS:(E)SI to I/O port specified in DX


2.1.12. BCD 명령어[편집]



2.1.12.1. AAA[편집]

Opcode
추가 시점
Mnemonic
설명
비고
37

8086/8088
AAA

ASCII adjust AL after addition

[각주]

2.1.12.2. AAS[편집]

Opcode
추가 시점
Mnemonic
설명
비고
3F

8086/8088
AAS

ASCII adjust AL after subtraction

[각주]

2.1.12.3. AAM[편집]

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

[각주]

2.1.12.4. AAD[편집]

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

[각주]

2.1.12.5. DAA[편집]

Opcode
추가 시점
Mnemonic
설명
비고
27

8086/8088
DAA

Decimal adjust AL after addition

예:
79h
+
35h
=
AEh
14h
(DAA)
[각주]

2.1.12.6. DAS[편집]

Opcode
추가 시점
Mnemonic
설명
비고
2F

8086/8088
DAS

Decimal adjust AL after subtraction

예:
35h
-
47h
=
EEh
88h
(DAS)
[각주]

2.2. x87 FPU 명령어 [편집]



2.2.1. x87 메모리 명령어[편집]



2.2.1.1. FLD[편집]

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))

[각주]

2.2.1.2. FST[편집]

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)

[각주]

2.2.1.3. FSTP[편집]

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()
[83]
[83]
DF D0+i
등 비공식적인 opcode가 존재한다.


2.2.1.4. FXCH[편집]

Opcode
추가 시점
Mnemonic
설명
비고
D9 C8+i

8087
FXCH st(i)

st(0) <-> st(i)
[84]
D9 C9

FXCH

st(0) <-> st(1)

[84]
DD C8+i
등 비공식적인 opcode가 존재한다.


2.2.1.5. FCMOVcc[편집]

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
레지스터에 있는 상태 플래그의 값에 따라 이동 연산을 수행한다.
[각주]

2.2.1.6. FILD[편집]

Opcode
추가 시점
Mnemonic
설명
비고
DF /0

8087
FILD m16int

PUSH(m16int)

DB /0

FILD m32int

PUSH(m32int)

DF /5

8087
FILD m64int

PUSH(m64int)

[각주]

2.2.1.7. FIST[편집]

Opcode
추가 시점
Mnemonic
설명
비고
DF /2

8087
FIST m16int

m16int = st(0)

DB /2

FIST m32int

m32int = st(0)

[각주]

2.2.1.8. FISTP[편집]

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()

[각주]

2.2.1.9. FISTTP[편집]

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()

[각주]

2.2.1.10. FBLD[편집]

Opcode
추가 시점
Mnemonic
설명
비고
DF /4

8087
FBLD m80bcd

PUSH(m80bcd)

[각주]

2.2.1.11. FBSTP[편집]

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 사칙연산 명령어[편집]



2.2.2.1. FADD[편집]

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)

[각주]

2.2.2.2. FADDP[편집]

Opcode
추가 시점
Mnemonic
설명
비고
DE C0+i

8087
FADDP st(i), st(0)

st(i) += st(0); POP()

DE C1

FADDP

st(1) += st(0); POP()

[각주]

2.2.2.3. FSUB[편집]

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)

[각주]

2.2.2.4. FSUBP[편집]

Opcode
추가 시점
Mnemonic
설명
비고
DE E8+i

8087
FSUBP st(i), st(0)

st(i) -= st(0); POP()

DE E9

FSUBP

st(1) -= st(0); POP()

[각주]

2.2.2.5. FSUBR[편집]

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)

[각주]

2.2.2.6. FSUBRP[편집]

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()

[각주]

2.2.2.7. FMUL[편집]

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)

[각주]

2.2.2.8. FMULP[편집]

Opcode
추가 시점
Mnemonic
설명
비고
DE C8+i

8087
FMULP st(i), st(0)

st(i) *= st(0); POP()

DE C9

FMULP

st(1) *= st(0); POP()

[각주]

2.2.2.9. FDIV[편집]

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)

[각주]

2.2.2.10. FDIVP[편집]

Opcode
추가 시점
Mnemonic
설명
비고
DE F8+i

8087
FDIVP st(i), st(0)

st(i) /= st(0); POP()

DE F9

FDIVP

st(1) /= st(0); POP()

[각주]

2.2.2.11. FDIVR[편집]

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)

[각주]

2.2.2.12. FDIVRP[편집]

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()

[각주]

2.2.2.13. FCHS[편집]

Opcode
추가 시점
Mnemonic
설명
비고
D9 E0

8087
FCHS

st(0) = -st(0)

[각주]

2.2.2.14. FABS[편집]

Opcode
추가 시점
Mnemonic
설명
비고
D9 E1

8087
FABS

Replace ST(0) with its absolute value.

[각주]

2.2.2.15. FSQRT[편집]

Opcode
추가 시점
Mnemonic
설명
비고
D9 FA

8087
FABS

Computes square root of ST(0) and stores the result in ST(0).

[각주]

2.2.2.16. FPREM[편집]

Opcode
추가 시점
Mnemonic
설명
비고
D9 F8

8087
FPREM

st(0) −= (Q ∗ st(1))
Truncate
[각주]

2.2.2.17. FPREM1[편집]

Opcode
추가 시점
Mnemonic
설명
비고
D9 F5

80387
FPREM1

st(0) −= (Q ∗ st(1))
Round to nearest (IEEE-754 compliant)
[각주]

2.2.2.18. FRNDINT[편집]

Opcode
추가 시점
Mnemonic
설명
비고
D9 FC

8087
FRNDINT

Round ST(0) to an integer.

[각주]

2.2.2.19. FXTRACT[편집]

Opcode
추가 시점
Mnemonic
설명
비고
D9 F4

8087
FXTRACT

st(0) = Exponent(ST), PUSH(Significand(ST))

[각주]

2.2.2.20. FIADD[편집]

Opcode
추가 시점
Mnemonic
설명
비고
DA /0

8087
FIADD m32int

st(0) += m32int

DE /0

FIADD m16int

st(0) += m16int

[각주]

2.2.2.21. FISUB[편집]

Opcode
추가 시점
Mnemonic
설명
비고
DA /4

8087
FISUB m32int

st(0) -= m32int

DE /4

FISUB m16int

st(0) -= m16int

[각주]

2.2.2.22. FISUBR[편집]

Opcode
추가 시점
Mnemonic
설명
비고
DA /5

8087
FISUBR m32int

st(0) = m32int - st(0)

DE /5

FISUBR m16int

st(0) = m16int - st(0)

[각주]

2.2.2.23. FIMUL[편집]

Opcode
추가 시점
Mnemonic
설명
비고
DA /1

8087
FIMUL m32int

st(0) *= m32int

DE /1

FIMUL m16int

st(0) *= m16int

[각주]

2.2.2.24. FIDIV[편집]

Opcode
추가 시점
Mnemonic
설명
비고
DA /6

8087
FIDIV m32int

st(0) /= m32int

DE /6

FIDIV m16int

st(0) /= m16int

[각주]

2.2.2.25. FIDIVR[편집]

Opcode
추가 시점
Mnemonic
설명
비고
DA /7

8087
FIDIVR m32int

st(0) = m32int / st(0)

DE /7

FIDIVR m16int

st(0) = m16int / st(0)

[각주]

2.2.3. x87 비교 명령어[편집]



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).
[85]
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.
[86]
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.

[85]
DC D0+i
등 비공식적인 opcode가 존재한다.
[86]
DC D8+i
,
DE D0+i
등 비공식적인 opcode가 존재한다.


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

[각주]

2.2.3.3. FICOM/FICOMP[편집]

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)

[87]

DF F0+i

Pentium Pro
FCOMIP st(0),st(i)

[88]

DB E8+i

Pentium Pro
FUCOMI st(0),st(i)

[89]

DF E8+i

Pentium Pro
FUCOMIP st(0),st(i)

[90]

[87] Compare ST(0) with ST(i) and set status flags accordingly[88] Compare ST(0) with ST(i), set status flags accordingly, and pop register stack[89] Compare ST(0) with ST(i), check for ordered values, and set status flags accordingly[90] Compare ST(0) with ST(i), check for ordered values, set status flags accordingly, and pop register stack


2.2.3.5. FTST[편집]

Opcode
추가 시점
Mnemonic
설명
비고
D9 E4

8087
FTST

Compare ST(0) with 0.0.

[각주]

2.2.3.6. FXAM[편집]

Opcode
추가 시점
Mnemonic
설명
비고
D9 E5

8087
FXAM

Classify value or number in ST(0)

[각주]

2.2.4. x87 특수 함수 명령어[편집]



2.2.4.1. FSIN[편집]

Opcode
추가 시점
Mnemonic
설명
비고
D9 FE

80387
FSIN

Replace ST(0) with its sine.

[각주]

2.2.4.2. FCOS[편집]

Opcode
추가 시점
Mnemonic
설명
비고
D9 FF

80387
FCOS

Replace ST(0) with its cosine

[각주]

2.2.4.3. FSINCOS[편집]

Opcode
추가 시점
Mnemonic
설명
비고
D9 FB

80387
FSINCOS

[91]

[91] Compute the sine and cosine of ST(0); replace ST(0) with the sine, and push the cosine onto the register stack.


2.2.4.4. FPTAN[편집]

Opcode
추가 시점
Mnemonic
설명
비고
D9 F2

8087
FPTAN

Replace ST(0) with its tangent and push 1 onto the FPU stack.

[각주]

2.2.4.5. FPATAN[편집]

Opcode
추가 시점
Mnemonic
설명
비고
D9 F3

8087
FPATAN

Replace ST(1) with arctan(ST(1)/ST(0)) and pop the register stack

[각주]

2.2.4.6. FYL2X[편집]

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

[각주]

2.2.4.7. FYL2XP1[편집]

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

[각주]

2.2.4.8. F2XM1[편집]

Opcode
추가 시점
Mnemonic
설명
비고
D9 F0

8087
F2XM1

Replace [math(\textrm{ST}(0))] with [math(2^{\textrm{ST}(0)} – 1)]

[각주]

2.2.4.9. FSCALE[편집]

Opcode
추가 시점
Mnemonic
설명
비고
D9 FD

8087
FSCALE

Scale ST(0) by ST(1).

[각주]

2.2.5. x87 FPU 제어 명령어[편집]



2.2.5.1. FINCSTP[편집]

Opcode
추가 시점
Mnemonic
설명
비고
D9 F7

8087
FINCSTP

Increment the TOP field in the FPU status register

[각주]

2.2.5.2. FDECSTP[편집]

Opcode
추가 시점
Mnemonic
설명
비고
D9 F6

8087
FDECSTP

Decrement TOP field in FPU status word.

[각주]

2.2.5.3. FFREE[편집]

Opcode
추가 시점
Mnemonic
설명
비고
DD C0+i

8087
FFREE st(i)

Sets tag for ST(i) to empty

[각주]

2.2.5.4. FINIT/FNINIT[편집]

Opcode
추가 시점
Mnemonic
설명
비고
9B DB E3

8087
FINIT

[92]

DB E3

8087
FNINIT

[93]

[92] Initialize FPU after checking for pending unmasked floating-point exceptions.[93] Initialize FPU without checking for pending unmasked floating-point exceptions.


2.2.5.5. FCLEX/FNCLEX[편집]

Opcode
추가 시점
Mnemonic
설명
비고
9B DB E2

8087
FCLEX

[94]

DB E2

8087
FNCLEX

[95]

[94] Clear floating-point exception flags after checking for pending unmasked floating-point exceptions.[95] Clear floating-point exception flags without checking for pending unmasked floating-point exceptions.


2.2.5.6. FSTCW/FNSTCW[편집]

Opcode
추가 시점
Mnemonic
설명
비고
9B D9 /7

8087
FSTCW m2byte

[96]

D9 /7

8087
FNSTCW m2byte

[97]

[96] Store FPU control word to m2byte after checking for pending unmasked floating-point exceptions.[97] Store FPU control word to m2byte without checking for pending unmasked floating-point exceptions.


2.2.5.7. FLDCW[편집]

Opcode
추가 시점
Mnemonic
설명
비고
D9 /5

8087
FLDCW m2byte

[98]


2.2.5.8. FSTENV/FNSTENV[편집]

Opcode
추가 시점
Mnemonic
설명
비고
9B D9 /6

8087
FSTENV m14byte

[99]
32-bit 모드에서는
66h
접두사 필요
80387
FSTENV m28byte

[100]

D9 /6

8087
FNSTENV m14byte

[101]
32-bit 모드에서는
66h
접두사 필요
80387
FNSTENV m28byte

[102]

[98] Load FPU control word from m2byte.[99] Store FPU environment to m14byte after checking for pending unmasked floating-point exceptions. Then mask all floating-point exceptions.[100] Store FPU environment to m28byte after checking for pending unmasked floating-point exceptions. Then mask all floating-point exceptions.[101] Store FPU environment to m14byte without checking for pending unmasked floating-point exceptions. Then mask all floating-point exceptions.[102] Store FPU environment to m28byte without checking for pending unmasked floating-point exceptions. Then mask all floating-point exceptions.


2.2.5.9. FLDENV[편집]

Opcode
추가 시점
Mnemonic
설명
비고
D9 /4

8087
FLDENV m14byte

[103]
32-bit 모드에서는
66h
접두사 필요
80387
FLDENV m28byte

[104]

[103] Load FPU environment from m14byte.[104] Load FPU environment from m28byte.


2.2.5.10. FSAVE/FNSAVE[편집]

Opcode
추가 시점
Mnemonic
설명
비고
9B DD /6

8087
FSAVE m94byte

[105]
32-bit 모드에서는
66h
접두사 필요
80387
FSAVE m108byte

[106]

DD /6

8087
FNSAVE m94byte

[107]
32-bit 모드에서는
66h
접두사 필요
80387
FNSAVE m108byte

[108]

[105] Store FPU state to m94byte after checking for pending unmasked floating-point exceptions. Then re-initialize the FPU.[106] Store FPU state to m108byte after checking for pending unmasked floating-point exceptions. Then re-initialize the FPU.[107] Store FPU state to m94byte without checking for pending unmasked floating-point exceptions. Then re-initialize the FPU.[108] Store FPU state to m108byte without checking for pending unmasked floating-point exceptions. Then re-initialize the FPU.


2.2.5.11. FRSTOR[편집]

Opcode
추가 시점
Mnemonic
설명
비고
DD /4

8087
FRSTOR m94byte

[109]
32-bit 모드에서는
66h
접두사 필요
80387
FRSTOR m108byte

[110]

[109] Load FPU state from m94byte.[110] Load FPU state from m108byte.


2.2.5.12. FSTSW/FNSTSW[편집]

Opcode
추가 시점
Mnemonic
설명
비고
9B DD /7

8087
FSTSW m2byte

[111]

9B DF E0

80287
FSTSW ax

[112]

DD /7

8087
FNSTSW m2byte

[113]

DF E0

80287
FNSTSW ax

[114]

[111] Store FPU status word at m2byte after checking for pending unmasked floating-point exceptions.[112] Store FPU status word in AX register after checking for pending unmasked floating-point exceptions.[113] Store FPU status word at m2byte without checking for pending unmasked floating-point exceptions.[114] Store FPU status word in AX register without checking for pending unmasked floating-point exceptions.


2.2.5.13. FNOP[편집]

Opcode
추가 시점
Mnemonic
설명
비고
D9 D0

8087
FNOP

No operation is performed.

[각주]

2.2.5.14. FXSAVE[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F AE /0

Pentium II
FXSAVE m512byte

[115]

[115] Save the x87 FPU, MMX technology, XMM, and MXCSR register state to m512byte


2.2.5.15. FXRSTOR[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F AE /1

Pentium II
FXRSTOR m512byte

[116]

[116] Restore the x87 FPU, MMX technology, XMM, and MXCSR register state from m512byte.


3. SIMD 명령어 목록 [편집]


스트리밍 SIMD 확장 문서 참조

3.1. MMX 확장 [편집]


  • AMD에서 만든 대응 명령어 3DNow!는 사실상 사장되었다.
  • 인텔 IA-32 소프트웨어 개발자 매뉴얼에서는 SSE에 포함된 MMX 명령어 또한 MMX 명령어로 분류하므로 이 또한 MMX 문단에 작성하나, SSE 확장과 함께 추가되었음을 명시한다. (
    NP
    : No Prefix. 접두사 없음.)
[각주]

3.1.1. MMX 메모리 및 변환 명령어[편집]



3.1.1.1. MOVD[편집]

Opcode
추가 시점
Mnemonic
형식
비고
NP 0F 6E /r

Pentium MMX
MOVD mm,r/m32

mm = r/m32

NP 0F 7E /r

Pentium MMX
MOVD r/m32,mm

r/m32 = mm

66 0F 6E /r

Pentium 4 (SSE2)
MOVD xmm,r/m32

xmm = r/m32

66 0F 7E /r

Pentium 4 (SSE2)
MOVD r/m32,xmm

r/m32 = xmm

[각주]

3.1.1.2. MOVQ[편집]

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

[각주]

3.1.1.3. PACKSSWB[편집]

Opcode
추가 시점
Mnemonic
설명
비고
NP 0F 63 /r

Pentium MMX
PACKSSWB mm1,mm2/m64



66 0F 63 /r

Pentium 4 (SSE2)
PACKSSWB xmm1,xmm2/m128



[각주]

3.1.1.4. PACKSSDW[편집]

Opcode
추가 시점
Mnemonic
설명
비고
NP 0F 6B /r

Pentium MMX
PACKSSDW mm1,mm2/m64



66 0F 6B /r

Pentium 4 (SSE2)
PACKSSDW xmm1,xmm2/m128



[각주]

3.1.1.5. PACKUSWB[편집]

Opcode
추가 시점
Mnemonic
설명
비고
NP 0F 67 /r

Pentium MMX
PACKUSWB mm1,mm2/m64



66 0F 67 /r

Pentium 4 (SSE2)
PACKUSWB xmm1,xmm2/m128



[각주]

3.1.1.6. PUNPCKHBW[편집]

Opcode
추가 시점
Mnemonic
설명
비고
NP 0F 68 /r

Pentium MMX
PUNPCKHBW mm1,mm2/m64



66 0F 68 /r

Pentium 4 (SSE2)
PUNPCKHBW xmm1,xmm2/m128



[각주]

3.1.1.7. PUNPCKHWD[편집]

Opcode
추가 시점
Mnemonic
설명
비고
NP 0F 69 /r

Pentium MMX
PUNPCKHWD mm1,mm2/m64



66 0F 69 /r

Pentium 4 (SSE2)
PUNPCKHWD xmm1,xmm2/m128



[각주]

3.1.1.8. PUNPCKHDQ[편집]

Opcode
추가 시점
Mnemonic
설명
비고
NP 0F 6A /r

Pentium MMX
PUNPCKHDQ mm1,mm2/m64



66 0F 6A /r

Pentium 4 (SSE2)
PUNPCKHDQ xmm1,xmm2/m128



[각주]

3.1.1.9. PUNPCKLBW[편집]

Opcode
추가 시점
Mnemonic
설명
비고
NP 0F 60 /r

Pentium MMX
PUNPCKLBW mm1,mm2/m32



66 0F 60 /r

Pentium 4 (SSE2)
PUNPCKLBW xmm1,xmm2/m128



[각주]

3.1.1.10. PUNPCKLWD[편집]

Opcode
추가 시점
Mnemonic
설명
비고
NP 0F 61 /r

Pentium MMX
PUNPCKLWD mm1,mm2/m32



66 0F 61 /r

Pentium 4 (SSE2)
PUNPCKLWD xmm1,xmm2/m128



[각주]

3.1.1.11. PUNPCKLDQ[편집]

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


[각주]

3.1.2.2. PADDSB/PADDSW[편집]

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


[각주]

3.1.2.3. PADDUSB/PADDUSW[편집]

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


[각주]

3.1.2.5. PSUBSB/PSUBSW[편집]

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


[각주]

3.1.2.6. PSUBUSB/PSUBUSW[편집]

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


[각주]

3.1.2.7. PMULHW[편집]

Opcode
추가 시점
Mnemonic
설명
비고
NP 0F E5 /r

Pentium MMX
PMULHW mm,mm/m64



66 0F E5 /r

Pentium 4 (SSE2)
PMULHW xmm1,xmm2/m128



[각주]

3.1.2.8. PMULLW[편집]

Opcode
추가 시점
Mnemonic
설명
비고
NP 0F D5 /r

Pentium MMX
PMULLW mm,mm/m64



66 0F D5 /r

Pentium 4 (SSE2)
PMULLW xmm1,xmm2/m128



[각주]

3.1.2.9. PMADDWD[편집]

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 명령어[편집]



3.1.4.1. PAND[편집]

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

[각주]

3.1.4.2. PANDN[편집]

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

[각주]

3.1.4.3. POR[편집]

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

[각주]

3.1.4.4. PXOR[편집]

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
[psllw]
NP 0F 72 /6 ib

PSLLD mm,imm8

[pslld]
NP 0F 73 /6 ib

PSLLQ mm,imm8

[psllq]
NP 0F F1 /r

Pentium MMX
PSLLW mm,mm/m64

mm <<= mm/m64
[psllw]
NP 0F F2 /r

PSLLD mm,mm/m64

[pslld]
NP 0F F3 /r

PSLLQ mm,mm/m64

[psllq]
66 0F 71 /6 ib

Pentium 4 (SSE2)
PSLLW xmm1,imm8

xmm1 <<= imm8
[psllw]
66 0F 72 /6 ib

PSLLD xmm1,imm8

[pslld]
66 0F 73 /6 ib

PSLLQ xmm1,imm8

[psllq]
66 0F F1 /r

Pentium 4 (SSE2)
PSLLW xmm1,xmm2/m128

xmm1 <<= xmm2/m128
[psllw]
66 0F F2 /r

PSLLD xmm1,xmm2/m128

[pslld]
66 0F F3 /r

PSLLQ xmm1,xmm2/m128

[psllq]
[psllw] A B C D count가 15 이상인 경우 모두 0으로 채운다.[pslld] A B C D count가 31 이상인 경우 모두 0으로 채운다.[psllq] A B C D count가 63 이상인 경우 모두 0으로 채운다.


3.1.5.2. PSRLW/PSRLD/PSRLQ[편집]

Opcode
추가 시점
Mnemonic
형식
비고
NP 0F 71 /2 ib

Pentium MMX
PSRLW mm,imm8

mm >>= imm8
[psrlw]
NP 0F 72 /2 ib

PSRLD mm,imm8

[psrld]
NP 0F 73 /2 ib

PSRLQ mm,imm8

[psrlq]
NP 0F D1 /r

Pentium MMX
PSRLW mm,mm/m64

mm >>= mm/m64
[psrlw]
NP 0F D2 /r

PSRLD mm,mm/m64

[psrld]
NP 0F D3 /r

PSRLQ mm,mm/m64

[psrlq]
66 0F 71 /2 ib

Pentium 4 (SSE2)
PSRLW xmm1,imm8

xmm1 >>= imm8
[psrlw]
66 0F 72 /2 ib

PSRLD xmm1,imm8

[psrld]
66 0F 73 /2 ib

PSRLQ xmm1,imm8

[psrlq]
66 0F D1 /r

Pentium 4 (SSE2)
PSRLW xmm1,xmm2/m128

xmm1 >>= xmm2/m128
[psrlw]
66 0F D2 /r

PSRLD xmm1,xmm2/m128

[psrld]
66 0F D3 /r

PSRLQ xmm1,xmm2/m128

[psrlq]
[psrlw] A B C D count가 15 이상인 경우 모두 0으로 채운다.[psrld] A B C D count가 31 이상인 경우 모두 0으로 채운다.[psrlq] A B C D count가 63 이상인 경우 모두 0으로 채운다.


3.1.5.3. PSRAW/PSRAD[편집]

Opcode
추가 시점
Mnemonic
형식
비고
NP 0F 71 /4 ib

Pentium MMX
PSRAW mm,imm8

mm >>= imm8
[psraw]
NP 0F 72 /4 ib

PSRAD mm,imm8

[psrad]
NP 0F E1 /r

Pentium MMX
PSRAW mm,mm/m64

mm >>= mm/m64
[psraw]
NP 0F E2 /r

PSRAD mm,mm/m64

[psrad]
66 0F 71 /4 ib

Pentium 4 (SSE2)
PSRAW xmm1,imm8

xmm1 >>= imm8
[psraw]
66 0F 72 /4 ib

PSRAD xmm1,imm8

[psrad]
66 0F E1 /r

Pentium 4 (SSE2)
PSRAW xmm1,xmm2/m128

xmm1 >>= xmm2/m128
[psraw]
66 0F E2 /r

PSRAD xmm1,xmm2/m128

[psrad]
[psraw] A B C D count가 15 이상인 경우 모두 sign bit으로 채운다.[psrad] A B C D count가 31 이상인 경우 모두 sign bit으로 채운다.


3.1.6. MMX 제어 명령어[편집]



3.1.6.1. EMMS[편집]

Opcode
추가 시점
Mnemonic
설명
비고
0F 77

Pentium MMX
EMMS

Set the x87 FPU tag word to empty.
x87FPUTagWord ←
FFFFh
;
[각주]

3.2. SSE 확장 [편집]


SSE의 초기 버전은 단정밀도(32-bit) 부동소수점만을 지원한다. (Scalar/Packed)
  • NP
    : No Prefix. 접두사 없음.

3.2.1. SSE 메모리 관련 명령어[편집]



3.2.1.1. MOVUPS[편집]

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

[각주]

3.2.1.2. MOVSS[편집]

Opcode
추가 시점
Mnemonic
설명
비고
F3 0F 10 /r

Pentium III (SSE)
MOVSS xmm1,xmm2/m32

xmm1[0] = xmm2[0]/m32
[117]
F3 0F 11 /r

Pentium III (SSE)
MOVSS xmm2/m32,xmm1

xmm2[0]/m32 = xmm1[0]

[117] Source 피연산자가
m32
인 경우
XMM[127:32]
0
으로 비워진다.


3.2.1.3. MOVLPS[편집]

[각주]

3.2.1.4. MOVHLPS[편집]

[각주]

3.2.1.5. MOVHPS[편집]

[각주]

3.2.1.6. MOVLHPS[편집]

[각주]

3.2.1.7. MOVAPS[편집]

[각주]

3.2.2. SSE 변환 명령어[편집]



3.2.3. SSE Packed Arithmetic 명령어[편집]



3.2.4. SSE Comparison 명령어[편집]



3.2.5. SSE Bitwise 명령어[편집]



3.2.6. SSE Shuffle/Unpack 명령어[편집]



3.2.7. 기타 SSE 명령어[편집]



3.3. SSE2 확장 [편집]


SSE2에서는 배정밀도(64-bit) 부동소수점 및 MMX 명령어 등을 지원한다.

3.3.1. SSE2 메모리 관련 명령어[편집]



3.3.2. SSE2 변환 명령어[편집]



3.3.3. SSE2 Packed Arithmetic 명령어[편집]



3.3.4. SSE2 Comparison 명령어[편집]



3.3.5. SSE2 Bitwise 명령어[편집]



3.3.6. SSE2 Shuffle/Unpack 명령어[편집]



3.3.7. 기타 SSE2 명령어[편집]



3.4. SSE3 확장 [편집]


SSE3에서는 이전 SSE/SSE2와 달리 벡터 내의 각 항별로 다른 연산을 적용하거나(홀수번째 항은 덧셈, 짝수번째 항은 뺄셈) 한 벡터 내의 여러 항들 사이의 덧셈/뺄셈 연산을 지원해 3D 작업 등을 더 빠르게 수행할 수 있도록 하였다.
파일:크리에이티브 커먼즈 라이선스__CC.png 이 문서의 내용 중 전체 또는 일부는 2023-11-06 17:19:21에 나무위키 x86/명령어 목록 문서에서 가져왔습니다.