스택 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;
}
'공부,일 > 어셈블리' 카테고리의 다른 글
어셈블리 변수 선언 , 명령어 구조 (0) | 2021.08.25 |
---|---|
어셈블리 수업 기초 (0) | 2021.08.24 |
ch4 4.4 Division Instructions (0) | 2021.08.18 |
ch4 4.3 Multiplication Instructions (0) | 2021.08.18 |
ch4. 2 Integer Addition and Subtraction Instructions (0) | 2021.08.17 |
댓글