상위 문서: AMD64
명령어 집합 | |
CISC | AMD64●x86● · 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 |
<rowcolor=#fff> 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 · BITALG 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! PREFETCHW · F16C · XOP · FMA FMA4 · FMA3 |
비트 조작 | ABM |
보안 및 암호 | SME |
가상화 및 기타 | AMD-V |
[1] 512-bit EVEX 인코딩된 AVX-512 명령어의 256-bit VEX 인코딩 버전
1. 개요
1.1. 약어 설명1.2. 표기법1.3. 명령어 인코딩1.4. VEX 인코딩 (AVX 확장)1.5. EVEX 인코딩 (AVX-512 확장)
2. AMD64 명령어 목록1.5.1. EVEX
1.6. 확장 EVEX 인코딩 (APX 확장)1.7. 레지스터2.1. AMD64 범용 명령어
3. SSE 확장4. AVX 확장5. APX 확장6. 기타 연산 관련 확장 명령어7. 가상화 명령어8. 기타 확장 명령어2.1.1. 사칙연산 명령어
2.2. x87 FPU 명령어2.3. MMX 명령어2.4. SSE 명령어2.5. SSE2 명령어2.1.1.1. ADD
2.1.2. 논리 연산 명령어2.1.3. Shift/Rotate 명령어2.1.4. 비트 및 바이트 조작 명령어2.1.5. 메모리 관련 명령어2.1.6. 제어 명령어2.1.7. 플래그 조작 명령어2.1.8. I/O 명령어2.1.9. 문자열 조작 명령어2.1.1.1.1. INC
2.1.1.2. ADC2.1.1.3. SUB2.1.1.3.1. DEC
2.1.1.4. SBB2.1.1.5. NEG2.1.1.6. CMP2.1.1.7. MUL2.1.1.8. IMUL2.1.1.9. DIV2.1.1.10. IDIV2.1.9.1. Fast-String Operation
2.1.10. 플래그 제어 및 세그멘트 레지스터 명령어2.1.11. XSAVE 명령어2.1.12. 기타 명령어[clearfix]
1. 개요
AMD64 아키텍처의 명령어 목록. 64-bit 모드 기준으로 기술한다.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 |
1.2.2. 16진수 및 2진수
* 16진수 숫자는 뒤에h
를 붙여서 표기한다.* 2진수 숫자는 뒤에
b
를 붙여서 표기한다.1.3. 명령어 인코딩
AMD64 ISA는 다음과 같은 가변길이 인코딩을 사용한다.(Legacy Prefixes) (REX Prefix) [Opcode] (Mod R/M) (SIB) (Displacement) (Immediate) |
- (Legacy Prefixes): 4가지 그룹으로 구분되며 각 그룹에 속하는 접두사(각 1 바이트)가 선택적으로 붙을 수 있다.
- (REX Prefix): AMD64에 추가된 레지스터에 접근하거나 64-bit operand를 지정할 때 사용한다.
- [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. 레거시 접두사
- 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 override
- Group 3: Operand-size override prefix
66h
(0x66): 명령어의 피연산자의 크기가 기본값과 다름을 나타내는 접두사이다.
- Group 4: Address-size override prefix
67h
(0x67): 명령어가 사용하는 주소의 크기가 기본값과 다름을 나타내는 접두사이다.
1.3.2. REX 접두사
REX Prefix | Opcode | ModR/M | SIB
0100W00B (......) *****bbb
0100WR0B (......) **rrrbbb (SIB를 사용하지 않는 경우)
0100WRXB (......) **rrr100 ssxxxbbb (SIB를 사용하는 경우)
W, R, X, B 4개의 필드로 구성되는 접두사(
40h..4Fh
)로, 64-bit operand를 사용하거나 AMD64에 추가된 레지스터에 접근하는 데 사용된다.* W 필드: 1인 경우 64-bit operand를 지정한다.[1]
* R 필드: ModR/M r 필드(
rrr
)를 확장한다. (Rrrr
)* X 필드: SIB index 필드(
xxx
)를 확장한다. (Xxxx
)* B 필드: ModR/M r/m 필드 또는 SIB base 필드(
bbb
)를 확장한다. (Bbbb
)[1] 16-bit 접두사
66h
가 붙는 경우 해당 접두사는 무시된다.1.3.3. REX2 접두사 (APX 확장)
바이트 | 비트 | |||||||
REX2(0xD5) | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
Payload byte 1 | M0 | R4 | X4 | B4 | W | R3 | X3 | B3 |
* M0 필드: Opcode Map을 지정한다.
* W 필드: 1인 경우 64-bit operand를 지정한다.[2]
* R4, R3 필드: ModR/M r 필드(
rrr
)를 확장한다. (RRrrr
)* X4, X3 필드: SIB index 필드(
xxx
)를 확장한다. (XXxxx
)* B4, B3 필드: ModR/M r/m 필드 또는 SIB base 필드(
bbb
)를 확장한다. (BBbbb
)[2] 16-bit 접두사
66h
가 붙는 경우 해당 접두사는 무시된다.====# AMD64 Opcode #====
64-bit 모드를 기준으로 서술한다.
=====# 2-byte 이상 opcode #=====
1.3.4. Mod R/M
필드 | mod | reg/opcode | r/m |
비트 수 | 2-bit | 3-bit | 3-bit |
- mod
- operand의 모드를 지정한다. r/m 필드와 결합되어 사용된다.
- 32-bit/64-bit addressing에서 r/m 필드의 값이
100
(esp/r12)인 경우 SIB를 사용한다. 00
: (m) (레지스터/SIB) 또는 disp16/disp32 값에 해당하는 주소를 지정한다.[3]01
: (m) (레지스터/SIB) 값에 disp8을 더한 주소를 지정한다.10
: (m) (레지스터/SIB) 값에 disp16/disp32를 더한 주소를 지정한다.11
: (r) 레지스터의 값을 operand로 사용한다.- reg/opcode
- 레지스터 번호 또는 일부 명령어의 경우 opcode 정보를 담고 있다.
- r/m
- 레지스터 번호를 나타낸다.
[3] r/m 필드의 값이
101
(ebp/r13)인 경우 호환 모드에서는 disp 값을 그대로, 64-bit 모드에서는 rip+disp32 값을 사용한다. 단, 64비트 모드에서도 SIB를 사용하여 disp32 값을 그대로 사용할 수 있다.1.3.5. SIB
필드 | scale | index | base |
비트 수 | 2-bit | 3-bit | 3-bit |
[base + index * scale]
에 해당하는 주소를 지정하는 데 사용된다.- scale
00
: 1 (byte)01
: 2 (bytes)10
: 4 (bytes)11
: 8 (bytes)- Index
- 해당하는 레지스터의 값을 사용한다. 단,
100
(esp)인 경우 0으로 계산한다. (esp를 index에 사용할 수 없다.) REX.X prefix가 사용된 경우 이 값을 포함하여 계산되므로 r12 레지스터는 사용이 가능하다. - Base
- 해당하는 레지스터의 값을 사용한다. 단,
101
(ebp/r13)인 경우 mod에 따라 다음의 값을 사용한다. 00
:[scaled index] + disp32
01
:[scaled index] + disp8 + [EBP/R13]
10
:[scaled index] + disp32 + [EBP/R13]
1.4. VEX 인코딩 (AVX 확장)
AVX 확장에서 아래와 같은 VEX 인코딩이 도입되었다.(Prefixes) [VEX Prefix] [Opcode] [Mod R/M] (SIB) (Displacement) (Immediate) |
- (Prefixes)
- [VEX Prefix]: AVX에서 사용되는 2-3 바이트 길이의 접두사이다.
- [Opcode]: 1 바이트 길이로 수행하고자 하는 명령어의 종류를 지정한다.
- [Mod R/M]: 피연산자의 형태(레지스터/메모리) 및 메모리 주소 형식을 지정한다.
- (SIB):
[base + index * scale (+ disp.)]
형식으로 계산되는 메모리의 base 레지스터, index 레지스터 및 scale을 지정한다. 명령어에 따라 선택적으로 요구한다. - (Displacement): 1/2/4 바이트 크기의 displacement로 명령어에 따라 선택적으로 요구한다.
- (Immediate): 1 바이트 크기의 immediate(명령어에 인코딩되는 숫자) 값으로 명령어에 따라 선택적으로 요구한다.
1.4.1. VEX 접두사
VEX 접두사의 각 필드는 다음과 같은 정보를 포함한다:- R: REX.R의 보수(complement)와 동일하다.
- X: REX.X의 보수(complement)와 동일하다.
- B: REX.B의 보수(complement)와 동일하다.
- W: opcode에 따라 선택적으로 사용되거나 무시된다.
- m-mmmm:
- 00000: 예약됨
- 00001:
0F
로 시작하는 opcode를 암시한다. - 00010:
0F 38
로 시작하는 opcode를 암시한다. - 00011:
0F 3A
로 시작하는 opcode를 암시한다. - 00100-11111: 예약됨
- vvvv:
- L: 벡터 길이
- 0: 스칼라 또는 128비트 벡터
- 1: 256비트 벡터
- pp: SIMD 접두사와 동치인 opcode 확장
- 00: None
- 01:
66
- 10:
F3
- 11:
F2
1의 보수(1's complement) 형태로 레지스터를 명시하며 사용되지 않는 경우 그 값은
1111
이다.1.4.2. 2-byte VEX
Byte 0 | Byte 1
C5h RvvvvLpp
64-bit 모드에서는 사용되지 않는 레거시 명령어인
AAD
(C5h
)를 접두사로 사용한다.1.4.3. 3-byte VEX
Byte 0 | Byte 1 | Byte 2
C4h RXBmmmmm WvvvvLpp
64-bit 모드에서는 사용되지 않는 레거시 명령어인
AAA
(C4h
)를 접두사로 사용한다.1.5. EVEX 인코딩 (AVX-512 확장)
AVX-512 확장에서 아래와 같은 EVEX 인코딩이 도입되었다.(Prefixes) [EVEX Prefix] [Opcode] [Mod R/M] (SIB) (Displacement) (Immediate) |
- (Prefixes):
- [EVEX Prefix]: AVX-512에서 사용되는 4 바이트 길이의 접두사이다.
- [Opcode]: 1 바이트 길이로 수행하고자 하는 명령어의 종류를 지정한다.
- [Mod R/M]: 피연산자의 형태(레지스터/메모리) 및 메모리 주소 형식을 지정한다.
- (SIB):
[base + index * scale (+ disp.)]
형식으로 계산되는 메모리의 base 레지스터, index 레지스터 및 scale을 지정한다. 명령어에 따라 선택적으로 요구한다. - (Displacement): 1/2/4 바이트 크기의 displacement로 명령어에 따라 선택적으로 요구한다.
- (Immediate): 1 바이트 크기의 immediate(명령어에 인코딩되는 숫자) 값으로 명령어에 따라 선택적으로 요구한다.
1.5.1. EVEX
62h | P0 | P1 | P2 |
62h RXBR'00mm Wvvvv1pp zL'LbV'aaa
32-bit 모드에서만 사용되는
BOUND
(62h
) 명령어를 접두사로 사용한다.EVEX 접두사의 각 필드는 다음과 같은 정보를 포함한다:
- mm: VEX.mmmmm의 하위 2비트와 동일하다.
- pp: VEX.pp와 동일하다.
- RXB: VEX 접두사와 마찬가지로 비트가 반전된 형태로 인코딩된다.
- R': EVEX.R의 확장. 비트가 반전된 형태로 인코딩된다.
- X: SIB/VSIB가 없는 경우 EVEX.B와 결합되어 사용된다.
- vvvv: VEX.vvvv와 동일
- V': EVEX.vvvv와 결합하여 사용한다. 비트가 반전된 형태로 인코딩된다.
- aaa: opmask register specifier
- W: Osize promotion
- z: zeroing/merging
- b: broadcast/RC/SAE context
- L'L: Vector length
1.6. 확장 EVEX 인코딩 (APX 확장)
바이트 | 비트 | |||||||
EVEX(0x62) | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 |
Payload byte 1 | R3 | X3 | B3 | R4 | B4 | M2 | M1 | M0 |
Payload byte 2 | W | V3 | V2 | V1 | V0 | X4 | p | p |
Payload byte 3 | 0 | 0 | 0 | ND | V4 | NF | 0 | 0 |
- M2-M0 필드: opcode가 속한 map을 가리키는 필드이다.
- pp 필드: EVEX와 동일. 접두사와 동치인 opcode 확장
- 00: None
- 01:
66
- 10:
F3
- 11:
F2
- W 필드: EVEX와 동일
- ND 필드(b): NDD 사용 여부를 나타내는 필드이다.
- NF 필드(a): 플래그 레지스터를 업데이트하는 기존 명령어의 플래그 업데이트 여부를 정하는 필드이다.
- R4,R3 필드(R',R): ModR/M r 필드(
rrr
)를 확장한다. (RRrrr
) - X4,X3 필드(X',X): SIB index 필드(
xxx
)를 확장한다. (XXxxx
) - B4,B3 필드(B',B): ModR/M r/m 필드 또는 SIB base 필드(
bbb
)를 확장한다. (BBbbb
) - V4-V0 필드(V', vvvv): NDD가 사용되는 경우 해당하는 레지스터를 지정하는 데 쓰이는 필드이다.
- 사용되지 않는 필드:
- L'L: Vector length
- z: zeroing/merging
1.7. 레지스터
- 범용 레지스터:
- 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비트)
- -B: 8비트
- -X: 16비트/32비트/64비트 (A, B, C, D)
- -W: 16비트
- -D: 32비트
- E-: 32비트
- R-: 64비트
1.7.1. 정수 레지스터
번호 / 종류 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8-15 | 16-31 |
8비트 정수 | AL | CL | DL | BL | AH, SPL | CH, BPL | DH, SIL | BH, DIL | R8B-R15B[REX.R] | R16B-R31B[APX] |
16비트 정수 | AX | CX | DX | BX | SP | BP | SI | DI | R8W-R15W[REX.R] | R16W-R31W[APX] |
32비트 정수 | EAX | ECX | EDX | EBX | ESP | EBP | ESI | EDI | R8D-R15D[REX.R] | R16D-R31D[APX] |
64비트 정수[REX.W] | RAX | RCX | RDX | RBX | RSP | RBP | RSI | RDI | R8D-R15D[REX.R] | R16D-R31D[APX] |
[REX.R] REX.R/REX.X/REX.B 접두사 필요[APX] APX 확장. REX2 또는 EVEX 접두사를 사용해 인코딩됨[REX.R] [APX] [REX.R] [APX] [REX.W] 명령어에 따라 REX.W 접두사 필요[REX.R] [APX]
1.7.2. 부동소수점/벡터 레지스터
번호 / 종류 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8-15 | 16-31 |
80비트 x87 | ST0 | ST1 | ST2 | ST3 | ST4 | ST5 | ST6 | ST7 | - | - |
64비트 MMX[13] | MM0 | MM1 | MM2 | MM3 | MM4 | MM5 | MM6 | MM7 | ||
128비트 SSE | XMM0 | XMM1 | XMM2 | XMM3 | XMM4 | XMM5 | XMM6 | XMM7 | XMM8-XMM15 | XMM16-XMM31[EVEX] |
256비트 AVX[VEX] | YMM0 | YMM1 | YMM2 | YMM3 | YMM4 | YMM5 | YMM6 | YMM7 | YMM8-YMM15 | YMM16-YMM31[EVEX] |
512비트 AVX[EVEX] | ZMM0 | ZMM1 | ZMM2 | ZMM3 | ZMM4 | ZMM5 | ZMM6 | ZMM7 | ZMM8-ZMM15 | ZMM16-ZMM31 |
[13] x87과 동시에 사용할 수 없다.[EVEX] EVEX 인코딩으로만 접근 가능. AVX-512 또는 AVX10 필요[VEX] VEX 또는 EVEX 인코딩으로만 접근 가능. AVX 필요[EVEX] [EVEX]
1.7.3. 특수 레지스터
- 플래그 레지스터 (RFLAGS)
- 상태 플래그
- 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
- 제어 레지스터 (CR0-CR8)
- 디버그 레지스터 (DR0-DR7)
2. AMD64 명령어 목록
2.1. AMD64 범용 명령어
2.1.1. 사칙연산 명령어
2.1.1.1. ADD
Opcode | 확장 | Mnemonic | 형식 | 비고 |
00 /r | x86 | ADD r/m8,r8 | r/m += r | |
01 /r | x86 | ADD r/m16,r16 | 66h 접두사 필요 | |
ADD r/m32,r32 | ||||
REX.W 01 /r | AMD64 | ADD r/m64,r64 | ||
02 /r | x86 | ADD r8,r/m8 | r += r/m | |
03 /r | x86 | ADD r16,r/m16 | 66h 접두사 필요 | |
ADD r32,r/m32 | ||||
REX.W 03 /r | AMD64 | ADD r64,r/m64 | ||
04 ib | x86 | ADD al,imm8 | a += imm | |
05 iw | x86 | ADD ax,imm16 | 66h 접두사 필요 | |
05 id | ADD eax,imm32 | |||
REX.W 05 id | AMD64 | ADD rax,imm32 | ||
80 /0 ib | x86 | ADD r/m8,imm8 | r/m += imm | |
81 /0 iw | x86 | ADD r/m16,imm16 | 66h 접두사 필요 | |
81 /0 id | ADD r/m32,imm32 | |||
REX.W 81 /0 id | AMD64 | ADD r/m64,imm32 | ||
83 /0 ib | x86 | ADD r/m16,imm8 | r/m += imm | 66h 접두사 필요 |
ADD r/m32,imm8 | ||||
REX.W 83 /0 ib | AMD64 | ADD r/m64,imm8 |
2.1.1.1.1. INC
Opcode | 확장 | Mnemonic | 형식 | 비고 |
FE /0 | x86 | INC r/m8 | r/m += 1 | |
FF /0 | x86 | INC r/m16 | 66h 접두사 필요 | |
INC r/m32 | ||||
REX.W FF /0 | AMD64 | INC r/m64 |
2.1.1.2. ADC
Opcode | 확장 | Mnemonic | 형식 | 비고 |
10 /r | x86 | ADC r/m8,r8 | r/m += r + CF | |
11 /r | x86 | ADC r/m16,r16 | 66h 접두사 필요 | |
ADC r/m32,r32 | ||||
REX.W 11 /r | AMD64 | ADC r/m64,r64 | ||
12 /r | x86 | ADC r8,r/m8 | r += r/m + CF | |
13 /r | x86 | ADC r16,r/m16 | 66h 접두사 필요 | |
ADC r32,r/m32 | ||||
REX.W 13 /r | AMD64 | ADC r64,r/m64 | ||
14 ib | x86 | ADC al,imm8 | a += imm + CF | |
15 iw | x86 | ADC ax,imm16 | 66h 접두사 필요 | |
15 id | ADC eax,imm32 | |||
REX.W 15 id | AMD64 | ADC rax,imm32 | ||
80 /2 ib | x86 | ADC r/m8,imm8 | r/m += imm + CF | |
81 /2 iw | x86 | ADC r/m16,imm16 | 66h 접두사 필요 | |
81 /2 id | ADC r/m32,imm32 | |||
REX.W 81 /2 id | AMD64 | ADC r/m64,imm32 | ||
83 /2 ib | x86 | ADC r/m16,imm8 | r/m += imm + CF | 66h 접두사 필요 |
ADC r/m32,imm8 | ||||
REX.W 83 /2 ib | AMD64 | ADC r/m64,imm8 |
2.1.1.3. SUB
Opcode | 확장 | Mnemonic | 형식 | 비고 |
28 /r | x86 | SUB r/m8,r8 | r/m -= r | |
29 /r | x86 | SUB r/m16,r16 | 66h 접두사 필요 | |
SUB r/m32,r32 | ||||
REX.W 29 /r | AMD64 | SUB r/m64,r64 | ||
2A /r | x86 | SUB r8,r/m8 | r -= r/m | |
2B /r | x86 | SUB r16,r/m16 | 66h 접두사 필요 | |
SUB r32,r/m32 | ||||
REX.W 2B /r | AMD64 | SUB r64,r/m64 | ||
2C ib | x86 | SUB al,imm8 | a -= imm | |
2D iw | x86 | SUB ax,imm16 | 66h 접두사 필요 | |
2D id | SUB eax,imm32 | |||
REX.W 2D id | AMD64 | SUB rax,imm32 | ||
80 /5 ib | x86 | SUB r/m8,imm8 | r/m -= imm | |
81 /5 iw | x86 | SUB r/m16,imm16 | 66h 접두사 필요 | |
81 /5 id | SUB r/m32,imm32 | |||
REX.W 81 /5 id | AMD64 | SUB r/m64,imm32 | ||
83 /5 ib | x86 | SUB r/m16,imm8 | r/m -= imm | 66h 접두사 필요 |
SUB r/m32,imm8 | ||||
REX.W 83 /5 ib | AMD64 | SUB r/m64,imm8 |
2.1.1.3.1. DEC
Opcode | 확장 | Mnemonic | 형식 | 비고 |
FE /1 | x86 | DEC r/m8 | r/m += 1 | |
FF /1 | x86 | DEC r/m16 | 66h 접두사 필요 | |
DEC r/m32 | ||||
REX.W FF /1 | AMD64 | DEC r/m64 |
2.1.1.4. SBB
Opcode | 확장 | Mnemonic | 형식 | 비고 |
18 /r | x86 | SBB r/m8,r8 | r/m -= r + CF | |
19 /r | x86 | SBB r/m16,r16 | 66h 접두사 필요 | |
SBB r/m32,r32 | ||||
REX.W 19 /r | AMD64 | SBB r/m64,r64 | ||
1A /r | x86 | SBB r8,r/m8 | r -= r/m + CF | |
1B /r | x86 | SBB r16,r/m16 | 66h 접두사 필요 | |
SBB r32,r/m32 | ||||
REX.W 1B /r | AMD64 | SBB r64,r/m64 | ||
1C ib | x86 | SBB al,imm8 | a -= imm + CF | |
1D iw | x86 | SBB ax,imm16 | 66h 접두사 필요 | |
1D id | SBB eax,imm32 | |||
REX.W 1D id | AMD64 | SBB rax,imm32 | ||
80 /3 ib | x86 | SBB r/m8,imm8 | r/m -= imm + CF | |
81 /3 iw | x86 | SBB r/m16,imm16 | 66h 접두사 필요 | |
81 /3 id | SBB r/m32,imm32 | |||
REX.W 81 /3 id | AMD64 | SBB r/m64,imm32 | ||
83 /3 ib | x86 | SBB r/m16,imm8 | r/m -= imm + CF | 66h 접두사 필요 |
SBB r/m32,imm8 | ||||
REX.W 83 /3 ib | AMD64 | SBB r/m64,imm8 |
2.1.1.5. NEG
2.1.1.6. CMP
Opcode | 확장 | Mnemonic | 형식 | 비고 |
38 /r | x86 | CMP r/m8,r8 | temp = r/m - r | |
39 /r | x86 | CMP r/m16,r16 | 66h 접두사 필요 | |
CMP r/m32,r32 | ||||
REX.W 39 /r | AMD64 | CMP r/m64,r64 | ||
3A /r | x86 | CMP r8,r/m8 | temp = r - r/m | |
3B /r | x86 | CMP r16,r/m16 | 66h 접두사 필요 | |
CMP r32,r/m32 | ||||
REX.W 3B /r | AMD64 | CMP r64,r/m64 | ||
3C ib | x86 | CMP al,imm8 | temp = a - imm | |
3D iw | x86 | CMP ax,imm16 | 66h 접두사 필요 | |
3D id | CMP eax,imm32 | |||
REX.W 3D id | AMD64 | CMP rax,imm32 | ||
80 /7 ib | x86 | CMP r/m8,imm8 | temp = r/m - imm | |
81 /7 iw | x86 | CMP r/m16,imm16 | 66h 접두사 필요 | |
81 /7 id | CMP r/m32,imm32 | |||
REX.W 81 /7 id | AMD64 | CMP r/m64,imm32 | ||
83 /7 ib | x86 | CMP r/m16,imm8 | temp = r/m - imm | 66h 접두사 필요 |
CMP r/m32,imm8 | ||||
REX.W 83 /7 ib | AMD64 | CMP r/m64,imm8 |
2.1.1.7. MUL
2.1.1.8. IMUL
2.1.1.9. DIV
2.1.1.10. IDIV
2.1.2. 논리 연산 명령어
2.1.2.1. AND
2.1.2.2. OR
2.1.2.3. XOR
2.1.2.4. NOT
2.1.2.5. TEST
2.1.3. Shift/Rotate 명령어
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.4. 비트 및 바이트 조작 명령어
2.1.5. 메모리 관련 명령어
2.1.6. 제어 명령어
2.1.7. 플래그 조작 명령어
2.1.8. I/O 명령어
2.1.9. 문자열 조작 명령어
2.1.9.1. Fast-String Operation
2.1.10. 플래그 제어 및 세그멘트 레지스터 명령어
2.1.11. XSAVE 명령어
2.1.12. 기타 명령어
2.2. x87 FPU 명령어
2.3. MMX 명령어
2.4. SSE 명령어
2.5. SSE2 명령어
3. SSE 확장
3.1. SSE3 명령어
3.2. SSE4.1 명령어
3.3. SSE4.2 명령어
3.4. SSE4.1 명령어
4. AVX 확장
4.1. AVX 명령어
4.2. FMA 명령어
4.3. AVX2 명령어
4.4. AVX-512 명령어
4.5. AMX 명령어
5. APX 확장
5.1. 확장된 레거시 명령어
5.2. 64비트 점프
5.2.1. JMPABS
Opcode | 확장 | Mnemonic | 형식 | 비고 |
REX2,NO66,NO67,NOREP MAP0 W0 A1 target64 | APX | JMPABS target64 | 64비트 한정 |
5.3. PPX
5.3.1. PUSH2
5.3.2. POP2
6. 기타 연산 관련 확장 명령어
6.1. ABM/BMI1 명령어
6.1.1. ABM 명령어
6.1.1.1. POPCNT
Opcode | 확장 | Mnemonic | 형식 | 비고 |
F3 0F B8 /r | ABM[a]/SSE4.2[i] | POPCNT r16,r/m16 | 66h 접두사 필요 | |
POPCNT r32,r/m32 | ||||
F3 REX.W 0F B8 /r | POPCNT r64,r/m64 |
6.1.1.2. LZCNT
Opcode | 확장 | Mnemonic | 형식 | 비고 |
F3 0F BD /r | ABM[a]/BMI1[i] | LZCNT r16,r/m16 | 66h 접두사 필요 | |
LZCNT r32,r/m32 | ||||
F3 REX.W 0F BD /r | LZCNT r64,r/m64 |