![](https://blog.kakaocdn.net/dn/AAN1q/btqZcsYZ6QA/YOC2kj7x81g9jr8vdq1Ghk/Untitled Diagram(4).png)
0100번지가 프로그램 실행의 시작 위치다.
OS는 프로그램을 하드 디스크에서 메모리로 복사한 후 PC에 0100을 넣는다.
이 과정을 거쳐 프로그램이 실행되는 것이다.
그리고 CPU가 명령어 하나를 실행할 때마다 PC에 저장된 값은 명령어의 크기(여기서는 1)만큼
늘어난다.
![](https://blog.kakaocdn.net/dn/HL8A8/btqZfiBpaAm/Xlkw6TFIfD19139d1baIck/img.png)
함수 호출도 조건 분기와 같이 PC에 특정 주소(함수가 저장된 주소)를 넣는 것으로 구현된다.
하지만 조건 분기와 달리 복귀 주소라는 것이 필요하다.
복귀 주소는 무엇이며, 왜 필요한 걸까?
함수 호출 후 함수 내부 처리가 끝나면 함수를 호출한 위치로 돌아가야 한다.
그런데 조건 분기처럼 함수의 위치로 점프해버리면 돌아갈 위치를 알 수 없게 된다.
예를 들어 0132에서 무작정 0260으로 점프하기만 하면 0354에서 돌아갈 주소를 알 수 없다.
따라서 0260으로 점프해 함수 실행을 마친 뒤 0354에서 다시 함수 호출의 다음 명령을 수행해야 하므로 0154를 기억해야 한다. 이 때 0154가 복귀 주소가 된다.
이런 이유로 점프는 jmp , 함수 호출은 call 로 명령어부터 다르다.
call 명령어는 함수의 시작 주소를 PC에 넣기 전에 복귀 주소를 *스택에 기록한다.
그리고 함수 실행을 모두 마치면 리턴 명령어(ret)를 실행한다.
이 때 ret 명령어는 call 명령어 호출로 기록된 복귀 주소를 PC에 넣는 기능을 한다.
*스택(stack): **LIFO 방식의 메인 메모리 영역.
**LIFO(Last-In First-Out): 후입선출(後入先出) 방식. 기억 장치에서 나중에 기록된 정보가
먼저 읽히는 처리 방식이다.
프링글스 통을 생각하면 쉽다.
'Programming > Basis' 카테고리의 다른 글
비트 연산 (0) | 2019.03.04 |
---|---|
컴퓨터가 2진수를 사용하는 이유 (0) | 2019.03.03 |
CPU가 수행하는 작업 (0) | 2019.02.27 |
레지스터 (0) | 2019.02.27 |
프로그램의 작동 원리와 CPU (1) | 2019.02.26 |