1장. 8086/8088 프로세서 (1/2)

 

 

1.1. 개요

 16비트 프로서세인 8086 마이크로프로세서(이하 8086)는 1970년대 후반에 등장하였다. 16비트 명령어가 도입 되었고, 하드웨어에 의한 곱셈과 나눗셈을 수행할수 있었다. 그리고 20비트의 주소 버스를 사용하여 1MB까지의 메모리를 엑세스 할 수 있었다. 이후 등장하는 80x86 마이크로프로세서(이하 80x86)들은 8086을 기초로 만들어 지고, 발전 됐다. 이 말은 곧 하위 호환성을 가진다는 말이 될 것이다. 실제로 8086용으로 제작된 프로그램이 지금 CPU에서도 잘 작동 된다. 따라서 8086을 잘 이해한다면 상위 CPU모델들을 이해하는데 큰 도움이 될 것이다.

 

 

 

[표 1-1-1] 참고

CPU 출시년도 트랜지스터수 제조 공정 패키지 최대 클럭 외부 데이터 버스 레지스터 주소 버스 L1 Cache L2 Cache
8086 1978 29,000 3.0 microns 40 pin DIP 10 MHz 16 16 20 none none
8088 1979 29,000 3.0 microns 40 pin DIP 10 MHz 8 16 20 none none
 
 

1.2. 8086의 구조

 8086은 버스 접속 장치(BIU, bus interface unit)와 실행 장치(EU, execution unit)로 구성된다. 여기서 버스 접속 장치(이하 BIU)와 실행 장치(이하  EU)를 알아 보자.

 

[그림 1-2-1] 참고

 

 

BIU : 프로세서와 외부 장치와의 데이터 전달에 필요한 메모리주소나 I/O주소의 생성을 담당하는 하드웨어 기능 제공

EU : BIU로 부터 프로그램 명령어 코드와 데이터를 받아들여, 명령어를 수행한 다음, 범용 레지스터에 결과를 저장하는 기능 제공. EU는 BIU를 통해서 모든 데이터를 받고 보낸다.

 

 

1.3. 인출(fetch) 사이클과 실행(excute) 사이클

 

인출(fetch) : IP(Instruction pointer) 레지스터가 가리키고있는 주소의 명령어를 가져 오는 것.

실행(excute) : 인출한 명령어를 실행 하는것.

 

 8086은 동작 속도를 높이기 위해서 앞에서 설명한 BIU와 EU로 구성 하였다. 이는 인출 사이클과 실행 사이클이 중첩되게 할 수 있다. 이를 알아 보기 위해 8086이 처음 시작할 때 하는 행동을 살펴보자.

 

① BIU가 명령어 포인터 레지스터의 내용을 주소 버스로 보내어 메모리의 선택된 바이트 혹은 워드가 BIU로 읽혀 들어오게 한다.

② IP 레지스터를 하나 증가 시켜 다음 명령어 인출을 준비한다. (크기에 따라 둘 이상 증가 되기도 한다.)

③ BIU에 들어온 명령어는 큐(queue)에 저장된다. 큐는 선입출(FIFO)방식인 저장 레지스터이다.

④ 제일 초기엔 큐가 비어 있기 때문에, EU는 바로 큐에서 명령어를 꺼내어 실행한다.

⑤ EU가 가지고온 명령어를 실행하고 있는 동안, BIU는 새로운 명령어 인출을 시작한다. 첫번째 명령어의 실행 시간에 따라 다르지만, EU가 다음 명령어를 큐에서 꺼낼 준비가 될 때 까지는 BIU는 명령어 큐에 여러 개의 명령어를 저장 할 수 있다.

⑥ BIU는 큐에 명령어를 채우고, EU는 이 명령어를 인출하고 실행하는 사이클이 계속 된다.

 

 BIU는 명령어 큐에 두 바이트 이상 저장 공간이 생길 때 마다 새 명령어를 인출 하는데, 이러한 파이프 구조는 BIU가 새 명령어를 인출 할 때 까지 기다리지 않고, EU가 거의 연속적으로 명령어를 실행 할 수 있게 한다. 이는 CPU의 동작 속도를 크게 향상 시킨다.

 

 하지만 EU가 대기 모드에 들어가는 경우가 있는데, 3가지 조건이 있다. 첫번 째 조건은 명령어가 큐에 있지 않는 메모리 위치를 엑세스 할 필요가 있을 때 일어난다. BIU는 명령어 인출을 보류하고 이 메모리 위치의 주소를 출력한다. 메모리 엑세스를 기다린 후에 EU는 큐로 부터 명령어를 꺼내어 실행을 재개 하고, BIU는 계속해서 명령어 큐를 채운다. 두 번째 조건은 실행 될 명령어가 점프 명령어일 때 일어난다. 이 경우, 제어는 새로운 주소로 전달(비순차적이다) 되어야 하지만 큐는 명령어가 항상 순차적으로 실행된다고 가정하고 틀린 명령어 코드를 저장하고있다. EU는 점프 주소에 있는 명령어가 인출되는 동안 기다려야 한다. 현재 큐에 들어가 있는 모든 명령어는 버려진다.(덮어쓰기가 이루어짐) 마지막 세번 째 조건은 BIU가 명령어 인출을 멈추게 하는 경우이다. 이는 실행속도가 느린 명령어를 실행할 때 일어난다. 이런 명령어들은 하나만 실행 해도 명령어 큐가 다 차 버린다. 따라서 BIU는 EU가 큐에서 하나 또는 두 바이트를 꺼내 갈때 까지 기다린 후에 다시 인출을 진행한다.

 

[그림 1-3-1] 인출과 실행 사이클, 명령어 파이프 라인

 

 

1.4. 8088 프로세서란? 

 위의 [표 1-1-1 ] 참고를 보면 알겠지만, 기본적인 구조는 8086과 동일하다. 유일한 차이점은 BIU이다. 8086은 16비트 버스이지만, 8088은 그 반인 8비트 버스이다. 명령어 큐 사이즈도 작아졌다.(8086 명령어 큐 사이즈 : 6바이트, 8088 명령어 큐 사이즈 4바이트) 지금으로 치자면 팬티엄의 보급형으로 나온 셀러론급 CPU라고 생각해도 무방하다. EU는 동일하기 때문에 프로그래머 입장에서는 프로그래밍하는 것이 동일하다. 그러므로 8086 구조만 알면 된다. (8088용 프로그램은 변경없이 8086에서 실행 가능하다.)

 

 

1.5. 레지스터

 레지스터란 CPU가 여러 가지 명령을 실행할 때, 데이터나 계산의 중간 결과를 일시적으로 보관하거나, 각종 연산의 처리, 주소 지정등에 사용되는 CPU내부의 램(RAM)을 말한다. 하드웨어 적으로 외부 메모리인 램(RAM)이나 롬(ROM)과 달리 CPU안에 들어 있으며, 버스 인터페이스의 내부 버스에 직접 연결되어 있기 때문에 외부 메모리에 비해서 CPU의 엑세스 시간이 훨씬 짧고 지정 방법도 간단하다.

 

[그림 1-5-1] 8086 레지스터의 구성

 

범용 레지스터(General Registers)

 데이터 레지스터, 데이터 그룹이라고도 불리며, 누산기(AX 레지스터, Accumulation)와  BX, CX, DX 레지스터로 구성된다. 각 레지스터의 크기는 16비트지만, 바이트(8비트) 혹은 워드(16비트) 단위로 엑세스 할 수 있다.(예- AX는 AH와 AL로 구성) 각각은 데이터를 다룰 때 구분없이 사용되거나, 각각 특별한 용도로 사용된다. 대개 다음 명령어에 사용될 임시 결과를 저장하는데 사용된다.

 

□ AX(Accumulation, AH + AL = AX)
 주로 산술 연산(덧셈(AND), 뺄샘(SUB), 곱셈(MUL), 나눗셈(DIV)), 논리 연산(AND, OR, XOR등)의 대상이 된다. C함수는 함수 내에서 계산한 값을 리턴 할 때 AX레지스터에 넣어서 리턴한다.
 
□  BX(Base, BH + BL = BX)
 메모리상에 있는 변환표의 시작 번지를 가리키거나, 간접 어드레싱 모드에서 오프셋 어드레스를 가리키는데 사용된다.
 
□ CX(Counter, CH + CL = CX)
 주로 카운터하는데 사용하며, 카운터로 사용 될 경우엔 다른 레지스터로 대체할 수 없다. 문자열(string)을 다루는 명령(MOVSB, SCASB 등)이나 루프 명령(LOOP, REP)에서 카운터로 사용하거나, 쉬프트 명령에서 쉬프트 수, 로테이트 명령의 로테이트 수를 나타내는데 사용한다.
 
□ DX(Data, DH + DL = DX)
Port로의 입출력 명령(IN, OUT)에서 포트 어드레스를 지정하거나, 곱셈,나눗셈 명령에서 상위워드를 저장하는 데이터 레지스터로 사용한다.

 

세그먼트 레지스터(Segment Registers)

 8086의 CPU레지스터는 16비트이다. 하지만 8086의 어드레스 핀수는 20개이다. 따라서 최대 1MB(2의 20승)의 메모리를 가질 수 있다. 16비트 레지스터로 지정할 수있는 최대 메모리는 64KB(2의 16승)이므로, 이러한 1MB의 메모리를 전부 지정할 수 없다. 해결 방법으로 나온 것이 1MB의 메모리를 64KB단위로 나누어 관리하는 것이다. 이렇게 나눈 64KB 메모리 공간을 세그먼트라고 하고, 이 세그먼트는 16의 배수인 메모리 주소에서만 시작한다. 이 세그먼트의 시작 주소를 저장하는 레지스터가 세그먼트 레지스터이다. 자세한건 뒤에 나올 세그먼티드 메모리에서 다룬다.

 

포인터 레지스터와 인덱스 레지스터(Pointer Registers, Index Register) 

 16비트 크기를 가지는 오프셋 레지스터이다. 범용 레지스터와는 달리 상위및 하위 바이트로 분리해서 사용할 수 없다. 세그먼트 레지스터만 가지고서는 64KB 메모리공간의 시작 주소밖에 표시할 수 없으므로, 각 세그먼트 내의 주소를 나타내기 위해 또 하나의 16비트 레지스터가 필요한데, 이때 사용되는 레지스터를 포인터레지스터 또는 인덱스 레지스터이다. (메모리에 대한 포인터로 사용된다.) 자세한건 뒤에 나올 세그먼티드 메모리에서 다룬다.


'80x86 프로세서' 카테고리의 다른 글

3장. 일반적인 개념들  (0) 2010.04.12
2장. 80386 프로세서 (3/3)  (0) 2010.04.12
2장. 80386 프로세서 (2/3)  (0) 2010.04.12
2장. 80386 프로세서 (1/3)  (0) 2010.04.12
1장. 8086/8088 프로세서 (2/2)  (2) 2010.04.12

+ Recent posts