728x90

코드 영역은 프로그램이 동작하기 위한 프로그램 코드(컴파일 된 명령어들의 집합)가 올라가는 위치이다. 프로그램을 실행시키면 위와같은 메모리 구조가 형성되고 코드 영역에, 실행되어야할 명령어들이 올라가서 순차적인 실행이 이루어지게 된다.

 

명령어의 실행은 세단계(Fetch, Decode, Execution)로 구분되어 진행된다. 이중 첫번째 단계는 Fetch인데 이것은 명령어를 CPU내부로 가져오는 단계이다. 컴파일된 프로그램 코드가 코드영역에 올라간 다음부터 Fetch, Decode되고 Execution되는 것이다.

 

명령어 길이가 4바이트라고 하고, 실행 중인 프로그램이 현재 1036번지에 있는 명령어라면, 다음 번에는 1040번지에 있는 명령어가 Fetch 되어야 한다.

 

CPU가 메모리 영역 중 스택을 컨트롤 하기 위해서 SP레지스터를 두었던 것처럼, 명령어를 순차적으로 fetch하기 위해서 프로그램 카운터라 불리는 "PC 레지스터"를 둔다.  CPU는 Fetch, Decode, Execution 과정을 계속해서 진행하도록 구현되어 있기 때문에, Fetch 연산이 일어날때마다 자동적으로 PC값이 증가한다.

 

프로그램 카운터(PC)

위 그림에서 IR Register를 보여주는데 IR Register는 명령어를 가져오기 위해서 사용되는 레지스터 이다.

 

 

코드영역에서 함수 호출

위그림의 오른쪽은 컴파일된 바이너리 코드가 실행을 위해 코드영역에 올라가있는 모습이다. 함수 호출시 실행 흐름의 이동은 Program Count PC에 의해 이루어진다. 함수 호출전 PC의 값(return address)을 스택에 저장해 두고 이후 함수 호출로 인해 이동해야할 주소값을 저장해두면 자연스럽게 실행의 위치는 이동하게 된다.

 

728x90

+ Recent posts