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

이러한 특징을 가진 스택은 임시데이터를 저장하거나, 함수 호출 시 복귀 주소와 인자, 지역 변수를 관리하는데 사용된다.
top은 스택의 최상단을 말한다.
push수행 시: 스택의 최상단에 새로운 값이 들어오기 때문에 top이 한 칸 내려간다.
pop수행 시: 스택의 최상단에 새로운 값이 들어오기 때문에 top이 한 칸 올라간다.

스택 포인터는 top을 가리키는 주소 레지스터를 말한다.
--> 마지막으로 데이터가 추가된 곳을 가리키는 레지스터
SP는 top을 가리키는 주소 레지스터이므로, CPU가 스택에 접근할때 항상 이 값을 기준으로 한다.
즉, top이 변하면 SP도 변한다.
push: SP가 감소하고 새 데이터가 [SP]에 저장된다.
pop: [SP]의 데이터를 꺼내오고 [SP]가 증가한다.
x86,ARM등 대부분의 CPU는 push시 아래에 데이터가 쌓이는 하향 스택을 사용하기 때문에 이 글에서도 하향 스택을 기준으로 설명하도록 하겠다.
총알을 저장하는 구조를 생각하면 이해하기 편하다.(일단 나는 그랬음)

데이터를 저장하는 명령어 push pop
push는 스택에 데이터를 삽입하는 명령어다.
어떤 값을 스택의 맨 위(top)에 삽입(push)한다는 의미이다.
push eax = "eax에 들어있는 데이터를 스택에 저장해라"
pop은 스택에서 데이터를 제거하는 명령어다.
스택 top에 저장된 데이터가 "톡 하고 빠져나온다"(pop)는 의미이다.
pop eax = "스택에서 데이터를 빼와서 eax에 저장해라"
왜 대부분의 CPU는 하향스택을 선택하는가?