AMD64/명령어 목록
덤프버전 :
분류
상위 문서: AMD64
1. 개요
1.1. 약어 설명
1.2. 표기법
1.3. 명령어 인코딩
1.3.1. 레거시 접두사
1.3.2. REX 접두사
1.3.3. REX2 접두사 (APX 확장)
1.3.4. AMD64 Opcode
1.3.4.1. 2-byte 이상 opcode
1.3.5. Mod R/M
1.3.6. SIB
1.4. VEX 인코딩 (AVX 확장)
1.5. EVEX 인코딩 (AVX-512 확장)
1.5.1. EVEX
1.6. 확장 EVEX 인코딩 (APX 확장)
1.7. 레지스터
2. AMD64 명령어 목록
2.1. AMD64 범용 명령어
2.1.1. 사칙연산 명령어
2.1.1.1. ADD
2.1.1.1.1. INC
2.1.1.2. ADC
2.1.1.3. SUB
2.1.1.3.1. DEC
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. 논리 연산 명령어
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.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 명령어
5. APX 확장
6. 연산 관련 확장 명령어
7. 가상화 명령어
8. 기타 확장 명령어
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 문법[편집]
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): 4가지 그룹으로 구분되며 각 그룹에 속하는 접두사(각 1 바이트)가 선택적으로 붙을 수 있다.
- (REX Prefix): AMD64에 추가된 레지스터에 접근하거나 64-bit operand를 지정할 때 사용한다.
- [Opcode]: 1-3 바이트 길이로 수행하고자 하는 명령어의 종류를 지정한다. 이때 일부 SSE 명령어의 경우 prefix를 사용하는 것과 동일하게 인코딩되어 있으나(예:
:CVTDQ2PD
) 이는 opcode의 일부로, prefix로 취급되지 않는다.F3 0F E6h
- (Mod R/M): 피연산자의 형태(레지스터/메모리) 및 메모리 주소 형식을 지정한다. 명령어에 따라 선택적으로 요구한다.
- (SIB):
형식으로 계산되는 메모리의 base 레지스터, index 레지스터 및 scale을 지정한다. 명령어에 따라 선택적으로 요구한다.[base + index * scale (+ disp.)]
- (Displacement): 1/2/4 바이트 크기의 displacement로 명령어에 따라 선택적으로 요구한다.
- (Immediate): 1/2/4 바이트 크기의 immediate(명령어에 인코딩되는 숫자) 값으로 명령어에 따라 선택적으로 요구한다.
1.3.1. 레거시 접두사[편집]
- Group 1: Lock and repeat prefixes
- 메모리 접근의 독점 또는 명령어의 반복 수행을 지정하는 명령어이다.
-
(0xF0): LOCK 접두사. 명령어가 수행되는 동안 해당 명령어가 접근하는 주소에 대한 lock을 수행한다.F0h
-
(0xF2),F2h
(0xF3): 반복 접두사. 문자열을 다루는 명령어 앞에 붙어 해당 명령어가 특정 조건에 따라 반복적으로 수행되도록 하는 접두사이다. 이에 해당하지 않는 명령어에 사용하는 것은 정의되지 않은 동작이나,F3h
과 같이 사용되는 경우가 존재한다.repz ret
- Group 2: Segment override prefixes
- 메모리 세그멘트를 지정하는 접두사이다.
-
(0x2E): CS segment override2Eh
-
(0x36): SS segment override36h
-
(0x3E): DS segment override3Eh
-
(0x26): ES segment override26h
-
(0x64): FS segment override64h
-
(0x65): GS segment override65h
- Group 3: Operand-size override prefix
-
(0x66): 명령어의 피연산자의 크기가 기본값과 다름을 나타내는 접두사이다.66h
-
- Group 4: Address-size override prefix
-
(0x67): 명령어가 사용하는 주소의 크기가 기본값과 다름을 나타내는 접두사이다.67h
-
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 확장)[편집]
1.3.4. AMD64 Opcode[편집]
64-bit 모드를 기준으로 서술한다.
[각주]
1.3.4.1. 2-byte 이상 opcode[편집]
1.3.5. Mod R/M[편집]
Mod R/M 바이트는 3개의 필드로 구성되어 있다.
- mod
- operand의 모드를 지정한다. r/m 필드와 결합되어 사용된다.
- 32-bit/64-bit addressing에서 r/m 필드의 값이
(esp/r12)인 경우 SIB를 사용한다.100
-
: (m) (레지스터/SIB) 또는 disp16/disp32 값에 해당하는 주소를 지정한다.[2]00
-
: (m) (레지스터/SIB) 값에 disp8을 더한 주소를 지정한다.01
-
: (m) (레지스터/SIB) 값에 disp16/disp32를 더한 주소를 지정한다.10
-
: (r) 레지스터의 값을 operand로 사용한다.11
- reg/opcode
- 레지스터 번호 또는 일부 명령어의 경우 opcode 정보를 담고 있다.
- r/m
- 레지스터 번호를 나타낸다.
[2] r/m 필드의 값이
101
(ebp/r13)인 경우 호환 모드에서는 disp 값을 그대로, 64-bit 모드에서는 rip+disp32 값을 사용한다. 단, 64비트 모드에서도 SIB를 사용하여 disp32 값을 그대로 사용할 수 있다.1.3.6. SIB[편집]
32-bit addressing에서 선택적으로 사용되는 바이트이다.
[base + index * scale]
에 해당하는 주소를 지정하는 데 사용된다.- scale
-
: 1 (byte)00
-
: 2 (bytes)01
-
: 4 (bytes)10
-
: 8 (bytes)11
-
- Index
- 해당하는 레지스터의 값을 사용한다. 단,
(esp)인 경우 0으로 계산한다. (esp를 index에 사용할 수 없다.) REX.X prefix가 사용된 경우 이 값을 포함하여 계산되므로 r12 레지스터는 사용이 가능하다.100
- 해당하는 레지스터의 값을 사용한다. 단,
- Base
- 해당하는 레지스터의 값을 사용한다. 단,
(ebp/r13)인 경우 mod에 따라 다음의 값을 사용한다.101
-
: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]: AVX에서 사용되는 2-3 바이트 길이의 접두사이다.
- [Opcode]: 1 바이트 길이로 수행하고자 하는 명령어의 종류를 지정한다.
- [Mod R/M]: 피연산자의 형태(레지스터/메모리) 및 메모리 주소 형식을 지정한다.
- (SIB):
형식으로 계산되는 메모리의 base 레지스터, index 레지스터 및 scale을 지정한다. 명령어에 따라 선택적으로 요구한다.[base + index * scale (+ disp.)]
- (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:
로 시작하는 opcode를 암시한다.0F
- 00010:
로 시작하는 opcode를 암시한다.0F 38
- 00011:
로 시작하는 opcode를 암시한다.0F 3A
- 00100-11111: 예약됨
- vvvv:
1의 보수(1's complement) 형태로 레지스터를 명시하며 사용되지 않는 경우 그 값은
1111
이다.- L: 벡터 길이
- 0: 스칼라 또는 128비트 벡터
- 1: 256비트 벡터
- pp: SIMD 접두사와 동치인 opcode 확장
- 00: None
- 01:
66
- 10:
F3
- 11:
F2
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]: AVX-512에서 사용되는 4 바이트 길이의 접두사이다.
- [Opcode]: 1 바이트 길이로 수행하고자 하는 명령어의 종류를 지정한다.
- [Mod R/M]: 피연산자의 형태(레지스터/메모리) 및 메모리 주소 형식을 지정한다.
- (SIB):
형식으로 계산되는 메모리의 base 레지스터, index 레지스터 및 scale을 지정한다. 명령어에 따라 선택적으로 요구한다.[base + index * scale (+ disp.)]
- (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 확장)[편집]
APX 확장에서 추가된 GPR 또는 피연산자(New Data Destination)를 활용하기 위해 AVX-512의 EVEX 인코딩을 도입하였다.
- M2-M0 필드: opcode가 속한 map을 가리키는 필드이다.
- pp 필드: EVEX와 동일
- 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가 사용되는 경우 해당하는 레지스터를 지정하는 데 쓰이는 필드이다.
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. 정수 레지스터[편집]
[REX.R] A B C D REX.R/REX.X/REX.B 접두사 필요[APX] A B C D APX 확장. REX2 또는 EVEX 접두사를 사용해 인코딩됨[REX.W] 명령어에 따라 REX.W 접두사 필요
1.7.2. 부동소수점/벡터 레지스터[편집]
[3] x87과 동시에 사용할 수 없다.[EVEX] A B C EVEX 인코딩으로만 접근 가능. AVX-512 또는 AVX10 필요[VEX] VEX 또는 EVEX 인코딩으로만 접근 가능. AVX 필요
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[편집]
[각주]
2.1.1.1.1. INC[편집]
[각주]
2.1.1.2. ADC[편집]
[각주]
2.1.1.3. SUB[편집]
[각주]
2.1.1.3.1. DEC[편집]
[각주]
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. 논리 연산 명령어[편집]
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 확장[편집]
6. 연산 관련 확장 명령어[편집]
6.1. ABM/BMI1 명령어[편집]
6.1.1. ABM 명령어[편집]
6.1.1.1. POPCNT[편집]
6.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 명령어[편집]
이 문서의 내용 중 전체 또는 일부는 2023-10-20 02:30:11에 나무위키 AMD64/명령어 목록 문서에서 가져왔습니다.