지난 글에 이어 ARM register 들이 어떻게 동작하는지 살펴본다.
sorts.c 에 qs_string_compare 에 breakpoint를 잡는다.

이 함수는 a, b 인자를 가진다.
변수 창에 보면 파란색 값이 보인다.

이제 레지스터 탭을 가보자
R0에 a의 값이, R1이 b의 값이 있음을 알 수 있다.

Disassembly 창을 보자

R0, R1을 활용하고 있다는 것을 알 수 있다.
어셈블리어 LDR r1, [r1, #0] 는
r1의 주소값의 offset 0의 값을 r1에 로드하라는 것이다.
로드 되는지 확인해보자.
메모리 탭에서 해당 주소의 값을 보면,

0x800D09E8의 주소의 0번째 offset 값은 0x800CFEC4 이다.
자 이 값이 R1에 로드되는지 F5(step)를 눌러 확인해보자

참고로, 전달 인자 값이 많으면 스택을 이용한다.
C++을 사용하면, R0에 this point가 들어온다.
디버깅 하다보면 자연스럽게 어셈블리어에 익숙해진다.
익숙해지면 디버깅에 도움이 된다.
예를 들어, 함수와 어셈블리어가 다르게 구성되는 것을 알 수 있게 되면
코드 영역을 누가 훼손시켰다던지, 잘못 코드가 로딩됨을 쉽게 알아차려
삽질?을 줄일 수 있다.
'임베디드 개발 > ARM' 카테고리의 다른 글
| ARM Stack 동작 이해 (0) | 2020.04.12 |
|---|---|
| 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 |