Stack Frame

Programming/OS Development 2009. 5. 11. 02:59
스택 프레임 : 스택에 저장되는 함수의 호출 정보


 int Add( int a, int b )
{
   int c,d,e;
   c = a + b;
   return c;
}

void main()
{
   int result;
   result = Add( 1, 2 );
   printf("result= %d\n", result );
}

Add 함수에서 중단점을 설정 한 후 View/ Debug Window/ Disassembly 를 선택하면 Assem 코드를 볼 수 있다.



함수를 호출 할 때 ebp 를 먼저 스택에 push 한 뒤에 함수내에서 필요한 정보들을 push 한다.
esp는 함수의 변수와 인자들을 가리키기 위한 기준 번지로써 esp가 바뀌더라도 ebp는 변하지 않는다.
Add 함수의 수행을 마칠 때, 남은 정리 작업을 수행하는 코드를 접미( epilog ) 라고 하는데 이 함수의 경우 다음의 세줄 이다.

mov esp, ebp ; 지역변수를 위해 할당했던 스택 영역을 회수 한다는 뜻.
pop ebp
ret                 ; 스택에 저장된 복귀 번지를 꺼내서 그 번지로 리턴한다.

함수가 연속적으로 두번 호출될 때 는 다음과 같다.
void Dog( int v )
{
   int n, m;
   n = Add( 1, 2 );
   ...
}


위의 그림과 같이 각 함수의 스택 프레임이 저장 된다.
main 스택 프레임 위에 Dog 스택 프레임이 올라가고 그 위에 Add의 스택프레임이 올라가게 된다.
Dog 스택프레임은 먼저 인자 값인 v가 들어가고 난 뒤 복귀 번지, 그리고 ebp, 지역변수들 이 들어가고,
Add 함수의 경우도 마찬가지이다.

자세한 내용을 알고 싶으면 Winapi 사이트를 방문하기 바랍니다. 이 글은 Winapi 에서 발췌한 글입니다.

'Programming > OS Development' 카테고리의 다른 글

어셈블러에서 16진수 입력  (0) 2009.05.15
naked 함수  (0) 2009.05.11
NASM - 1  (0) 2009.03.11
Segmant and Offset  (0) 2009.03.08
Real Mode, Protected Mode  (0) 2009.03.08

설정

트랙백

댓글