Thumb 명령어 읽기
Cortex-M이 쓰는 Thumb 명령어 집합에서 자주 나오는 MOV, LDR, STR, B, BL을 실제 디스어셈블 예로 읽어 봅니다.
Cortex-M은 16비트와 32비트 명령어가 섞인 Thumb-2 명령어만 씁니다. 코드 크기가 작은 것이 장점입니다.
자주 보는 명령어
| 명령어 | 의미 |
|---|---|
movs r0, #5 |
r0 = 5 |
ldr r1, [r0] |
r1 = r0이 가리키는 메모리 값 |
ldr r1, [r0, #4] |
r1 = *(r0 + 4) |
str r1, [r0] |
r0이 가리키는 메모리에 r1 저장 |
orr r1, r1, #32 |
r1 |= 0x20 |
cmp r0, #10 |
r0과 10 비교, 플래그 설정 |
bne label |
같지 않으면 label로 |
bl func |
func 호출 (돌아올 주소를 lr에) |
bx lr |
함수에서 돌아가기 |
push {r4, lr} / pop {r4, pc} |
레지스터 저장 / 복원하며 복귀 |
읽어 보기
ldr r3, =0x40020014 ; GPIOA_ODR 주소
ldr r2, [r3] ; 현재 값 읽기
orr r2, r2, #0x20 ; 5번 비트 켜기
str r2, [r3] ; 다시 쓰기
C의 GPIOA->ODR |= (1 << 5);입니다. 읽기와 쓰기 사이에 인터럽트가 같은 레지스터를 바꾸면 그 변경이 사라진다는 점이 명령어 단위로 보입니다.