3월25일 함수와 스택구조
2010. 3. 25. 10:50ㆍ2010년/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 ;
}
다음 코드를 통해 스택구조를 알아보자
제일 처음 초기값이다. EBP와 ESP 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)이 들어간다.
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 |