프로시저 호출은 사람에게 익숙한 여러 모습 ‘함수, 메서드, 서브루틴, 핸들러 등’으로 추상화되어 구현되지만, 기계어 수준에서는 처리해야 할 여러 과정이 있다.
예를 들어 프로시저 P가 프로시저 Q를 호출하고, Q가 실행한 후 다시 P로 리턴을 예로

- 제어권 전달 (Passing Control) : 프로그램 흐름이 바뀌는 순간
- 호출한 P는 call Q를 실행
- CPU는 현재 위치 바로 다음 주소를 리턴 주소(return address)로 스택에 push
- Q의 첫 번째 명령어 주소로 점프
[Q 종료 후]- ret 명령어가 스택에서 return address를 꺼내고 점프
- 다시 P로 복귀
즉, call / ret는 Jump를 수행하지만, 실제로는 리턴 주소를 저장하고 복구 하는 기능을 수행
- 데이터 전달 (Passing Data) : 이 함수에게 뭘 줄지, 결과는 어딨는지?
- 레지스터를 통해 인자 전달 (%rdi, %rsi, %rdx, %rcx, %r8, %r9)
- 인자가 많으면, 스택에 push
- 반환값은
%rax에 담아 반환
long add(long x, long y); // x → %rdi, y → %rsi, 반환값 → %rax
- 메모리 할당과 반납 (Memory allocation) : 함수만의 공간 부여(스택 프레임)
- 함수 시작 시:
- 지역 변수 공간 확보 : subq, $imm, %rsp
- 가끔 레지스터 백업도 함께 push
- 함수 종료 시:
- 메모리 해제 : addq $imm, %rsp 또는 leave
- ret로 복귀
- 함수 시작 시:
| 기능 | 수행하는 명령어 |
|---|---|
| 함수 호출 | call |
| 복귀 | ret |
| 인자 전달 | %rdi, %rsi, … or stack |
| 반환값 | %rax |
| 지역 변수 메모리 확보 | subq $imm, %rsp |
| 해제 | addq $imm, %rsp or leave |
728x90
'CS:APP' 카테고리의 다른 글
| ELF, Executable and Linkable Format (재배치 가능 목적파일) (0) | 2025.08.08 |
|---|---|
| 컴파일러 드라이버 (0) | 2025.08.04 |
| 스택은 사실 아래로 자란다(push,pop) - CS:APP 3.4.4 (0) | 2025.04.07 |
| [C, Assembly] movq 예제 (0) | 2025.04.07 |
| mov 인스트럭션 - CS:APP 3.4.2 (0) | 2025.04.07 |