2012. 10. 11. 17:57

간단한 것부터 시작!! 분석을 해보자 .



-----------------------------------------------------------------------------------------------------------------

우선 main+8부분까지는 프롤로그 부분이니깐 생략한다. 

main+12 : sub 으로 4 byte 만큼만 빠지므로 변수가 전역변수로 4바이트 만큼 할당함을 알수 있다.  

main+16 : 이후 r3 레지스터에 0을 넣고 

main+20 : 이 값을 r11- 16 지점에 저장시킨다.


 test.c 를 만들어 테스트 해보았다. 

#include<stdio.h>

int main(){

   int i=0;

}

gdb )  를 하게되면 이것역시 r11-16에  0이란 값을 저장시킨다. 어떠한 영역인지는 아직 모르겠다. 

보통 변수값 저장은 r11-16 부터 시작되는 듯하다. 하지만 정확한 분석은 아니다. 


다시돌아와서 변수 선언은 안했었지만 r3에 0을 얺고 그 r3 값을 r11 의 주소값에 저장시켰다. 그리고 main+52를 호출한다.



========================  분기문 시작 =====================================

main+28 :  r0에 pc,#40 이 있는 on8430  주소값에 있는 값을 적재 시킨다  (이메모리영역은 texarea 영역인듯)

               이값을 x/s $r0 해서 보면 "this is very easy %d " 값이 나온다.


main+32 : r1 값에 , r11, -16 값을 넣는다. 이 값은 아까 선언했던 0 값이다.  즉 r1=0 이 된다.

main+36 : bl printf 이므로 돌아올 주소를 r14에 넣은뒤 printf 를 호출한다.  즉 this is very easy 0 이 뜨게 된다.

main+40 : r3값에 을 적재하고,

main+44 : r3 값에 r3 에 1을 더한값을 넣는다.

main+48 : r11-16 값에 r3를 적재시킨다. 


========================   분기문 도착 지역 =======================================

main+52 : r3에 r11-16 값을 적재 시킨다. (결국 r3= r3+1 이 되어있다.)

main+56 : r3 값을 9와 비교한다.

main+60 : 작거나 같으면 main+28을 호출하여 돌아간다.

main+64 : r3,#0 을 넣고 초기화 한다.

main+68 : r0 에 r3 값을, 0을 넣는다.


main+72.. 에필로그이다. 



--------------------------------------------------------------------------------------------------------

즉 분석만 딱봤을때 9보다 작거나 같을 동안 ++ 를 시켜가면서 this is very easy %d  를 호출하고 ++ 된 값을 뿌려주는 것을 알수 있다.



#include<stdio.h>

int main(){

for(int i=0;i<9;i++){printf("this is very easy %d\n",i);}

return 0;

}


그리도 다시 diass main 을 해봤다.


사실 대충 때리고 틀린 부분을 찾으려했는데 완전히 똑같이 나와 놀랐다. 



한가지 또 배운점은 void main() 과 int main() 에 관한 차이이다.

int main()은 함수로 선언되기 때문에 리턴형이 필요하므로 그 리턴형의 주소값을 sp,sp 4 만큼 빼줌으로써, 그값을 전달한다.

때문에 기본적으로 4 byte가 할당 되어 있는 것이다. 

하지만 return 0; 을 선언해 놓으면 컴파일러는 알아서 리턴할 함수가 없다는 것을 인식하고 이 할당한 버퍼의 크기를 없앤다.


void main() 의 경우는 리턴할 주소가 없기 때문에 애당초 4byte 의 크기 할당은 없다.

 







Posted by k1rha