ARM 어셈블리는 RISC(Reduced Instruction Set Computer) 철학을 따르는 ARM 아키텍처의 저수준 언어다. 모바일·임베디드·Apple Silicon 등에서 사용된다.
ARM64 (AArch64) 레지스터
범용 레지스터: X0~X30 (64비트), W0~W30 (32비트 하위)
특수 레지스터:
SP (Stack Pointer): 스택 포인터
PC (Program Counter): 다음 명령 주소
LR (Link Register = X30): 반환 주소
XZR (Zero Register): 항상 0
함수 호출 규약 (AAPCS64):
인자: X0~X7
반환: X0~X1
임시: X9~X15 (callee가 보존 불필요)
보존: X19~X28 (callee가 보존 필요)
기본 명령어 (ARM64)
asm
// GNU ARM64 어셈블리
.global _start
.text
_start:
// MOV: 레지스터에 값 로드
mov x0, #42 // x0 = 42
mov x1, x0 // x1 = x0
// 산술 연산
add x2, x0, x1 // x2 = x0 + x1
sub x3, x2, #10 // x3 = x2 - 10
mul x4, x2, x3 // x4 = x2 * x3
udiv x5, x4, x2 // x5 = x4 / x2 (부호없음)
// 메모리 접근
ldr x0, [x1] // x0 = *x1 (로드)
str x0, [x1, #8] // *(x1+8) = x0 (저장)
ldp x0, x1, [sp] // 쌍 로드 (Load Pair)
stp x29, x30, [sp, #-16]! // 쌍 저장 + 스택 조정
// 분기
cmp x0, #0 // 비교 (flags 설정)
beq zero_label // ZF=1이면 분기
bl some_function // 서브루틴 호출 (LR에 반환주소)
ret // 반환 (X30으로 점프)
NEON SIMD (벡터 연산)
asm
// NEON: 128비트 SIMD 레지스터 (V0~V31)
// 벡터 덧셈: 한 번에 4개 float32 처리
ld1 {v0.4s}, [x0] // v0 = float32x4 로드
ld1 {v1.4s}, [x1] // v1 = float32x4 로드
fadd v2.4s, v0.4s, v1.4s // v2 = v0 + v1 (4개 동시)
st1 {v2.4s}, [x2] // 저장
// C 인라인 어셈블리 (GCC)
float32x4_t a, b, c;
asm volatile (
"fadd %0.4s, %1.4s, %2.4s"
: "=w"(c) : "w"(a), "w"(b)
);
관련 문서