학습 자료 글/컴퓨터시스템

컴퓨터시스템 기초 11. 레지스터와 스택 프레임은 함수 호출을 어떻게 드러낼까

cedis 2026. 3. 31. 16:23

[컴퓨터 시스템] 11. 레지스터와 스택 프레임은 함수 호출을 어떻게 드러낼까

10편에서 어셈블리를 번역본처럼 읽는 감각을 잡았다면, 이제 함수 호출이 실제로 어디에 흔적을 남기는지 볼 차례입니다. 함수는 고수준에서는 깔끔한 추상화지만, 저수준에서는 인자 전달, 반환 주소 저장, 지역 변수 공간 확보 같은 구체적 작업으로 드러납니다.

이번 글은 함수 호출을 레지스터, 스택, 스택 프레임이라는 세 단어로 묶어 이해하는 데 초점을 둡니다.

먼저 짚고 갈 용어
stack frame: 한 번의 함수 호출을 위해 스택에 잡히는 작업 구역
return address: 함수가 끝난 뒤 돌아갈 명령 위치
calling convention: 인자 전달과 반환을 어떤 규칙으로 할지 정한 약속
이번 글에서 다루는 것
  • 함수 호출이 저수준에서 어떤 준비 작업을 하는지
  • 레지스터와 스택이 어떤 역할 분담을 하는지
  • 스택 프레임을 왜 호출 단위 작업 구역으로 보면 되는지
  • 지역 변수와 반환 주소가 어디에 놓이는지
  • 함수 호출 버그나 디버깅에서 이 감각이 왜 중요한지
한눈에 보는 흐름
1
함수 호출이 저수준에서 어떤 준비 작업을 하는지
2
레지스터와 스택이 어떤 역할 분담을 하는지
3
스택 프레임을 왜 호출 단위 작업 구역으로 보면 되는지
4
지역 변수와 반환 주소가 어디에 놓이는지

1. 함수 호출은 점프 하나가 아니라 준비 절차 전체다

고수준 언어에서는 함수 호출이 이름 한 번 쓰는 일처럼 보이지만, 실제로는 인자를 준비하고, 돌아올 위치를 저장하고, 지역 변수 공간을 준비하는 과정이 함께 따라옵니다.

그래서 함수 호출을 제대로 읽으면 스택과 레지스터, 호출 규약이 한 번에 연결됩니다.

과정 그림
1
인자를 정해진 규칙에 따라 레지스터나 스택에 둔다.
2
돌아올 주소를 저장한다.
3
새 함수가 쓸 작업 구역을 만든다.
4
함수 본문을 실행한 뒤 결과를 반환하고 원래 흐름으로 돌아간다.

2. 레지스터와 스택은 서로 다른 종류의 책임을 진다

모든 호출 정보를 스택에만 두는 것도 아니고, 모든 값을 레지스터에만 두는 것도 아닙니다. 호출 규약은 일부 인자와 반환값을 레지스터에 두고, 더 많은 정보나 지역적 맥락은 스택에 맡기도록 나누는 경우가 많습니다.

그림으로 먼저 보기
레지스터
주 역할: 자주 쓰는 인자와 반환값
왜 여기 두는가: 빠르게 접근하기 위해
스택
주 역할: 호출별 작업 구역과 추가 정보
왜 여기 두는가: 호출이 중첩돼도 구조적으로 관리하기 위해
장소주 역할왜 여기 두는가
레지스터자주 쓰는 인자와 반환값빠르게 접근하기 위해
스택호출별 작업 구역과 추가 정보호출이 중첩돼도 구조적으로 관리하기 위해

3. 스택 프레임은 '이번 호출의 작업 테이블'처럼 보면 된다

스택 프레임은 어렵게 느껴질 수 있지만, 한 번의 함수 호출이 자기 일에 필요한 정보를 잠시 올려두는 작업 테이블이라고 생각하면 좋습니다. 지역 변수, 저장된 레지스터, 돌아갈 위치 등이 여기 얽힐 수 있습니다.

함수 호출이 끝나면 이 작업 구역도 함께 사라지므로, 수명과 호출 흐름을 같이 보는 데 도움이 됩니다.

3편과 이어지는 지점
지역 변수의 수명과 함수 호출 시점이 함께 움직인다는 감각이 여기서 다시 중요해집니다.

4. 작은 호출 예제도 스택 프레임 질문으로 읽을 수 있다

이 예제를 보면 add가 호출될 때 인자 a, b는 어디서 들어오는지, 지역 변수 c는 어느 호출 구역에 속하는지, 끝나면 어디로 돌아가는지를 순서대로 물을 수 있습니다.

C
int add(int a, int b) {
    int c = a + b;
    return c;
}

int main(void) {
    return add(3, 4);
}
이 코드에서 볼 포인트
지역 변수 c의 수명은 add 호출 동안만 의미가 있고, 반환이 끝나면 그 호출 프레임도 함께 정리된다고 생각하면 됩니다.

5. 직접 해볼 문제: 어떤 정보가 스택 프레임에 필요할까

정확한 아키텍처 세부를 몰라도 괜찮습니다. 중요한 것은 한 번의 호출이 안전하게 실행되고 돌아오기 위해 어떤 종류의 정보가 필요할지 추론해 보는 것입니다.

미니 문제
함수 A가 함수 B를 호출한다고 할 때, B가 끝난 뒤 A가 다시 이어서 실행되려면 최소한 어떤 정보들이 저장돼 있어야 할지 적어 보세요.

이번 글에서 기억할 것

함수 호출은 단순 점프가 아니라 인자 전달, 복귀 위치 저장, 작업 구역 준비를 포함한다.
레지스터와 스택은 함수 호출 정보를 서로 다른 방식으로 나눠 맡는다.
스택 프레임은 호출 단위로 생겼다가 사라지는 작업 구역으로 보면 이해가 쉽다.

스스로 점검

함수 호출 전에 왜 단순 점프 외의 준비가 필요한지 설명할 수 있는가
레지스터와 스택이 함수 호출에서 어떻게 역할을 나누는지 말할 수 있는가
스택 프레임을 호출 단위 작업 구역으로 설명할 수 있는가

다음 글 예고

다음 글에서는 배열과 구조체가 어셈블리에서 왜 결국 주소 계산 문제처럼 보이는지 이어서 정리합니다.

한 줄 정리
함수 호출을 이해하는 핵심은 레지스터와 스택이 호출 단위 작업 구역을 함께 만들며 실행 흐름을 유지한다는 데 있습니다.