✅ 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} ; 레지스터들 직접 스택에 저장