스택 (Stack)

스택은 데이터가 들어오는 순서대로 쌓아서 저장하고 마지막에 들어온 데이터부터 꺼내서 사용할 수 있는 후입선출(LIFO,Last-In-First-Out)형태의 자료구조이다.

이러한 특징을 가진 스택은 임시데이터를 저장하거나, 함수 호출 시 복귀 주소와 인자, 지역 변수를 관리하는데 사용된다.

top

top은 스택의 최상단을 말한다.
push수행 시: 스택의 최상단에 새로운 값이 들어오기 때문에 top이 한 칸 내려간다.
pop수행 시: 스택의 최상단에 새로운 값이 들어오기 때문에 top이 한 칸 올라간다.

스택 포인터(SP, Stack Pointer)

스택 포인터는 top을 가리키는 주소 레지스터를 말한다.
--> 마지막으로 데이터가 추가된 곳을 가리키는 레지스터

SP가 하는 역할

SP는 top을 가리키는 주소 레지스터이므로, CPU가 스택에 접근할때 항상 이 값을 기준으로 한다.
즉, top이 변하면 SP도 변한다.
push: SP가 감소하고 새 데이터가 [SP]에 저장된다.
pop: [SP]의 데이터를 꺼내오고 [SP]가 증가한다.

CPU에 따라서 스택의 성장 방향이 달라지기도 한다.

x86,ARM등 대부분의 CPU는 push시 아래에 데이터가 쌓이는 하향 스택을 사용하기 때문에 이 글에서도 하향 스택을 기준으로 설명하도록 하겠다.

총알을 저장하는 구조를 생각하면 이해하기 편하다.(일단 나는 그랬음)

스택의 동작

데이터를 저장하는 명령어 push pop

push

push는 스택에 데이터를 삽입하는 명령어다.
어떤 값을 스택의 맨 위(top)에 삽입(push)한다는 의미이다.

push eax = "eax에 들어있는 데이터를 스택에 저장해라"

pop

pop은 스택에서 데이터를 제거하는 명령어다.
스택 top에 저장된 데이터가 "톡 하고 빠져나온다"(pop)는 의미이다.

pop eax = "스택에서 데이터를 빼와서 eax에 저장해라"

궁금한점

왜 대부분의 CPU는 하향스택을 선택하는가?

  • 힙과의 충돌 때문이라는데 추가 조사 필요

0개의 댓글