명령어 집합 | |
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 |
[clearfix]
1. 개요
ARMv8-A 아키텍처의 명령어 목록.1.1. 약어 설명
- Rd: destination register.
- Rt: target register.
- Rn/Rm:
1.2. 표기법
1.3. 명령어 인코딩
ARMv8-A ISA에서 명령어는 32-bit 길이로 인코딩되며, MIPS 및 RISC-V 등의 다른 RISC ISA에 비해 명령어 인코딩이 복잡한 편이다.비트 | 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20:19 | 18:16 | 15:12 | 11:10 | 9:8 | 7:5 | 4 | 3:2 | 1:0 | |
(op0=100x )
|
- |
1
|
0
|
0
|
op0 | - | |||||||||||||||
PC-rel | op | immlo |
1
|
0
|
0
|
0
|
0
|
immhi | Rd | ||||||||||||
Add/Sub(imm) | sf | op | S |
1
|
0
|
0
|
0
|
1
|
shift | imm12 | Rn | Rd | |||||||||
Logical(imm) | sf | opc |
1
|
0
|
0
|
1
|
0
|
0
|
N | immr | imms | Rn | Rd | ||||||||
Move wide(imm) | sf | opc |
1
|
0
|
0
|
1
|
0
|
1
|
hw | imm16 | Rd | ||||||||||
Bitfield | sf | opc |
1
|
0
|
0
|
1
|
1
|
0
|
N | immr | imms | Rn | Rd | ||||||||
Extract | sf | op21 |
1
|
0
|
0
|
1
|
1
|
1
|
N | o0 | Rm | imms | Rn | Rd | |||||||
(op0=100x )
|
op0 |
1
|
0
|
1
|
op1 | - | |||||||||||||||
Cond. Branch(imm) |
0
|
1
|
0
|
1
|
0
|
1
|
0
|
o1 | imm19 | o0 | cond | ||||||||||
Except. gen.(imm) |
1
|
1
|
0
|
1
|
0
|
1
|
0
|
0
|
opc | imm16 | op2 | LL | |||||||||
System |
1
|
1
|
0
|
1
|
0
|
1
|
0
|
1
|
0
|
0
|
L | op0 | op1 | CRn | CRm | op2 | Rt | ||||
Branch (reg) |
1
|
1
|
0
|
1
|
0
|
1
|
1
|
opc | op2 | op3 | Rn | op4 | |||||||||
Branch (imm) | op |
0
|
0
|
1
|
0
|
1
|
imm26 | ||||||||||||||
Comp. & Branch (imm) | sf |
0
|
1
|
1
|
0
|
1
|
0
|
op | imm19 | Rt | |||||||||||
Test & Branch (imm) | b5 |
0
|
1
|
1
|
0
|
1
|
1
|
op | b40 | imm14 | Rt | ||||||||||
(op0=x1x0 )
|
op0 | - | op1 |
1
|
op2 |
0
|
op3 | - | op4 | - | op5 | - |
1.4. 레지스터
ARMv8-A ISA에서는 정수 레지스터 31개, 부동소수점 레지스터 32개 및 SP(stack pointer), PC(program counter) 등을 정의한다.1.4.1. 정수 레지스터
레지스터 번호는 5 bit로 인코딩되며, 0-30은 레지스터 R0-R30, 31(0b11111
)은 상수 0인 ZR(zero register)를 의미한다.- 32-bit: W0-W30. R0-R30의 하위 32비트에 해당한다.
- 64-bit: X0-X30. R0-R30의 하위 64비트에 해당한다.
1.4.2. 부동소수점/벡터 레지스터
부동소수점/벡터 레지스터는 V0-V31로 표기한다.- 8-bit: B0-B31
- 16-bit: H0-H31
- 32-bit: S0-S31
- 64-bit: D0-D31
- 128-bit: Q0-Q31
1.4.3. 특수 레지스터
- SP: Stack Pointer (64-bit).
- PC: Program Counter (64-bit). 현재 실행되는 명령어의 주소를 가리킨다.
- FPCR: Floating Pointer Control Register
- FPSR: Floating Pointer Status Register
- PSTATE: Processor State
- 조건 플래그 (NZCV)
- N: Negative
- Z: Zero
- C: Carry
- V: Overflow
- 예외 마스크 (DAIF)
- D: Debug exception mask bit
- A: SError interrupt mask bit
- I: IRQ interrupt mask bit
- F: FIQ interrupt mask bit
2. 명령어 목록
명령어 분류는 ARMv8-A 레퍼런스 매뉴얼을 따른다. (단, 서술 순서는 다를 수 있다.)2.1. 데이터 처리 (레지스터) 명령어
====# 세부 인코딩 #====2.2. 데이터 처리 (Immediate) 명령어
명령어 | mnemonic | op0 | op/opc | S | 버전 | 비고 |
PC-rel. addressing | ||||||
ADR |
ADR , <label>
|
00x
|
0
|
- | 8.0 | |
ADRP |
ADRP , <label>
|
00x
|
1
|
- | 8.0 | |
Add/subtract (immediate) | ||||||
ADD |
ADD <Wd|WSP>, <Wn|WSP>, #{, <shift>} ADD <Xd|WSP>, <Xn|WSP>, #<imm>{, <shift>}
|
01x
|
0
|
0
|
8.0 | sf로 32-bit/64-bit 지정 |
ADDS |
ADDS <Wd|WSP>, <Wn|WSP>, #{, <shift>} ADDS <Xd|WSP>, <Xn|WSP>, #<imm>{, <shift>}
|
01x
|
0
|
1
|
8.0 | sf로 32-bit/64-bit 지정 |
SUB |
SUB <Wd|WSP>, <Wn|WSP>, #{, <shift>} SUB <Xd|WSP>, <Xn|WSP>, #<imm>{, <shift>}
|
01x
|
1
|
0
|
8.0 | sf로 32-bit/64-bit 지정 |
SUBS |
SUBS <Wd|WSP>, <Wn|WSP>, #{, <shift>} SUBS <Xd|WSP>, <Xn|WSP>, #<imm>{, <shift>}
|
01x
|
1
|
1
|
8.0 | sf로 32-bit/64-bit 지정 |
Logical (immediate) | ||||||
AND |
AND <Wd|WSP>, , #<imm> AND <Xd|WSP>, <Xn>, #<imm>
|
100
|
00
|
- | 8.0 | sf로 32-bit/64-bit 지정 |
ORR |
ORR <Wd|WSP>, , #<imm> ORR <Xd|WSP>, <Xn>, #<imm>
|
100
|
01
|
- | 8.0 | sf로 32-bit/64-bit 지정 |
EOR |
EOR <Wd|WSP>, , #<imm> EOR <Xd|WSP>, <Xn>, #<imm>
|
100
|
10
|
- | 8.0 | sf로 32-bit/64-bit 지정 |
ANDS |
ANDS <Wd|WSP>, , #<imm> ANDS <Xd|WSP>, <Xn>, #<imm>
|
100
|
11
|
- | 8.0 | sf로 32-bit/64-bit 지정 |
Move wide (immediate) | ||||||
MOVN |
MOVN , #<imm>{, <shift>} MOVN <Xd>, #<imm>{, <shift>}
|
101
|
00
|
- | 8.0 | sf로 32-bit/64-bit 지정 |
MOVZ |
MOVZ , #<imm>{, <shift>} MOVZ <Xd>, #<imm>{, <shift>}
|
101
|
10
|
- | 8.0 | sf로 32-bit/64-bit 지정 |
MOVK |
MOVK , #<imm>{, <shift>} MOVK <Xd>, #<imm>{, <shift>}
|
101
|
11
|
- | 8.0 | sf로 32-bit/64-bit 지정 |
Bitfield | ||||||
SBFM |
SBFM , <Wn>, #<immr>, #<imms> SBFM <Xd>, <Xn>, #<immr>, #<imms>
|
110
|
00
|
- | 8.0 | sf로 32-bit/64-bit 지정 |
BFM |
BFM , <Wn>, #<immr>, #<imms> BFM <Xd>, <Xn>, #<immr>, #<imms>
|
110
|
01
|
- | 8.0 | sf로 32-bit/64-bit 지정 |
UBFM |
UBFM , <Wn>, #<immr>, #<imms> UBFM <Xd>, <Xn>, #<immr>, #<imms>
|
110
|
10
|
- | 8.0 | sf로 32-bit/64-bit 지정 |
Extract | ||||||
EXTR |
EXTR , <Wn>, <Wm>, #<lsb> EXTR <Xd>, <Xn>, <Xm>, #<lsb>
|
111
|
000
|
- | 8.0 | sf로 32-bit/64-bit 지정 |
LSL #0
(00
), LSL #12
(01
) 2가지이며 1x
는 예약된 인코딩이다.====# 세부 인코딩 #====
비트 | 31 | 30 | 29 | 28 | 27:26 | 25 | 24 | 23 | 22 | 21 | 20:16 | 15:10 | 9:5 | 4:0 |
opcode | - |
op0=100x
|
- | |||||||||||
(sub encoding) | - |
100
|
op0 | - | ||||||||||
PC-rel | op | immlo |
100
|
00
|
immhi | Rd | ||||||||
Add/Sub(imm) | sf | op | S |
100
|
01
|
shift | imm12 | Rn | Rd | |||||
Logical(imm) | sf | opc |
100
|
10
|
0
|
N | immr | imms | Rn | Rd | ||||
Move wide(imm) | sf | opc |
100
|
10
|
1
|
hw | imm16 | Rd | ||||||
Bitfield | sf | opc |
100
|
11
|
0
|
N | immr | imms | Rn | Rd | ||||
Extract | sf | op21 |
100
|
11
|
1
|
N | o0 | Rm | imms | Rn | Rd |
- Rd: 값을 기록할 레지스터
- Rn(, Rm): 값을 읽을 레지스터
- N, imms, immr: bitmask를 만드는 데 쓰이는 인자들이다. N 값은 32비트일 때(sf=0) 무시된다. imms는 bitmask 패턴의 크기 및 1의 수를 지정하는 데 사용되고, immr은 이렇게 만들어진 비트마스크를 몇 칸 회전시킬지를 지정하는 인자이다.
-
shift:
LSL #0
(00
),LSL #12
(01
) 2가지 값을 지정 가능하며1x
는 예약된 인코딩이다. - hw: LSL 값을 16으로 나눈 값이다.
2.3. Load/Store 명령어
2.3.1. Load register (literal)
명령어 | mnemonic | opc | V | 비고 |
LDR |
|
00
|
0
|
32-bit |
LDR |
|
01
|
0
|
64-bit |
LDRSW |
|
10
|
0
|
|
PRFM |
|
10
|
0
|