스택은 메모리의 한부분으로 후입선출(LIFO) 방식으로 동작하는 자료 구조체이다.
LIFO(Last Input First Out)은 마지막으로 들어간 데이터가 처음 나오는 방식이다
스택은 POP과 PUSH 두가지 동작을 지원하고 PUSH는 데이터를 넣는 명령어이고, POP은 데이터를 꺼내는 동작을 한다. 그리고 한 방향에서만 이루어지는게 특징이다.
위에 그림과 같이 한방향에서 PUSH와 POP 명어를 사용한다 PUSH를 하게되면 스택의 주소는 4바이트만큼 감소하면서 데이터가 스택에 들어가고 POP을 하게되면 데이터를 꺼내고 스택주소는 다시 4바이트만큼 증가된다.
스택은 시작주소(EBP)에서 주소가 작아지는 방향으로 쌓이게 된다.
프로그램이 사용하는 스택의 위치는 ESP 레지스터에 저장 되어있고 스택 포인터라고 불린다.
메모리의 스택 영역은 함수의 호출관계되는 지역 변수와 매개변수가 저장되는 영역이다
스택 영역은 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소 값, 함수에서 선언된 지역 변수 등이 저장됩니다.
스택프레임(Stack Frame)
스택 프레임은 서브루틴(함수)가 가지는 자신만의 스택 영역이고, 서브루틴 내부에서 사용하는 데이터가 저장된다.
함수가 호출될 떄 생성되고 함수가 종료하고 반환 주소로 돌아갈때 소멸한다
서브루틴을 호출 하게되면 인자가 먼저 스택으로 입력되고, 그 다음으로는 다시돌아갈 복귀주소를 스택에 집어넣는다. 이제부터 스택 프레임이 시작되고 먼저 이전 루틴이 사용했던 ESP레지스터 내용를 백업하고 ESP 레지스터가 백업된 위치의 스택 주소를 서브 루틴의 ESP에 다시 집어 넣는다. 이렇게 설정된 ESP는 스택프레임에서 데이터 참조를위한 기준 주소인 프레임 포인터(Frame Pointer)로 사용된다
'Basic > 기타' 카테고리의 다른 글
스미싱 확인 방법 (0) | 2023.03.04 |
---|---|
웹(World Wide Web) (0) | 2021.11.05 |
운영체제 개념 (0) | 2021.10.25 |
암호에 대한 것 (0) | 2021.09.07 |
[네트워크] OSI 7 계층 (0) | 2021.06.28 |