2012. 10. 15. 23:16

처음 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바이트로 할당된다

Posted by k1rha