3월25일 함수와 스택구조

2010. 3. 25. 10:502010년/3월


#include<stdio.h>
void
 test(int);
void test2(int*);
int main()
{
  int inum=100;
  test(inum);
  test2(&inum);
  fprintf(stdout,"main inum :[%d]\n",inum);
  
  return 0;
}
void test(int inum)
{
  fprintf(stdout,"test inum : [%d]\n",inum);
  ++inum;
  
}
void test2(int* inum)
{
  fprintf(stdout,"test2 inum : [%d]\n",*inum);
  ++(*inum);
  
}
오버헤드

시스템에서 목적으로 하는 효과를 얻기 위해 본질적인 것은 아니지만 요구되는 작동, 또는 그 때문에 필요한 자원. 예를들면 대형 컴퓨터에서 운영 체제의 제어 프로그램이 컴퓨터를 사용하는 시간이나 이로 인해 필요한 시스템 자원 등.


꼬리재귀

함수가 사용되어  재귀함수가  생성되어 여러번  메모리가 타서 오버헤드가 발생한다. 하지만 이 오버헤드가 발생될때 return 값을   차례대로 반환하지  않고 값이 같을시 제일 마지막에 함수 return을 반환하는것이다.
즉 재귀호출을 함수의 마지막에 사용하면 컴파일러가 컴파일시에 최적화해주는 코딩 방법이다.


-스택구조-
#include<stdio.h>
void
 test(int,int);
int main()
{
  int iNum=100;
  int iNum2=100;
  int iNum3=100;
  test(3,4);
  return  0;
}
void test(int iParam1, int iParam2)
{
  int iNum4=iParam1;

  return ;
}

다음  코드를 통해 스택구조를 알아보자



제일  처음 초기값이다. EBPESP EIP의 값이  들어온다. EIP는  code영역에서 랜덤값이 잡힌다. 그리고  EBP에서 ESP까지 즉 12FFC0에서 12FF84까지 초기값이 들어온다. 이것은 메인함수  이전의 초기값이다. 이사이에 초기값이 구해진다.

다음은 main()함수와 iNum iNum2 iNum3 와 EBP와 ESP를  보자


보는것 처럼 12FF80~ 12FF28까지  main함수의 스택범위다.
iNum iNum2 iNum3 의  주소값에 64가 하나씩 다들어간다. 그리고 EBP에서 0012FFC0 아까 메인함수 이전의 초기값EBP값이 0012FFC0 번지부터 시작한다. 그래서 그 초기 번지 주소를 main의 EBP에 넣는다.  

다음은 Test()함수의 구조이다.

아까 ESP가 12FF28이었다. 그사이값이 main함수의 스택이다 근데 12FF24와 12FF20에 Test함수 인자값이 들어갔을까? 그것은 바로 test(3,4);(기계주소는 0040B4581)메인함수에서 Test함수를  부른다. 그리고 3과 4를 대입한다. 그러면 이걸 어셈코드로 바꾸면
push 4
push 3
call _test
  이 3줄로 바꾼다.
우리가 아는 C코드로 바꾸면
int* esp;
esp=esp-1
*esp=3

12FF28주소에서  4바이트를 push하고 그자리에 iParam2의 값 4가 들어간다. 그리고 12FF24주소에서 4바이트 push하고 그자리에 iParam1의 값 3 이 들어간다.
그후 return address 주소값(여기서 return address주소값은 test(3,4); 이거 다음에 들어갈  기계주소  +4 후에 들어가게된다. 나같은경우는 0040B486이 들어갔다. )
들어가고 Test함수의  EBP가 12FF18에 들어가게 되고  EBP의값은 Main함수의 스택 초기주소값(12FF80)이 들어간다.

'2010년 > 3월' 카테고리의 다른 글

3월 29일 배열  (0) 2010.03.29
3월26일 (수학함수 포인터)  (0) 2010.03.26
3월 24일 함수와redirection  (0) 2010.03.24
3월23일 indirection 파일입출력  (0) 2010.03.23
3월22일 포인터와 스택구조  (0) 2010.03.22