0100번지가 프로그램 실행의 시작 위치다.
OS는 프로그램을 하드 디스크에서 메모리로 복사한 후 PC에 0100을 넣는다.
이 과정을 거쳐 프로그램이 실행되는 것이다.
그리고 CPU가 명령어 하나를 실행할 때마다 PC에 저장된 값은 명령어의 크기(여기서는 1)만큼
늘어난다.
함수 호출도 조건 분기와 같이 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 |