이번 포스트에서는 ARM 아키텍처를 이루는 주요 개념에 대해서 설명하겠습니다.
ARM 아키텍처를 배우려면 수 많은 세부 기능을 배워야 하는데 그 중 핵심을 요약하면 다음과 같습니다.
 
    ○ ARM 어셈블리 명령어
    ○ 레지스터 세트 
    ○ 익셉션 
    ○ 함수 호출 규약
 
이 중에서 먼저 ARM 어셈블리 명령어에 대해서 살펴보겠습니다. 
 
 ARM 프로세서에게 어셈블리 명령어란
 
우리가 외국인이 어떤 사람인지 잘 알려면 외국어를 배워야 합니다.
외국어를 직접 말하면서 외국인와 대화를 해야 그 사람의 성격을 제대로 알 수 있습니다.
 
그렇다면 프로그래머 입장에서 ARM 프로세서가 어떤 동작을 하는 지 파악하려면 무엇을 배워야 할 까요?
바로 ARM 어셈블리 명령어입니다.
 
미국인과 대화를 하려면 영어를 말하듯 ARM 프로세서와 대화를 하려면 ARM 어셈블리 명령어를 사용해야 합니다.
즉, ARM 어셈블리 명령어는 ARM 프로세서와 소통하는 대화하는 언어라고 말할 수 있습니다.
 
ARM 어셈블리 명령어를 사용하면 ARM 프로세서와 어떻게 대화를 할 수 있을까요?
이번에는 프로그래 입장에서 조금 더 구체적으로 ARM 프로세서와 대화하는 패턴을 예로 들겠습니다.
 
쉽게 설명을 하면 ARM 프로세서와는 대화하는 패턴을 2가지로 요약할 수 있습니다. 
 
   ○ ARM 프로세서에게 일을 시킨다.
   ○ ARM 프로세서의 상태 정보를 읽어 오고 싶다.
   
프로그래머 입장에서 위에서 언급한 패턴를 벗어나는 대화를 하는 경우는 드뭅니다. 
 
ARM 어셈블리 명령어의 포멧 
 
ARM 어셈블리 명령어는 명령어와 명령어를 수행한 결과를 저장하는 레지스터로 구성돼 있습니다.
예를 들어 다음 명령어를 설명하겠습니다.
 
   mov r1, #0x1
   
위 명령어를 mov라는 명령어인데 레지스터에 데이터를 저장하는 역할을 합니다. 
mov란 명령어를 실행하면 실행 결과는 어디에 저장될까요? 바로 레지스터 r1입니다.
   
처음에 ARM 어셈블리 명령어를 보고 공포에 질려 공부를 포기하는 분들이 많은데요.
ARM 어셈블리 명령어의 포멧은 다음과 같이 정말로 간단합니다.  
 
  ○ 명령어가 있고 명령어를 실행한 결과는 레지스터에 저장된다.
 
ARM 어셈블리와 공포심 
 
ARM 프로세서를 배울 때 가장 먼저 만나는 게 어셈블리 명령어입니다. 
기본적인 ARM 어셈블리 명령어를 소개하고 어셈블리 명령어가 동작하는 원리를 그림으로 설명하는 경우가 대부분입니다.
많은 개발자분들이 ARM 프로세서를 배울 때 어셈블리 명령어를 배울려고 노력하는 것도 사실입니다.
 
그런데 많은 개발자들은 ARM 어셈블리 명령어를 배울 때 부담스러워 합니다. 
어떤 분들은 ARM 어셈블리 명령어를 공부하는게 너무 고통스럽다고 합니다. 그러면서 다음과 같이 불만을 토로합니다.
 
  ○ ARM 어셈블리 명령어의 갯수가 너무 많다 외우기 어렵다.
 
그런데 실제 개발을 하면 자주 분석하는 ARM 엇메블리 명령어의 갯수는 20개 내외이고, 정말 자주 사용하는 어셈블리 명령어는 10개 이내이다.
 
그래서 자주 사용하는 ARM 어셈블리 명령어의 동작 원리를 제대로 파악해놓고, 처음 만나는 어셈블리 명령어는 그 때 그 때 용법을 파악해서 찾으면 됩니다.
 
우리가 처음 영어를 공부할 때를 생각해봅시다. 처음 영어를 배울 때 영어 사전에 있는 영어 단어를 무리해서 암기하려는 분이 있어요. 당연한 이야기지만,여러분이 영어 사전에 담긴 단어를 모두 외우려고 하면 부담되고 힘이 들 것입니다.
 
하지만 중고등학교에서 배우는 영어 단어로를 제대로 활용해도 외국인과 소통하는데 아무런 지장이 없습니다. 
 
ARM 어셈블리 명령어는 레지스터와 함께 구성돼 있습니다.
레지스터는 별 게 아니다. ARM 코어 내부에서 연산 결과를 저장하는 메모리 공간에 불과합니다.
 
레지스터만을 사용해 ARM 어셈블리 명령어를 수행하면 ARM 코어는 가장 빠른 사이클 내에 연산을 수행합니다.
한 가지 예를 들어볼까요?
 
mov r1, r2
 
위 명령어를 실행하면 레지스터 r2에 있는 데이터를 레지스터 r1에 저장합니다. 이런 명령어를 실행하면 ARM 코어는 가장 빠른 사이클 내에 명령어를 처리합니다.
 
그래서 최적화 레벨을 높혀서 ARM-GCC 컴파일러를 사용하면 되도록 레시스터를 사용해 연산 결과를 저장하려고 노력합니다.

+ Recent posts