최근 수정 시각 : 2024-08-18 17:09:07

ARMv8-A/명령어 목록


명령어 집합
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

1. 개요
1.1. 약어 설명1.2. 표기법1.3. 명령어 인코딩1.4. 레지스터
1.4.1. 정수 레지스터1.4.2. 부동소수점/벡터 레지스터1.4.3. 특수 레지스터
2. 명령어 목록
2.1. 데이터 처리 (레지스터) 명령어2.2. 데이터 처리 (Immediate) 명령어2.3. Load/Store 명령어
2.3.1. Load register (literal)
2.4. 분기 및 제어 명령어

[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 지정
shift 값은 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
====# 세부 인코딩 #====

2.4. 분기 및 제어 명령어

====# 세부 인코딩 #====