[컴퓨터 시스템] 11. 레지스터와 스택 프레임은 함수 호출을 어떻게 드러낼까
10편에서 어셈블리를 번역본처럼 읽는 감각을 잡았다면, 이제 함수 호출이 실제로 어디에 흔적을 남기는지 볼 차례입니다. 함수는 고수준에서는 깔끔한 추상화지만, 저수준에서는 인자 전달, 반환 주소 저장, 지역 변수 공간 확보 같은 구체적 작업으로 드러납니다.
이번 글은 함수 호출을 레지스터, 스택, 스택 프레임이라는 세 단어로 묶어 이해하는 데 초점을 둡니다.
- 함수 호출이 저수준에서 어떤 준비 작업을 하는지
- 레지스터와 스택이 어떤 역할 분담을 하는지
- 스택 프레임을 왜 호출 단위 작업 구역으로 보면 되는지
- 지역 변수와 반환 주소가 어디에 놓이는지
- 함수 호출 버그나 디버깅에서 이 감각이 왜 중요한지
1. 함수 호출은 점프 하나가 아니라 준비 절차 전체다
고수준 언어에서는 함수 호출이 이름 한 번 쓰는 일처럼 보이지만, 실제로는 인자를 준비하고, 돌아올 위치를 저장하고, 지역 변수 공간을 준비하는 과정이 함께 따라옵니다.
그래서 함수 호출을 제대로 읽으면 스택과 레지스터, 호출 규약이 한 번에 연결됩니다.
2. 레지스터와 스택은 서로 다른 종류의 책임을 진다
모든 호출 정보를 스택에만 두는 것도 아니고, 모든 값을 레지스터에만 두는 것도 아닙니다. 호출 규약은 일부 인자와 반환값을 레지스터에 두고, 더 많은 정보나 지역적 맥락은 스택에 맡기도록 나누는 경우가 많습니다.
| 장소 | 주 역할 | 왜 여기 두는가 |
|---|---|---|
| 레지스터 | 자주 쓰는 인자와 반환값 | 빠르게 접근하기 위해 |
| 스택 | 호출별 작업 구역과 추가 정보 | 호출이 중첩돼도 구조적으로 관리하기 위해 |
3. 스택 프레임은 '이번 호출의 작업 테이블'처럼 보면 된다
스택 프레임은 어렵게 느껴질 수 있지만, 한 번의 함수 호출이 자기 일에 필요한 정보를 잠시 올려두는 작업 테이블이라고 생각하면 좋습니다. 지역 변수, 저장된 레지스터, 돌아갈 위치 등이 여기 얽힐 수 있습니다.
함수 호출이 끝나면 이 작업 구역도 함께 사라지므로, 수명과 호출 흐름을 같이 보는 데 도움이 됩니다.
4. 작은 호출 예제도 스택 프레임 질문으로 읽을 수 있다
이 예제를 보면 add가 호출될 때 인자 a, b는 어디서 들어오는지, 지역 변수 c는 어느 호출 구역에 속하는지, 끝나면 어디로 돌아가는지를 순서대로 물을 수 있습니다.
int add(int a, int b) {
int c = a + b;
return c;
}
int main(void) {
return add(3, 4);
}5. 직접 해볼 문제: 어떤 정보가 스택 프레임에 필요할까
정확한 아키텍처 세부를 몰라도 괜찮습니다. 중요한 것은 한 번의 호출이 안전하게 실행되고 돌아오기 위해 어떤 종류의 정보가 필요할지 추론해 보는 것입니다.
이번 글에서 기억할 것
스스로 점검
다음 글 예고
다음 글에서는 배열과 구조체가 어셈블리에서 왜 결국 주소 계산 문제처럼 보이는지 이어서 정리합니다.
'학습 자료 글 > 컴퓨터시스템' 카테고리의 다른 글
| 컴퓨터시스템 기초 13. x86-64와 ARM64는 무엇이 같고 다를까 (0) | 2026.03.31 |
|---|---|
| 컴퓨터시스템 기초 12. 배열과 구조체는 어셈블리에서 왜 주소 계산이 될까 (0) | 2026.03.31 |
| 컴퓨터시스템 기초 10. 어셈블리는 왜 C와 하드웨어 사이의 번역본일까 (0) | 2026.03.31 |
| 컴퓨터시스템 기초 9. CPU는 명령을 어떤 단계로 실행할까 (0) | 2026.03.31 |
| 컴퓨터시스템 기초 8. 논리 게이트에서 CPU까지 어떤 연결이 생길까 (0) | 2026.03.31 |