그라운드 임베디드 유튜브 구독

노트 / 기계어와 어셈블리

Thumb 명령어 읽기

Cortex-M이 쓰는 Thumb 명령어 집합에서 자주 나오는 MOV, LDR, STR, B, BL을 실제 디스어셈블 예로 읽어 봅니다.

GROUND EMBEDDED · 정리 노트기계어 02Thumb 명령어 읽기 1ldr r3, =0x40020014 ; GPIOA_ODR 주소 2ldr r2, [r3] ; 현재 값 읽기 3orr r2, r2, #0x20 ; 5번 비트 켜기 4str r2, [r3] ; 다시 쓰기

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);입니다. 읽기와 쓰기 사이에 인터럽트가 같은 레지스터를 바꾸면 그 변경이 사라진다는 점이 명령어 단위로 보입니다.