관리 메뉴

JIE0025

[Assembly] 함수 호출(call)과 메모리 반환(return) 개념 본문

기타 학습/Language

[Assembly] 함수 호출(call)과 메모리 반환(return) 개념

Kangjieun11 2020. 3. 19. 02:25
728x90

함수 호출과 메모리 반환

어셈블리 언어에서 어떻게 이루어지는지 알아보자.

 

다음은 설명을 위한 가정이다.

- 함수 B에서 함수 A를 호출하는 상황이다.

- 함수 A는 매개변수로 int b, int c, int d를 갖고 있으며, 반환형은 int형이다.

 

1. CALL

함수 A를 호출 하면 다음과 같은 세가지 단계를 거친다. 

 

1) push : 매개변수 저장

    push를 통해 a라는 함수의 인자로 들어갈 값을 저장한다.

   함수 a의 매개변수는 총 3개 이므로 push를 세번 반복할 것이다. 

   함수 호출시 가장 먼저 하므로 스택의 밑부분에 위치한다.

 

2) call : 호출한 명령어의 주소 저장

      EIP(instuction Pointer)로 다음 명령어 주소값에다가 현재 우리가 함수를 호출했던 주소를 저장해줌으로서

      return 이후 다음 명령어를 자연스럽게 읽을 수 있도록 한다. 

 

3) push ebp : 호출한 함수의 ebp저장

   mov ebp esp : esp의 값을 ebp에 저장시, 함수 a(호출받은 함수)의 ebp를 설정

      우리는 의문을 가질 수 있다.

      << 함수를 호출한 후에 함수를 전부 읽었을 때 return해야 하는데 어디로 돌아와야하는가. >>

      호출한 함수 (B)의 ebp를 push함으로서 return했을 때 ebp를 다시 재 설정 함으로서 B함수의 스택영역으로 돌아 올 수 있다. 즉, 리턴할때를 위해 저장한다는 것이다. 

      esp 를 ebp에 저장하는 것은 가장 최근의 pointer가 최상단에 존재할테니 호출된 함수 A의 ebp로 설정하기 위함이다.

 

ebp까지 설정이 끝난 후에 스택의 윗부분은 함수 a의 지역변수 공간이 된다. 

 

2. RETURN

return은 call을 이해하였다면 비교적 간단하다.

함수 A에서 반환 하면 다음과 같은 세가지 단계를 거친다.

 

1)  mov esp ebp : ebp의 값을 esp에 저장

    이를 통해 가장 상단의 포인터가 a의 ebp로 설정이 되면서 함수 A의 Stack Frame을 없애는 꼴이 된다. 

 

2) pop ebp 

      E stack에 저장되어 있던 B의 ebp를 ebp로 설정해주어야 현재 실행중인 함수가 사용하는 stack frame의 바닥을 b의 것으로 설정 할 수 있다. pop을 통하여 값을 재설정 하는 것이다.  

 

3) retn

      return 시 저장되어 있던 eip값으로 eip를 재설정 함으로서 원래 실행중이었던 줄로 이동한다.