본문 바로가기

카테고리 없음

[ASM] {} , [] 사용법

✅ 1. {}의 의미: 문맥에 따라 다름

 

✔️ A. PUSH/POP {r0, r1, ...}에서의 {}

이건 레지스터 묶음을 나타내는 문법적 표현이야.
즉, POP {r0, r1, r2} → SP가 가리키는 메모리 주소에서 값을 꺼내서 해당 레지스터에 저장한다는 뜻이야.

 

예:

POP {r0}
 

→ 현재 스택에 가장 위에 있는 값을 r0에 저장하고,
→ SP를 4만큼 증가시킴.

 

✔️ B. MRS r0, cpsr처럼 시스템 레지스터 접근 시

여기서 {}는 사용하지 않아. 시스템 레지스터 이름 자체를 명시해.

asm
 
MRS r0, cpsr ; 시스템 레지스터 'cpsr' 값을 r0로
MSR cpsr, r0 ; r0에 있는 값을 시스템 레지스터 'cpsr'로 복사
 

즉, 시스템 레지스터를 읽고 쓸 땐 MRS, MSR 명령어를 사용하고, {}는 쓰지 않아.

 

✅ 2. 정리


표현 의미
{r0, r1} 레지스터 묶음 표현 (PUSH/POP, LDM/STM 같은 명령어에서 사용됨)
MRS r0, cpsr 시스템 레지스터 cpsr 값을 일반 레지스터 r0로 복사
MSR cpsr, r0 일반 레지스터 r0의 값을 시스템 레지스터 cpsr에 저장
POP {r0} sp가 가리키는 값을 r0에 넣고, sp를 4 증가

 

 

 

🔹 1) 왜 {cpsr}를 PUSH 하지 않는가?

ARM 아키텍처에서는 cpsr 같은 시스템 레지스터는 일반적인 PUSH/POP 대상이 아니다.

 

이유

  • {} 안에 들어가는 건 "일반 레지스터들 (r0~r15, lr 등)" 만 가능함.
  • cpsr은 시스템 레지스터이기 때문에, PUSH {cpsr}처럼 직접 스택에 넣을 수 없음.

✅ 그래서 대체 방법으로 MRS를 사용해서 일반 레지스터(r0 등)에 먼저 옮긴 다음 PUSH하는 것이다.

📌 시스템 레지스터들은 보안성 & 제어 특성상 직접 접근에 제한이 있어. 반드시 전용 명령어 (MRS, MSR) 사용!

 

 

🔹 r13,14,15는 sp, lr, pc인 특수 목적의 레지스터인데, {} 사용 가능한 이유는?

특수한 용도의 레지스터지만, 일반 레지스터의 범주에 속한다. 따라서 {}안에 넣어서 PUSH, POP 가능하다.

 


🔹 2) {} vs [] 차이점


 

표현식 의미 예시  결과
{} 레지스터 묶음 PUSH {r0, r1} r0, r1의 값을 스택에 저장
[] 메모리 주소 접근 LDR r0, [r1] r1이 가리키는 주소의 값을 r0에 로드

 

✅ {} (중괄호): 레지스터 집합

  • 사용: PUSH, POP, STM, LDM 등의 명령에서 여러 레지스터를 한 번에 다룰 때 사용
  • 예:
  • PUSH {r4, r5, lr} ; r4, r5, lr를 현재 sp 위치에 저장하고 sp를 감소시킴

✅ [] (대괄호): 메모리 간접 참조

  • 사용: 레지스터가 가리키는 메모리 주소의 값에 접근할 때 사용
  • 예:
  •  
    LDR r0, [r1] ; r1이 가리키는 주소의 값을 r0에 로드
  • STR r2, [r3] ; r2의 값을 r3가 가리키는 주소에 저장

🔚 예제 정리

asm
MRS r0, cpsr ; 시스템 레지스터 → 일반 레지스터 PUSH {r0} ; 일반 레지스터 → 스택
asm
 
LDR r1, [r0] ; r0이 가리키는 메모리 주소에 접근 → 그 값을 r1에
asm
 
PUSH {r4, r5, lr} ; 레지스터들 직접 스택에 저장