인텔 8086 프로세서 

1978년에 개발된 x86 최초의 모델로 최신 인텔 구조의 시작으로 세그먼트 메모리 모델을 사용헀으며 이후 XT라는 PC가 보급되며 사용되었습니다. 이후 80186, 80286, i386으로 점점 발전해서 펜티엄, 제온까지 x86구조를 사용하게 되었습니다.

 

 

프로그램 실행 방식

사용자가 실제 고급언어로 개발한 뒤 프로그램을 실행시키는 것을 정리해보면 다음과 같습니다

 

  1. 사용자가 프로그래밍 언어(고급 언어)를 통해 하나의 프로그램을 개발
  2. 하나의 프로그램은 각종 명령어와 데이터의 집합
  3. 프로그램을 실행시키게 되면 운영체제가 메인 메모리에 적재 -> 프로세스

생각되는 메모리 구조(좌) 실제 저장되는 메모리 구조(우)

    4. 오른쪽 메모리 구조에서 명령어 실행 사이클에 따라 명령어를 실행함 ( 명령어 코드와 데이터를 따로 저장)

 

 

명령어 실행 사이클

1) 명령어 인출(Fetch)

  • 아래 그림에서 메인  메모리에 명령어를 가져오기 위해 CS(코드 세그먼트)의 저장되어 있는 메인 메모리 명령어 세그먼트 시작 주소 + IP(명령어 포인터)가 가리키는 실행되어야 하는 명령어 상대 주소메인 메모리와 연결되어 있는 주소 버스를 통해 찾아 명령어 큐에 저장하게 됩니다.

 

2) 명령어 해독(Decode)

  • Control Unit이 명령어 큐에 있는 명령어를 해독

 

3) 피연산자 인출(Operand fetch)

  • 명령어에 따라 필요한 연산을 수행하게 되는데 대표적으로 메인 메모리에 있는 데이터를 레지스터에 저장(MOV), 레지스터에 있는 데이터와 메인 메모리에 있는 데이터를 덧셈하기 위해 임시 레지스터(버퍼)로 가져오는 등 피연산자를 인출합니다.

    이때 DS(데이터 세그먼트 시작주소를 가지고 있느 레지스터)와 가져와야하는 데이터의 상대 위치(offset)를 통해 피연산자를 인출하여 가져오게 됩니다 

 

4) 명령어 실행(Excute)

  • 더하기(ADD) 명령어가 실제 실행된다고 했을 때 MOV를 통해 가져와 레지스터에 저장되어 있는 데이터와 임시 레지스터에 저장되어 있는 데이터를 ALU에서 실행하게 됩니다. 이후 연산 결과에 따라 CPU에 있는 다양한 레지스터 등이 동작하게 되며 대표적으로 연산 상태( 오버플로우, 캐리, 0, 부호비트)를 저장하는플래그 레지스터, 다음 명령어를 fetch하기 위한 연산 등을 수행하게 됩니다

8086 인텔 프로세서 내부 구조

 

 

추가) 레지스터 종류

CPU 내부에 있는 레지스터들은 다양한 종류가 있으며 종류에 따라 용도도 나누어져 있습니다.

크게 범용 레지스터와 세그먼트 레지스터로 나뉘어지게 됩니다.

 

레지스터는 16bit으로 구성되어 있지만 8bit씩 접근할 수 있도록 AH와 AL 나누어지기도 하며 아래 레지스터는 16bit으로 접근하기 위한 레지스터 이름을 사용하였습니다

 

범용 레지스터

범용적으로 사용되는 레지스터이지만 용도에 따라 사용되는 부분이 조금씩 달라집니다  

  1. AX : 누산기(덧셈, 곱셈)용으로 사용됩니다
  2. BX : DS(데이터 세그먼트) 데이터에 대해 간접 주소 지정시 포인터로 많이 사용됩니다
  3. CX : LOOP(반복문) 카운터 값으로 사용되며 문자열, 반복문 계수를 저장합니다.
  4. SP : 스택 포인터
  5. SI, DI : 인덱스 레지스터(source / 문자열 출발, destination / 문자열 도착
  6. BP : 확장 프레임 포인터(스택 베이스 포인터, 기준 주소값)

세그먼트 레지스터

  1. CS : 코드 세그먼트 (명령어가 모여있는 공간의 시작주소)
  2. DS : 데이터 세그먼트(데이터가 모여있는 공간의 시작 주소)
  3. SS : 스택의 시작 주소
  4. ES, FS, GS : 데이터에 대한 추가적인 세그먼트

이외 레지스터

  1. IP : 명령어 포인터(IP == PC와 같다)
  2. FLAGS : 상태와 제어 플래그 레지스터
  3. DX ㅣ 입출력에 대한 포인터 레지스터
복사했습니다!