명령어 한 줄의 정체
기계어는 CPU가 읽는 숫자이고, 어셈블리는 그 숫자에 붙인 이름입니다. C 한 줄이 몇 개의 숫자가 되는지 봅니다.
Flash에 저장된 펌웨어는 결국 숫자의 나열입니다. CPU는 이 숫자를 하나씩 읽어 "어떤 연산을, 어떤 레지스터로" 할지 해석합니다.
C: x = x + 1;
어셈블리: adds r3, r3, #1
기계어: 0x1C5B
16비트 숫자 0x1C5B 안에 "더하기, 즉시값 1, 레지스터 r3에서 r3로"가 비트 단위로 들어 있습니다. 어셈블러가 이름을 숫자로, 디스어셈블러가 숫자를 이름으로 바꿉니다.
명령어 종류
| 종류 | 예 | 하는 일 |
|---|---|---|
| 데이터 처리 | add, sub, and, lsl |
레지스터끼리 계산 |
| 메모리 접근 | ldr, str |
메모리 ↔ 레지스터 |
| 분기 | b, bl, bx |
실행 흐름 이동 |
| 비교 | cmp |
플래그 설정 |
ARM은 로드-스토어 구조라서 메모리 값을 바로 계산하지 못하고, 반드시 레지스터로 가져와(ldr) 계산한 뒤 다시 저장(str)합니다. C의 count++ 한 줄이 명령어 세 개가 되는 이유입니다.
왜 알아야 하나
하드폴트 주소를 따라가거나, 인터럽트와 공유하는 변수의 경쟁 조건을 이해하거나, 제어 루프 시간을 줄일 때 컴파일러가 만든 명령어를 봐야 합니다.