본문 바로가기

임베디드 개발/ARM

ARM Register 동작이해

지난 글에 이어 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가 들어온다. 

 

디버깅 하다보면 자연스럽게 어셈블리어에 익숙해진다.

익숙해지면 디버깅에 도움이 된다.

예를 들어, 함수와 어셈블리어가 다르게 구성되는 것을 알 수 있게 되면

코드 영역을 누가 훼손시켰다던지, 잘못 코드가 로딩됨을 쉽게 알아차려

삽질?을 줄일 수 있다.