http://www.righto.com/2020/07/the-intel-8086-processors-registers.html
http://www.righto.com/2020/06/a-look-at-die-of-8086-processor.html
INTEL 8086 프로세서란?
1978년 인텔에서 개발한 개인용 컴퓨터 ( PC : Personal Computer ) 16비트 CPU 칩이다.
16비트 칩이란 의미는 16비트의 데이터 버스를 가진다는 말을 뜻하는데
이는 한 번의 판독과 기록 사이클 동안 기억장치로부터 16비트 ( 2바이트 ) 크기의 데이터를 읽고 쓸 수 있다는 말이다.
즉, 한 번의 클럭에 16비트의 데이터 처리가 가능하다.
또한 20비트 주소 버스를 가지고 있어 2^20 바이트 주소까지 지정할 수 있다. 즉, 16진수로 0에서 FFFFF까지 표현 가능하다.
아래는 8086 프로세서 내부 구조이다
크게 2가지 섹터로 볼 수 있다.
명령어를 연산하는 명령어 실행 장치 EU ( Execution Unit )
기억장치 혹은 입출력장치로부터 데이터를 읽어오거나 출력 그리고 명령어를 인출하는 BIU ( Bus Interface Unit )
EU의 구성 요소로는 다음과 같다.
a. 범용 레지스터 (8개) : AX, BX, CX, DX, SP, BP, SI, DI - 연산항과 포인터를 저장
b. 임시 레지스터
c. ALU ( 산술논리 연산장치 )
d. 플래그 레지스터(1개) - 연산 결과의 정보 저장. 실행되고 있는 프로그램의 상태를 보고함
BIU의 구성요소로는 다음과 같다.
a. 세그먼트 레지스터 (4개) : CS, DS, SS, ES( 세그먼트 시작 주소 저장 )
b. 명령어 포인터 IP (1개) ( 다음에 실행될 명령어 가르킴 )
c. Adder ( 유효 주소계산을 위한 가산기 )
d. 명령큐 버퍼 ( 실행할 명령어를 임시로 저장 )
위에서 확인할 수 있듯 8086 프로세서의 기본적인 레지스터는 총 14개다.
범용 8
플래그 1
세그먼트 4
명령어 포인터 1
(임시 레지스터 제외)
*레지스터란 데이터를 임시로 저장하고 빠르게 읽을 수 있는 기억 장치이다.
ㄱ. AX는 accumulator.
ㄴ. BX는 베이스 레지스터.
ㄷ. CX는 카운트 레지스터.
ㄹ. DX는 데이터 레지스터.
스택 포인터는 프로그램 실행 중 데이터의 저장 주소를 기억하고 있는 레지스터이다.
베이스 포인터는 스택 세그먼트 SS 영역 내에 배치한 데이터에 대한 베이스 주소를 저장해 두기 위해 사용한다.
SI는 연산항 소스와 소스 데이터 지정에 사용하고
DI는 연산항의 처리 대상 또는 목적항 데이터를 나타내는데 사용한다
세그먼트 레지스터의 종류는 CS, DS, ES, SS이다. 역할은 각 세그먼트의 시작 주소를 저장하는 것이다. 8086에서는 1MB의 메모리 내에 세그먼트라는 4개의 64KB 블록을 정의한다.
CS -- code segment의 주소 저장 >>
code segment : 프로그램 실행 명령들이 내장되는 메모리 영역의 시작 위치를 보관
DS -- data segment의 주소 저장 >>
data segment : 데이터가 저장되는 메모리 영역의 시작 위치 보관
ES -- extra segment의 주소 저장 >>
extra segment : 여분의 데이터 세그먼트. 주로 string 명령 수행시 사용
SS -- stack segment의 주소 저장 >>
stack segment : interrupt와 subroutine의 반환 주소를 저장하는데 사용
플래그 레지스터는 연산 결과를 저장하는데 연산 결과의 값이 음수인지, 양수인지, 컴퓨터 사용자가 일반 사용자인지 관리자인지 등 다양한 상태에 대한 정보를 담고 있다.
8086의 주소버스는 20비트로 되어있는데 반해 레지스터는 16비트이므로 1개의 레지스터로 2^16승까지의 주소만 표현이 가능하다.
즉, 2^20 주소를 만들기 위해선 2개의 레지스터를 사용하여 만들 수 있다. 세그먼트 레지스터를 왼쪽으로 4비트만큼 자리 이동하여 다른 레지스터와 덧셈 연산을 진행하면 2^20까지의 물리주소를 얻을 수 있다.
위 이미지는 20비트 주소를 만드는 과정이다. 1F00이 담긴 세그먼트 레지스터를 좌측으로 4비트만큼 SHIFT해서 ( 우측 맨끝에 16진수로 0을 하나 추가 ) 1F000을 만든 후 오프셋 주소 02A5가 담긴 레지스터와 더하면 실제 물리주소가 1F2A5로 출력된다.
링크텍스트 --- 참고
다음은 디버깅을 위해 참고하면 좋은 레지스터 특성이다.
다음은 부호가 있는 데이터를 표현하는 방식이다.
이번에는 명령어의 형태에 대해 알아보자.
BIU에서 인출되어 EU에 전달되는 명령어의 형태는 어떻게 되어있냐?
명령어 + OPEREND ( 연산항 ) 의 형태이다. 여기서 연산항은 주소 지정 레지스터를 의미한다.
명령어의 일반적인 크기는 1단어(2바이트 - 16bit )로 구성되어 있고, 긴 명령은 2단어(4바이트) 이상까지 확장되며, 최대 3단어(6바이트)까지 확장된다.
( 위의 이미지 같은 경우 16비트 명령어를 만들기 위해선 앞에 00000000을 추가하면 완성된다 )
몇 바이트의 문자였는지를 확인하기 위해선 첫 바이트의 앞부분을 확인하고 판단한다.
(ASCII 포스팅 참고)
펜티엄 프로세서
https://m.blog.naver.com/erke2000/221537557513 -- 인텔 CPU 역사
펜티엄 프로세서는 8086에서 진화된 버젼으로 32비트 데이터 버스를 갖는다.
내부적으로는 486 프로세서와 같은 32 비트 버스를 사용하지만 메모리와 연결되는 외부 데이터 버스는 64비트이기 때문에 단일 버스 사이클 당 전송될 수 있는 데이터의 양이 486 프로세서의 2배가 된다.
보유 레지스터는 총 크게 4 섹터로 나눌 수 있다.
1) 기본 프로그램 실행 레지스터는 말 그대로 프로그램 실행을 위한 기본적인 역할을 담당하고 구성은 다음과 같다.
ㄱ. 8개의 32비트 범용 레지스터
ㄴ. 6개의 16비트 세그먼트 레지스터
ㄷ. 32비트 플레그 레지스터
ㄹ. 32비트 명령어 포인터 레지스터
다음은 32비트 플레그 레지스터의 비트별로 담고 있는 상태 정보다.
2) FPU 레지스터는 부동 소수점 연산을 위한 실행 환경을 제공한다.
3) MMX 레지스터는 64비트로 패킷된 바이트, 워드, 더블 워드 정수에 대한 SIMD 연산을 지원한다.
4 ) XMM 레지스터는 SSE 확장 ( Streaming SIMD Extensions)를 지원한다. 즉, 멀티태스킹을 구현해주는 SIMD 기능을 더 확장시켜준다고 볼 수 있다.
다음 이미지를 통해 펜티엄의 버젼별 추가된 확장 기술 및 레지스터들을 알 수 있다.