Record & Replay 를 위해서 필수 불가결하게 알고 있어야 할 GNU ARM 어셈블리어(Assembly Language)에 대해서 설명하고 있다.
아마도, 어셈블리어에 관한 최초의 문서가 아닐까 싶다.
내가 흔히 알고 있는 것은 기존의 어셈블리어 관련 서적에서 언급하는 프로그램의 최적화를 위해서 사용하는 것이었다.
하지만, 어셈블리어가 아닌 High Language(C 나 C++) 에서는 레지스터를 직접적으로 접근할 수 없기 때문에 어셈블리어를 필수적이라고 볼 수 있다.
ARM 아키텍처의 레지스터들은 아래표와 같이 APCS(ARM Procedure Call Standard) 에서 정의하는 이름으로 나타내어 진다.
레지스터 | APCS 이름 | APCS 역할 |
0 | a1 | 인수1/정수 결과/임시 레지스터 |
1 | a2 | 인수2/임시 레지스터 |
2 | a3 | 인수3/임시 레지스터 |
3 | a4 | 인수4/임시 레지스터 |
4 | v1 | 레지스터 변수 1 |
5 | v2 | 레지스터 변수 2 |
6 | v3 | 레지스터 변수 3 |
7 | v4 | 레지스터 변수 4 |
8 | v5 | 레지스터 변수 5 |
9 | sb/v6 | 정적 베이스/레지스터 변수 6 |
10 | sl/v7 | 스택 한계/레지스터 변수 7 |
11 | fp | 프레임 포인터 |
12 | ip | 임시 레지스터 |
13 | sp | 현재 스택 프레임 아래 끝 |
14 | lr | 링크 주소/임시 레지스터 |
15 | pc | 프로그램 카운터 |
예를 들어, pc 라는 레지스터의 주소값(0x80000000)을 지정해주지 않아도 pc 라는 이름으로 지정이 가능하다. ARM 어셈블리어는 APCS 를 따르기 때문에 반드시 각 레지스터의 이름과 역할에 대해서는 숙지하고 있어야 한다.
현재 ARM 아키텍처에서 가장 많이 사용되고 있는 어셈블리어는 크게 두 가지이다. 하나는 ARM 사에서 만든 ADS 어셈블리어이고, 다른 하나는 GNU 어셈블리어이다. ADS 어셈블리어는 ADS 컴파일러에 의해서 만들어지는 어셈블리 코드로서, 현재 ARM 사에 나온 IDE 툴이나 디버거 장비에 사용되어 진다.
GNU 어셈블리어는 arm-linux-gcc 컴파일러에 의해서 만들어지는 어셈블리 코드이다. GNU 어셈블리어는 특히 IDE 툴이나 디버거 장비에서 완벽하게 지원되는 경우(Trace32)가 별로 없기 때문에 실제로 제품 개발에는 ADS 어셈블리어가 많이 사용한다.
VPOS 의 경우에는 arm-linux-gcc 컴파일러를 사용하기 때문에, ARM 사에서 나온 IDE 툴(CodeWarrior, Realview Debugger 등)과 디버거 장비(Realview ICE 등) 에서 사용이 불가능하거나 제한적이다. 개인적인 생각은 하나의 어셈블리어로 통합했으면 하는 바람이다. 하나의 아키텍처에 대해서 여러가지 어셈코드가 존재한다는 것은 사용하는 데, 있어서 매우 비효율적이다.
이런 이유로 이 문서에서는 GNU ARM 어셈블리어를 중점적으로 설명할 것이다.
다음의 규칙을 따른다.