지난 실습에 이어
ARM의 stack 동작을 살펴본다.
sort.c 파일에서 qs_string_compare함수 진입 전 후에 breakpoint를 잡고
F8로 진행시킨다.
Disassembly 창을 보면
push {r4,lr} : r4, lr을 stack에 저장
pop {r4,pc} : stack 포인터 위치에 저장된 값을 r4, pc 로 복원
함수 진입 전에 저장해야할 레지스터 값과 돌아올 PC 값을 stack에 저장한 뒤
함수 처리가 끝나면 복원하는 동작이다.
스택 동작을 직접 눈으로 보기위해서
SP 주소(0x800CFAE8, 가장 우측 창의 파란색 표시)를 메모리 창에 입력한다.
스택이 보는 방향에서 위로 자라나서 (낮은 주소 방향)
확인하기 쉽도록 0x800CFA00주소를 입력했다.
F8을 눌러 다음 브레이크 포인트까지 가본다.

하기 두 값이,
R4: 0x800D10BC
LR: 0x8001624
이 스택에 저장되고 (Memory 탭에 파란색 부분, 왼쪽에서부터 3번째 창)
스택 포인터(가장 우측 창의 파란색 부분)는 8byte 감소한, 0X800CFAE0 가 되었다.

F5를 눌러 POP을 수행해보자
스택에 저장된 값이 R4, PC로 복원되었고(가장 우측 창)
스택 포인터 값은 함수 진입 전의 위치, 0x800CFAE8로 돌아왔다(가장 우측 창의 노란색 부분).
이렇게 하여 PC값도 0x80001624 로 잘 돌아와있다(왼쪽에서부터 2번째 창에 => 표시가 PC값).

ARM exception이 발생했을 때
이 스택의 동작 원리를 이용하여
디버깅에 활용이 가능하다.
스택 포인터가 위치한 곳으로부터 낮은 주소 방향을 보면
저장된 돌아올 PC값(코드 메모리 주소 내 영역의 값)을 참고하여
어떤 함수를 거쳐갔는지를 알 수 있다(함수 인라인화 된 부분 제외).
(함수의 주소는 디버거에서도 바로 확인이 되고(Trace32 장비에서는 d.l 주소)
링커의 map 파일을 생성하게 해서 참고하면 된다.)
ARM 디버깅을 하다보면,
자연스레 어셈블리어를 많이 보게 되고
C언어가 어떻게 어셈블리어로 변환되서 수행되는지를 알게될 것이다.
'임베디드 개발 > ARM' 카테고리의 다른 글
| ARM Register 동작이해 (0) | 2020.04.13 |
|---|---|
| ARM Exception 디버깅 실습 (0) | 2020.04.10 |
| ARM DS-5 예제 초기화 코드 분석 (startup_Cortex-A9_GCC) 방법 (0) | 2020.04.10 |
| ARM DS-5 Community Edition 설치 및 실행 (0) | 2020.04.09 |