본문 바로가기
공부,일/어셈블리

스택 ebp ,esp레지스터 , 함수 호출 , return(수업준비)

by fromnothing1 2021. 8. 20.

스택 ebp ,esp레지스터 

 

스택은 높은 주소 부터 낮은 주소로 쓰여지는 특징을 가진다. ( 즉 높은 주소에 먼저 데이터가 들어간다. ) 

ebp , esp 레지스터는 이러한 스택의 주소를 저장하기 위해서 설계된 레지스터이다

 

esp: Extended Stack Poinater (sp) 스택포인터 (현재 스택의 최상단의 주소 값을 저장하고 있는 레지스터 

- 위에서 스택은 낮은 주소일수록 최상단의 주소라고 했음으로 항상 가장 낮은 주소를 가지고 있다)

 

ebp: Extended Base Pointer (FP) 현재 스택 프레임의 베이스 주소를 갖는다. (스택 프레임의 최하단 주소)

 

스택 프레임 설명

즉 어디까지가 함수가 반환 될때는 ebp 까지 스택의 변수들이 pop 된다. 

 

push , pop  명령어

push : ESP 데이터의 크기 만크 ESP 를 감소시키고 그 데이터를 집어 넣어라 ( 즉 스택에 변수를 넣는 역활을 한다. )

 

POP : 현재  ESP에 저장된 주소의 값을 목적지 레지스터에 옮기고 , 그후에 ESP 의 값을 데이터의 크기 만큼 증가 시킨다. (즉 스택의 데이터를 없애는 역활을 한다)

 

출처:

https://blog.naver.com/zxwnstn/221513370836

함수의 호출 반환  

 

사실 esp ebp 를 안다고 해서 함수의 호출 과 반환에서 스택이 어떻게 움직이는 지 알수는 없다. 때문에 상세히 어떻게 움직이는지 알아보자 

아까 위에서 본 함수의 실행과정을 다시보자 

 

위의 그림을 보면 알수 있다 싶이 사실 스택에는 데이타 뿐만 아니라 프로그램이 돌아갈 주소와 그에 따른 스택 프레임의 베이스 주소를 가지고 있다. 

 

위와 같은 스택이 위와 같은 구조를 가지고 있기 때문에 함수안에 함수를 아무리 호출하더라도 스택에서는 호출이 끝난 함수의 변수만 정확히 골라내서 pop 할수 있는 것이다. 

 

함수 호출 할때 프로세스 

 

1.  call 된 시점의 return  address 를 push 한다. 

2. ebp 를 push 한다. 

3. ebp 에 esp 데이터를 넣는다. 

4. 함수의 변수를 스택에 넣는다. 

 

함수 반환 할때 프로세스 

 

1. ebp 까지 저장된 변수들을 pop 한다. -( 사실 esp 를 ebp 까지 옮기기만 하면끝)

2. 스택최상단에  들어있는 이전 ebp 값을 다시 ebs  에 넣어준다.  (pop)

3. 스택 최상단에 들어있는 return address 로 돌아간다. 

 

출처:

https://blog.naver.com/zxwnstn/221515097367

 

 

 

위의 함수 호출 반환 메커니즘을 알고 밑의 코드를 보자 

 

.386; 80386 이상 급 명령어 적용
.MODEL FLAT
PUBLIC _Wowcat; Wowcat Fuction
.CODE
; -------------------------------------------------- -
_Wowcat PROC NEAR32
	push ebp; 프로시저 시작 코드
	mov  ebp, esp
	
	push ebx
	
	mov eax, [ebp + 8]
	mov ebx, [ebp + 12]
	add eax, ebx
	
	pop ebx; 현재의 프로시져 호출전에 지닌 값을 되돌림
	
	mov esp, ebp
	pop ebp
	ret
_Wowcat  Endp; Procedure End

END; 소스의 끝 
;--------------------------------------------------

 

#include<stdio.h>

extern int Wowcat(int, int);

int main()
{
	int iRet = Wowcat(7, 8);

	printf("Wowcat : %d\n", iRet);
	return 0;
}

 

 

 

 

댓글