많은 분들이 ARM 프로세스를 익히기 어렵다고 말합니다. 물론 저도 마찬가지였고요.
그렇다면 ARM 프로세스가 어려운 이유가 뭘까요? 
 
ARM 프로세스 자체가 어렵기보다는 ARM 프로세스를 익히는 방법에 문제가 있기 때문입니다.
달리 말하면 ARM 프로세스 내용은 그리 어렵다는 이야기입니다.
 
자, 그럼 ARM 프로세스의 핵심 개념이 무엇인지 살펴볼까요? ARM 프로세스 범위는 넓게 보면 MMU부터 캐시까지 다양하나 핵심 내용은 다음과 같이 좁힐 수 있습니다.
- 어셈블리 명령어
- 익셉션
- ARM 모드(ARMv7/ARMv8)
- 함수 호출 규약(Calling Convention)
 
이 밖에도 MMU, Cache(L1/L2) 등등 깊게 살펴볼 주제가 있습니다. 위에서 언급한 내용만 제대로 파악하면 임베디드 개발자로써 프로그래밍이나 디버깅하는데 문제가 없습니다.
 
제가 ARM 프로세스는 그 내용 자체가 어렵다기 보다는 ARM 프로세스를 익히는 방법이 효율적이기 못하다고 말씀드렸습니다. 그러면 위에서 언급한 4가지 핵심 주제로 토대로 조금 더 설명을 드리겠습니다.
 
어셈블리 명령어
 
'어셈블리 명령어'란 말만 들어도 머리가 멍해지는 분 있나요? 한번 손 들어보세요! 
제가 예전에 ARM 프로세스의 어셈블리 명령어를 공부할 때 정말 낯설었습니다. 아무리 어셈블리 명령어를 읽어도 머리 속에 남지 않고 바로 튕겨 나가는 듯한 느낌이었어요. 그 이유는 무엇일까요?
 
   "어셈블리 명령어를 문법 위주로 익혔기 때문입니다." 
 
어셈블리 명령어를 읽으면 일단 무슨 소리인지 이해는 갑니다. 그런데 어셈블리 명령어를 알면 뭐합니까? 
 
   "실제 프로그래밍을 할 때 써 먹는게 중요하지오!"
 
그럼 어셈블리 명령어 한 개를 예를 들어볼까요?
 
ldr r2 [r3]
 
위 명령어는 r3 레지스터가 담고 있는 값을 r2 레지스터에 저장하라는 의미입니다. 
다음과 같이 r3가 0xD000C000이고 0xD000C000에 0x2가 있다고 가정하겠습니다.
 
주소              값
---------------------
0xD000C000   0x2
0xD000C004   0x4
 
이 조건에서 'ldr r2 [r3]' 명령어를 실행하면 r2는 어떻게 업데이트될까요?
 
   "0x2가 됩니다."
 
자, 우리는 'ldr' 명령어를 알게 됐습니다. '난 이제 새로운 ARM 어셈블리 명령어를 알게 됐어'라고 생각하면 자신을 칭찬할 수 있습니다. 하지만 이처럼 공부하는 것은 정말 비효율적입니다.
 
    "그 이유는 이 방식으로 공부하는 까 먹을 확률이 99.9% 이기 때문입니다."
 
'ldr' 명령어만 배우는 것은 사실 공학적으로 아무런 의미가 없습니다. 그러면 ldr 명령어를 어떻게 배워야 머리 속에 오랫 동안 남을까요?
 
   "C 프로그램으로 작성한 코드가 ldr 명령어로 어떻게 변환되는지 알아야 합니다."
 
다시 말하면 우리가 작성한 C 코드가 ldr 명령어에 어떻게 대응하는지 알아야 한다는 것입니다.
 
다음 시간에는 실제 C 코드가 ARM 어셈블리 코드로 어떻게 변환되는지 알아보겠습니다.
 

< '시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리' 저자>

 
 

+ Recent posts