나무모에 미러 (일반/어두운 화면)
최근 수정 시각 : 2023-11-21 10:23:38

AMD64/명령어 목록


파일:상위 문서 아이콘.svg   상위 문서: AMD64
명령어 집합
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

<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.2.1. 인텔 문법과 AT&T 문법1.2.2. 16진수 및 2진수
1.3. 명령어 인코딩
1.3.1. 레거시 접두사1.3.2. REX 접두사1.3.3. REX2 접두사 (APX 확장)1.3.4. Mod R/M1.3.5. SIB
1.4. VEX 인코딩 (AVX 확장)
1.4.1. VEX 접두사1.4.2. 2-byte VEX1.4.3. 3-byte VEX
1.5. EVEX 인코딩 (AVX-512 확장)
1.5.1. EVEX
1.6. 확장 EVEX 인코딩 (APX 확장)1.7. 레지스터
1.7.1. 정수 레지스터1.7.2. 부동소수점/벡터 레지스터1.7.3. 특수 레지스터
2. AMD64 명령어 목록
2.1. AMD64 범용 명령어
2.1.1. 사칙연산 명령어
2.1.1.1. ADD2.1.1.2. ADC2.1.1.3. SUB2.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. IDIV
2.1.2. 논리 연산 명령어
2.1.2.1. AND2.1.2.2. OR2.1.2.3. XOR2.1.2.4. NOT2.1.2.5. TEST
2.1.3. Shift/Rotate 명령어
2.1.3.1. ROL2.1.3.2. ROR2.1.3.3. RCL2.1.3.4. RCR2.1.3.5. SHL / SAL2.1.3.6. SHR2.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
5.3. PPX
5.3.1. PUSH25.3.2. POP2
6. 기타 연산 관련 확장 명령어
6.1. ABM/BMI1 명령어
6.1.1. ABM 명령어
6.1.1.1. POPCNT6.1.1.2. LZCNT
6.1.2. BMI1 명령어
6.2. BMI2 명령어6.3. AES-NI 명령어6.4. RDRAND 명령어6.5. SHA 명령어
7. 가상화 명령어
7.1. VT-x 명령어7.2. AMD-V 명령어
8. 기타 확장 명령어
8.1. TSX 명령어8.2. MPX 명령어8.3. SGX 명령어8.4. TME 명령어

[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
x86 어셈블리는 크게 인텔 문법과 AT&T 문법으로 나뉜다. 인텔 문법은 Windows 환경에서 널리 쓰이며(예: Visual C++), AT&T 문법은 Unix 환경에서 널리 쓰인다(예: GCC). 여기서는 인텔 문법을 기준으로 설명한다.

1.2.2. 16진수 및 2진수

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

1.3. 명령어 인코딩

AMD64 ISA는 다음과 같은 가변길이 인코딩을 사용한다.
(Legacy Prefixes) (REX Prefix) [Opcode] (Mod R/M) (SIB) (Displacement) (Immediate)

1.3.1. 레거시 접두사

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
기존 REX 접두사와 마찬가지로 모든 접두사 중 가장 마지막에 위치하여야 한다. REX/VEX/EVEX 접두사와 함께 사용될 수 없으며 그 외 나머지 레거시 접두사(ES/CS/SS/DS/FS/GS/OSIZE/ASIZE/LOCK/REPNE/REPE)와 함께 사용될 수 있다.
* 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 R/M 바이트는 3개의 필드로 구성되어 있다.
[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
32-bit addressing에서 선택적으로 사용되는 바이트이다. [base + index * scale]에 해당하는 주소를 지정하는 데 사용된다.

1.4. VEX 인코딩 (AVX 확장)

AVX 확장에서 아래와 같은 VEX 인코딩이 도입되었다.
(Prefixes) [VEX Prefix] [Opcode] [Mod R/M] (SIB) (Displacement) (Immediate)

1.4.1. VEX 접두사

VEX 접두사의 각 필드는 다음과 같은 정보를 포함한다:

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)

1.5.1. EVEX

 62h |    P0     |    P1    |     P2     |
 62h   RXBR'00mm   Wvvvv1pp   zL'LbV'aaa

32-bit 모드에서만 사용되는 BOUND(62h) 명령어를 접두사로 사용한다.

EVEX 접두사의 각 필드는 다음과 같은 정보를 포함한다:

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
APX 확장에서 추가된 GPR 또는 피연산자(New Data Destination)를 활용하기 위해 AVX-512의 EVEX 인코딩을 도입하였다.

1.7. 레지스터

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. 특수 레지스터

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

[a] AMD[i] Intel
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

[a] AMD[i] Intel

6.1.2. BMI1 명령어

6.2. BMI2 명령어

6.3. AES-NI 명령어

6.4. RDRAND 명령어

6.5. SHA 명령어

7. 가상화 명령어

7.1. VT-x 명령어

7.2. AMD-V 명령어

8. 기타 확장 명령어

8.1. TSX 명령어

8.2. MPX 명령어

8.3. SGX 명령어

8.4. TME 명령어