프로시저와 스택

전두엽힘주기·2025년 4월 7일

Computer System

목록 보기
3/13
post-thumbnail

스택(LIFO)

많은 범용 프로세서들은 메모리 스택을 구현할 수 있는 메커니즘 제공

  • 스택 포인터는 스택의 최상위 원소를 가리키는 주소를 저장하는 레지스터
  • 8086은 스택 세그먼트 레지스터 ss와 스택포인터 sp제공
    *(cf. 스택 세그먼트: 프로그램이 임시로 저장할 필요가 있거나 사용자의 called subroutine이 사용할 데이터와 주소 포함, 스택 세그먼트 레지스터는 스택 세그먼트의 주소 포함)
  • 스택은 상위주소에서 하위주소로 거꾸로 성장
  • 레지스터에 있는 데이터를 스택에 저장하는 연산을 push, 스택에 저장된 데이터를 꺼내 적재하는 연산을 pop

스택의 활용

  • 서브루틴 호출 이후 본 프로그램으로 복귀하기 위한 복귀주소를 저장할 때 사용
  • 프로시저로 매개 변수를 전달하는 방법 중 하나로 스택 사용
  • 고급언어에서 지역 변수는 스택 영역에 할당
  • 레지스터 값들을 보존

프로시저

프로시저 호출은 소프트웨어에서의 추상화
지정된 인자들과 리턴값으로 특정 기능을 구현하는 코드를 감싸주는 방법을 제공한다
이 함수는 프로그램의 여러지점으로부터 호출될 수 있게된다.

프로시저 P가 프로시저 Q를 호출하고 Q가 실행한 후 다시 P로 리턴한다고 가정하자

  1. 제어권 전달
    프로그램 카운터는 진입할 때 Q 시작 주소로 설정
    리턴할 때는 P에서 Q를 호출하는 인스트럭션 다음의 인스트럭션으로 설정되어야한다
    (cf. 프로그램 카운터 : CPU에서 현재 실행중인 명령어의 위치를 가리키는 레지스터)
  2. 데이터 전달
    P는 하나 이상의 매개변수를 Q에 제공할 수 있어야하며,
    Q는 다시 P로 하나의 값을 리턴할 수 있어야함
  3. 메모리 할당과 반납
    Q는 시작할 때 지역변수들을 위한 공간을 할당할 수도 있고 리턴할때 이 저장소를 반납할 수 있다

x86-64 : 프로시저가 요구하는 메커니즘만 최소한으로 구현

런타임 스택

Q가 실행될 때 P는 일시적으로 정지
스택을 사용해서 프로시저들이 요구하는 저장장소를 관리할 수 있다
스택은 작은 주소 방향으로 성장하며 %rsp는 스택의 최상위원소를 가리킨다

프로시저 호출 시 P의 스택프레임에 Q에대한 매개변수, 리턴 주소, 필요에 따라 P의 로컬변수의 레지스터 상태를 저장하기 위한 공간을 포함한다
Q가 호출되면 스택포인터는 새로운 스텍프레임(Q 로컬변수, 임시데이터)을 위해 조정

스택 프레임

스택프레임: 활성화 기록, 프로시저 반환주소, 전달된 매개변수, 저장된 레지스터, 지역변수등을 위한 스택의 일부

프로시저의 스택 프래임: 레지스터들에 저장할 수 있는 개수 이상의 저장공간을 필요로 할때 공간에 스택 할당

P의 스택 프레임: P의 지역변수, P의 매개변수, Q호출에 필요한 매개변수, P에서 Q로 제어가 넘어갈때 필요한 리턴 주소

Q의 스택 프레임: Q의 지역변수, Q의 매개변수(P에서 넘겨준 값들), Q의 실행 중 필요한 추가 정보 (레지스터 상태 저장 etc.), Q가 종료된 후 제어를 돌려받을 P의 위치정보(리턴주소)

각 스택프레임은 독립적인 저장 공간을 가지며 프로시저 실행에 필요한 모든 정보 포함
현재 실행중인 프로시저에 대한 프레임은 항상 스택 맨위에 위치

스택프레임 생성

  1. 호출프로그램이 인수를 스택에 Push, 프로시저 호출

  2. 호출된 EBP 스택에 push, ebp를 esp로 설정

  3. 지역변수가 필요하면 상수를 ESP에서 빼서 스택에 공간을 만듬
    (cf.
    esp: stack pointer register - 스택 크기 조정 레지스터, 스택 최상단 주소값을 가지고 있으니 스택의 크기를 나타낸다(스택제일 아래에 위치). 어셈블리어 Push 즉, 스택에 값을 넣는 동작을 할때 ESP가 4만큼 줄어들고 메모리 공간을 늘려준다 (스택 제일 아래에는 높은 주소값, 갈수록 낮은 주소값을 가지니 4를 줄임

    ebp: Base pointer register - 스택프레임 형태로 저장된 함수의 지역변수, 전달 인자를 참조, 값을 바꿀때 사용하는 레지스터
    현재 스택프레임의 최하단주소(Base)저장 레지스터
    E가 붙는 것은 16비트에서 32비트 시스템으로 오면서 Extended 된 개념, 64비트에서는 R이 붙음
    )

0개의 댓글