2012. 10. 3. 23:06

ARM 공부를 함에 있어서 나름 외우기 쉽게 이해한 내용만 정리해 보는 장이다.


R15 = PC?!
R14 = Link Register? -> EBP ?!
R13 = SP?!
R12 =  ?! – 그냥 막쓰는 기분..
R0 = 값 저장 때 인자 값 1 2 3 으로 쓰이는 기분..
나만의 암기 법!
[buffer     ] ^ [EBP] [RET]
[  R8~R12 ] ^[R14] [R15]



Load 와 Store 개념은 포인터 개념도 있다. 

그리고 지역변수를 저장하거나 문자열을 저장할 일이 있으면 반드시 이작업을 거치는 것 같다. 


포인터와 비슷한 개념!!
[Rn]=*RN    [] 주소값! *는 가르키는 곳!
LDR  : Load Direct Register(주소 값을 담음)
Ex)LDR Rd,[Rn,offset] ; Rd:=*(Rn+offset)
LDR Rd,[Rn,offset]!   ;  Rn:=Rn+offset,Rd=*(Rn)
대상값을 업데이트!
STR Rd,[Rn,offset] ; *(Rn_offset) = Rd (적재!)
LDRB (LDR 의 바이트코드)
STRB (STR의 바이트 코드) 



연습해 봅시다.


#include<stdio.h>

Int main(){

  Printf(“aaaa”);

}

 #include<stdio.h>

Int main(){

  char buff[100];

  scanf(“%s”,buff);

}


각 어샘블리어는 다음과 같다


 




 
노란색 선부분은 정확히 파악은 안되었으나 현재 PC 값을 스택에 push 해 놓고 임시로 저장해 놓는것 같다.

INTEL CPU에 비교하면 프롤로그 부분이다.




 
아래부분이 버퍼를 선언하는 부분이다. 기본 4만큼 빼주는 부분과  scanf를 위해 버퍼크기를 100만큼 더 빼주는 부분을 scanf 부분만 볼 수 있다. 그리고 LDR 로 적재 시킨다. 

printf 하는 부분에 r0 값에는 aaaa 라는 값이 들어가 있음을 확인 할 수 있다. 이 텍스트 값역시 적재 되는것이다.


이 LDR 부분은 텍스트를 저장해놓거나 변수를 미리 선언해 놓았을때 항상 생긴다. 이러한 부분이 없다면 생기지 않는다.

예시코드는 아래에 설명 하겠다.





 위코드는 그냥 외부함수에 인자값 숫자 3개를 입력받아 출력해 주는 부분이다.


이부분에는 LDR 부분이 없고 r0 r1 r2 부분에 순차적으로 1 2 3 을 넣고 branch 로 test를 분기한다. 그러면 순서대로 들어가는 것이다. 


간단한 내용인데, ARM 환경을 접할 기회가 없다보니 비교만으로 분석을 하고 있게 된다. 좀 좋은 서적이 있으면 좋을거같은데.. 너무 전문서적말고 분석을 위한 서적이 있었음 좋겠다.



Posted by k1rha