처음 gdb 로 들어와보면 다음과 같다.
q
main+8 까지는 프롤로그 이고
main+12 부분은 4바이트만큼 확장을 시키고
main+16 부분에서 r3 에 r11 만큼을 빼어 16만큼 공간을 확보한뒤 r3 에 저장한다.
main+20 r0 에 pc 의 28의 오프셋인 Main+56 을 r0 에 저장한다. (이부분에서는 %d 가 들어가 잇다.)
main+24 r3의 값을 r1의 집어넣고
main+28 scanf 의 반환값을 저장하고 호출한다.
main+32 scanf 인자값으로 r3 가 들어간듯하다. 이부분에서 5를 입력한뒤 r3ㄱ밧을 봐보면 5가 들어가 있다.
main+36 이 r3 값을 r0에 저장한다.
main+40 melong 이 호출된다. 인자값은 r0 하나 뿐인듯하다.
main+44 main+40 에서 리턴값을 저장하고 함수를 들어간다.
main+48 r3 값에 0을 넣는다.
main+52 여기서부터는 에필로그이다.
그렇다면 scanf 로 %d 를 인자값으로 받는 melong 함수를 봐보자.
melong+8 여전히 main+8 가지는 프롤로그이고,
melong+12 sp 에서 sp + 8 바이트만큼 확장.. 무슨자료형일까.. double 인가?..
melong+16 r0 , 에서 무슨값을 가져와서~ 넣는다. 뭐냐하면? printf 전 r0 레지스터를 봐보면 input : %d\n 이다.
melong+20 들어온 값을 melong 88 지역엔 도데체 뭐가 든 걸까?.. 포인터로 추출해봐도 잘나오지 않음.
어쨋거나 r0 값에는 %d\n 값이들어가 있고 r1에는 들어온 이자값이 들어가 있다.
melong+28 printf 를 호출하여 들어온 인자값을 출력한다.
melong+32 r3 값에 인자값으로 들어온 값을 넣는다.
melong+36 r3 값을 9와 비교해서
melong+40 작거나 같으면 melong+60 으로 이동시키고.
<= 작거나 같은 경우 -------------------------
melong+44 클시에는 r3 에 0을 넣고.
melong+48 r3 값에 r11, 의 오프셋을 넣고. 이값에는 0 이 들어가 있다.
melong+52 r0 에 다시 0을 넣고
melong+56 melong+80 을 호출하여 끝낸다.
> 큰경우 ------------------------------------
melong+60 은 들어온 값을 r3에 넣고,
melong+64 r3 에 r3+1 을 집에 넣는다. ++ 증가 연산자.
melong+68 r11+16 위치에 r3 값을 다시 넣고, (증가한 값을 넣음)
melong+72 r0 값에 다시 증가한 값을 넣는다.
melong+76 그리고 다시 melong 호출..
melong+80 여기서 부턴 에필로그 부분이다.
대충 그림을 그려보자.
#include<stdio.h> int melong(int i){ printf("input :%d\n",i); if(i>9)return 0; else{ i=i+1; melong(i); } } int main(){ int i; scanf("%d",&i); melong(i); return 0; } |
CLEAR~!
배운점 : le (작거나 같다 ) 는 어셈으로 크다를 표현하는 기준이다. 이게 늘 반대로 인기분..
melong(i++) 를 하지않고 i = i+1; 을 하고나서 melong(i++) 하는것은 다르다. 외부함수 역시 4바이트로 할당된다
'ARM & 펌웨어 분석' 카테고리의 다른 글
펌웨어 분석 1단계, bin 파일 까기. (Firmware analysis method Unpack Bin file ) (0) | 2012.10.31 |
---|---|
[ARM 크로스 컴파일 환경 구축하기 ] (1) | 2012.10.23 |
[ 10/11 ARM9 일기] 어셈블리 디버깅 연습 (1) | 2012.10.11 |
[ ARM assembly 공부 ] 1. 기본 내용 (0) | 2012.10.03 |
[ ARM Assambly ] 공부 시작! (0) | 2012.09.24 |