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 를 따르기 때문에 반드시 각 레지스터의 이름과 역할에 대해서는 숙지하고 있어야 한다.

왜 GNU 어셈블리어 인가?

현재 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 어셈블리어를 중점적으로 설명할 것이다.

APCS(ARM Procedure Standard Call)

다음의 규칙을 따른다.

  1. a1 ~ a4(caller-saved) : 함수로 넘기는 인수를 담음, v1 ~ v5(callee-saved) : 함수 내부에서 임의로 사용
  2. 부동 소수점일 경우 해당 레지스터에서 부동 소수점 레지스터로 복사한다(하드웨어 지원).
  3. 인수가 4 개 이하일 경우 레지스터만을 사용하며, 4 개를 초과하는 인수는 스택에 역순으로 들어간다.
  4. 가변 길이 인수(va_arg) 역시 스택으로 처리한다.
  5. 워드를 초과하는 인수는 레지스터와 스택으로 나뉘어져 전달한다.
  6. 정수와 같은 결과값은 a1 을 통해 반환하며, 복잡한 결과값은 a1 에 결과값을 담은 주소를 넣고 반환한다.

스택(stack) 포인터

아래의 그림은 ARM 아키텍처에서 메모리가 할당되는 모습을 대략적으로 나타낸 그림이다.
스택은 위에서 아래로 증가하고, 힙은 아래에서 위로 증가한다. 스택 포인터는 마지막 스택을 가리키거나, 마지막 스택의 다음 빈 스택 공간을 가리키는 역할을 한다.

간단한 예제 소스를 통해 어떻게 스택 포인터가 동작하는지 이해하자.

  • computer/rtcclab/gnu_arm_assembly_의_이해.txt
  • Last modified: 4 years ago
  • by likewind