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

노트 / 기계어와 어셈블리

명령어 한 줄의 정체

기계어는 CPU가 읽는 숫자이고, 어셈블리는 그 숫자에 붙인 이름입니다. C 한 줄이 몇 개의 숫자가 되는지 봅니다.

GROUND EMBEDDED · 정리 노트기계어 01명령어 한 줄의 정체 1C: x = x + 1; 2어셈블리: adds r3, r3, #1 3기계어: 0x1C5B

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++ 한 줄이 명령어 세 개가 되는 이유입니다.

왜 알아야 하나

하드폴트 주소를 따라가거나, 인터럽트와 공유하는 변수의 경쟁 조건을 이해하거나, 제어 루프 시간을 줄일 때 컴파일러가 만든 명령어를 봐야 합니다.