기존의 명령어 셋
- Thumb 명령어셋
- ARM 명령어셋
Thumb 명령어
- 16비트 고정 길이 명령어
- 코드 크기 줄이고, 메모리 절약
ARM 명령어
- 32비트 고정 길이 명령어
- 고성능, 풍부한 연산기능 제공
Thumb과 ARM 명령어셋 비교

- 메모리 대역폭이 32bit일때
- 한번에 32비트 가져올 수 있음 → ARM에유리
- Thumb명령어는 16비트지만, decode는 결국 fetch당 한번만 수행 → 이득없음
- 메모리 대역폭이 16bit일때
- ARM명령어는 2번 fetch필요 → 비효율
- Thumb명령어는 1번fetch로 충분 → 효율적
그래서 Thumb2 명령어 사용
Thumb와 ARM 명령어를 번갈아서 사용하면, overhead가 생긴다.
→ 성능 저하 발생
따라서, Thumb와 ARM을 혼합한 Thumb2를 사용하는데,
모드 전환이 필요없기 때문에 성능 저하가 발생하지 않는다.
속도는 25%, 코드사이즈는 26% 더 좋다.

Register

범용 레지스터 : 일반적인 연산의 결과
- R0 ~ R7 : Thumb1에서 사용
- R0 ~ R12 : Thumb2에서 사용
스택 메모리에 저장되는 것
- 전달 인자
- 지역 변수
- 컨텍스트
- 리턴 주소
- 프레임 포인터(r7 or r11)
프레임 포인터란?
스택 Push/Pop 동작
Push 동작
push sp, {r7, lr}
- sp가 먼저 8 바이트 감소한 후, 그 위치에 r7, lr 값이 저장됩니다.
- 즉, Full Descending Stack은:
- Full: sp가 이미 사용 중인 위치를 가리킨다
- Descending: 스택이 아래 방향으로 확장된다 → 주소가 작아지는 방향으로 push를 진행한다.
Pop 동작
pop sp, {r7, lr}
- 현재 sp가 가리키는 주소에 있는 값을 r7, lr에 저장하고, 이후 sp는 8 바이트 증가합니다.
리틀 엔디안
- ARM은 기본적으로 리틀 엔디안으로 동작하므로, 메모리에 저장할 때 하위 바이트가 먼저 저장됩니다.
- 예: 0x12345678을 저장하면 메모리에는 아래처럼 저장됨
- 주소 값 0x00 0x78 0x01 0x56 0x02 0x34 0x03 0x12
Handler mode, Thread mode
- Thread mode
- 기본 실행모드 , main()함수 등 일반코드
- handler mode
- 인터럽트 / exception 발생 시
- IRQ handler
[흐름]
thread mode → 인터럽트 발생 → handler mode → 인터럽트 종료 → thread mode 복귀
특권 / 비특권
- Thread mode : privileged 혹은 unprivileged 가능
- Handler mode : 항상 privileged 만 가능 (익셉션은 반드시 시스템 권한이 있어야함)
Banked Register 구조
스택 포인터 레지스터(sp)말고도, msp(시스템/커널/인터럽트용), psp(사용자 task용)가 있음.
특권/비특권에 따라서 혹은 mode에 따라서 msp, psp둘중에 어떤 걸 alias할지 고른다.
현재 모드 권한 수준 sp가 가리키는 스택
| Handler Mode | 항상 Privileged | MSP (고정) |
| Thread Mode | Privileged | MSP 또는 PSP 설정 가능 |
| Thread Mode | Unprivileged | PSP만 사용 가능 |
'ARM arch > Cortex-M' 카테고리의 다른 글
| cortex-m3 AMBA와 메모리 맵 (0) | 2025.07.14 |
|---|---|
| 2025.07.09 - ARM assembly 프로그래밍2 (0) | 2025.07.09 |
| 2025.07.07 - ARM assembly 프로그래밍1 (0) | 2025.07.08 |
| 빅 엔디언, 리틀 엔디언 (0) | 2025.07.02 |
| AAPCS (0) | 2025.06.30 |