인텔 8086

(8088에서 넘어옴)

1 개요

인텔의 16비트 CPU이자 장대한 x86 아키텍처 역사의 시작. 1978년에 발표되었다. 자사의 기존 히트작이었던 8080 아키텍처를 16비트로 확장하고 곱셈/나눗셈 등의 연산 명령을 추가하였다. [1] 8080과의 바이너리 레벨에서의 호환성은 없지만 어셈블리 소스 레벨에서는 최대한 호환성을 갖출 수 있게 설계가 되어있는데[2]그 덕에 아키텍처가 깔끔하지 못한 부분도 있다는 비판도 있는 모양. 당시 8086의 프로그래밍 모델은 프로그래머들에게 매우 까였다(...)고 한다. IBM PC의 성공으로 인해 잘나갔던 CPU임에도 불구하고 아케이드 기판이나 콘솔 쪽의 CPU에는 거의 채용되지 못하고[3] 경쟁모델인 모토로라 68000에게 완패한데는 그만한 이유가 있었던 것.

8086은 20비트의 주소 버스를 가지고 있어 총 1MB(2^20 Byte)의 물리 메모리를 다룰 수 있다. 그러나 8086의 16비트 레지스터만으로는 64KB(2^16 Byte)만을 다룰 수 있었기 때문에 '세그먼테이션'이라는 방식을 통해 메모리에 접근하도록 되어있다. 물리 메모리를 16비트 레지스터로 접근할 수 있을 만큼의 분량씩을 '세그먼트'라는 단위로 나누고 해당 세그먼트 내부에서의 위치를 '오프셋'으로 지정하는 것이다. 그래서 물리적인 메모리 주소와 논리적인 메모리 주소의 표기법이 일치하지 않고 세그먼트:오프셋 표기를 사용해서 물리적 메모리 주소에 접근하게 되는데[4] 그 덕분에 당시에는 C 프로그래밍을 할때 near 포인터와 far 포인터라는 개념이 있었다. 같은 세그먼트 안에서의 오프셋 주소와 다른 세그먼트의 오프셋 주소를 구분해야할 필요가 있었기 때문인데 C 언어 공부를 호기롭게 시작했다가 포인터에서 막혀서 접었다느니 하는 포인터에 대한 악명은 주로 8086 시절에서 기인한다. 오늘날의 C 프로그래밍 환경에서는 그런 거 없기 때문에 생각보다 포인터 개념은 복잡하지 않다. 네?

여담으로 이 세그먼테이션 구조는 원래 처음 설계할 때는 메모리 접근 상한이 64KB였던 8080과 호환성이 있는 환경을 만들어줌과 동시에 멀티태스크를 염두에 두고 설계한 것이었다고 한다. 64KB 정도면 애플리케이션 하나 돌리는데 충분한 큰 메모리였기 때문에([5]) 메모리를 64KB 단위로 분할하여 여러 개의 애플리케이션을 메모리에 올리기 위한 구조였다고. 그러나 8086이 오랜 기간 잘나간 덕에 64KB의 크기는 택도 없는 사이즈가 되었고 결국 프로그래밍이 복잡하게 되었다는 공밀레 슬픈 사연이 있다. 구체적인 메모리 맵은 이 문서를 참조.

부동소수점 연산 기능은 내장하고 있지 않고 별도의 보조프로세서인 8087을 함께 사용하도록 하는 구조로 되어있다. 당시만 해도 부동소수점 연산 기능은 과학기술 등 특정 분야에서만 사용되어 중요하게 여겨지지 않았기 때문. 그 이전 세대의 8080 등에도 부동소수점 연산 명령은 CPU에 내장되어있지 않았다. 반드시 필요한 사용자만 보조프로세서를 구입하고 그 이외의 경우에는 소프트웨어적으로 처리하게 하여 가격을 인하하려는 정책이었던 셈. 이 구조는 80386까지 이어지다가 80486에 가서야 부동소수점 연산 유닛을 CPU 안에 내장하게 되었다.

8086은 원조 x86이기 때문에 이후에 나온 모든 인텔의 x86(x86-64를 포함해서) CPU와 그 호환 CPU(AMD, VIA 등의)는 8086과 상위 호환성을 유지하고 있다. 80286에서는 8086처럼 동작하는 '사실 모드'(real mode)와 80286의 모든 성능을 낼 수 있는 '보호 모드'(protected mode)로 CPU의 모드를 나누고 있고 80386에서는 여러 개의 8086 애플리케이션을 동시에 구동하기 위한 '가상 86모드'(VM86)을 추가하였는데 이 설계는 오늘날까지도 그대로 이어져내려온다. 다만 오늘날의 x86-64에서는 64비트 모드인 '롱 모드'로 동작할 때는 VM86을 사용할 수 없다고. 어쨌거나 8086의 설계는 40년이 가까워가는 지금까지도 영향을 미치고 있을 정도라는 이야기.

2 토막상식

  • 8086은 '원조' x86이지만 원조 IBM PC에 쓰인것은 이 8086이 아닌 변형버전인 8088. 따라서 IBM PC 호환기종들도 대부분 8088을 사용했다. 다만 호환기 중에 컴팩 Deskpro, Tandy-1000의 일부 모델 등에 8086이 사용된 적이 있고 한참 나중에 나온 PS/2 Model 25 시리즈에는 8086이 탑재되긴 했으니 IBM PC에 8086이 아주 사용되지 않은 것은 아닌 셈.
  • 인텔은 8086은 당시 개발중인 차세대 32비트 CPU인 iAPX432가 나올때까지 모토로라와 경쟁에서 버텨줄 과도기적인 CPU로 설계했기 때문에 8080에서의 연계성만 고려하고 차후의 확장성을 그다지 고려하지 않았다고 한다. 하지만 현실은 iAPX432는 32비트라는게 무색할 정도로 구린 성능(이듬해에 나온 16비트 80286의 4분의 1에 불과한 성능이었다.)을 자랑하면서 시원하게 망했고 8086이 대박을 터뜨리는 아이러니한 상황이 되어버렸다.
  • 1980~90년대 일본의 국민 컴퓨터였던 PC-9801에 채용된 V30은 이 8086의 NEC제 상위호환(8086에 없는 기능을 일부 가지고 있었다) 클론. 8080과 Z80의 관계랑 비슷하다고 보면 된다. 이쪽도 운영체제가 MS-DOS(!) 직접적인 호환성은 없지만 후에 DOS/V가 나오면서 IBM PC 호환기종으로 수많은 야겜 게임들이 이식된 데엔 같은 CPU와 OS를 사용한다는 공통점이 있었기에 9801에서 PC로 이식이 쉬웠던 덕이 컸다. 이 V30은 최초의 스마트폰으로 알려진 IBM 시몬이나 휴대용 게임기인 원더스완에도 들어간 적이 있으며, V30의 외부 버스를 8비트로 제한한 버젼인 V20이라는 8088 호환 CPU는 국내에 유통되었던 일부 IBM PC XT 호환 기종에 탑재되기도 했으며, MS-DOS 기반 핸드헬드 PC인 HP 95LX에도 들어갔다. 당시 V20 CPU가 탑재된 IBM PC XT 호환 기종을 사용했던 이들의 말을 빌리자면 원판인 8088보다는 성능이 좋았던 나름대로 가성비 좋은 제품이었다고...

3 자매품(?)

3.1 인텔 8088

8086의 변형버전이다. 8086이 나온 이듬해인 1979년에 발표되었다. 기본적으로는 8086과 거의 동일한 성능을 낼 수 있지만 외부 데이터 버스가 8비트로 되어있는 것이 특징. 당시에 시장에 나와있던 8비트 신호를 주고받는 주변기기들을 그대로 사용하기 위해서 이런 구조가 되었다고 한다.

IBM PC의 CPU로 채용됨으로써 장대한 x86 아키텍처의 개막을 열어제낀 모델이기도 하다. 일부 8086이나 8086/8088 호환칩을 사용한 호환기종도 있었지만 IBM PC XT까지의 대부분의 IBM PC 호환기종은 8088을 사용했다고 보면 된다. 오리지널 IBM PCIBM PC XT는 4.77MHz 모델을 채용했지만 80년대 중반 이후에 나온 호환기종들은 8MHz나 10MHz의 고속 버전을 사용한 모델이 대부분이었다. 속도가 10MHz나 돼서 숙제도 빨리 끝낼 수 있어요!

메모리 주소 버스는 8086과 동일한 20비트이므로 다룰 수 있는 메모리 양도 마찬가지로 1MB. "그런데 왜 XT는 640KB가 한계였다고 하지?" 라는 의문이 든다면 기본 메모리 문제 항목을 참조.

3.2 인텔 80186/80188

8086/8088의 상위모델. 80186/80188은 분명히 8086/8088의 상위 모델로 별도의 CPU이나 서술 내용이 적어 별도의 문서로 분리하지 않고 함께 서술한다.

1982년에 발표되었다. 8086/8088과 마찬가지로 80186/80188은 똑같은 성능에 외부 데이터버스가 16비트/8비트라는 차이가 있다. IBM PC AT인텔 80286을 채택하는 바람에 중간에 낀 80186/80188은 PC의 CPU로 거의 쓰이지 않아서 존재 자체도 모르는 사람이 많다. 80186도 있었어?! 그나마 PC에 사용된 예가 있기는 있었는데, 초창기 IBM PC 호환기종끝판왕으로 유명했던 Tandy 2000이나 MS-DOS 기반 핸드헬드 PC인 HP 100/200LX 정도만이 유명하다.

80186/80188은 80286 처럼 대폭 성능향상을 꾀하지는 않았고 8086/8088의 기본기능에 주변 IC(클럭 제네레이터, 인터럽트 컨트롤러, 타이머 등등)를 포함시키고 10여가지 커맨드를 추가한 정도의 마이너 업그레이드 버전이다. 성능도 약간 향상되어 동클럭이라면 30% 정도 빨랐다고 한다. 마이크로컨트롤러(MCU)에 가까운 설계라서 임베디드 쪽에는 그럭저럭 쓰였다는 모양.
  1. 8080이나 그 상위호환 버전인 Z80의 사칙연산 명령은 내부적으로는 덧셈(ADD)과 뺄셈(SUB) 밖에 없다. 곱셈과 나눗셈은 덧셈, 뺄셈, 시프트 명령 등을 이용해서 수행하게 되어있다.
  2. 즉, 8080을 위해 만든 프로그램 자체를 그대로 실행할 수는 없지만 어셈블리어로 작성한 소스가 있으면 8086에서 어셈블해서 실행파일을 만들어 실행할 수 있다는 이야기.
  3. 그래도 아예 채용되지 않은 것은 아니고 1980년대에 8086 CPU를 사용한 아케이드 기판이 일부 존재했기도 하고, 8086 호환 클론 CPU인 V30을 사용한 라이덴도 있었고 반다이의 휴대용 게임기인 원더스완도 V30을 사용하였다.
  4. 실제 물리 메모리 주소는 세그먼트 주소*16+오프셋으로 얻을 수 있다. 세그먼트 주소를 4비트 왼쪽으로 시프트하고 오프셋을 더하는 것.
  5. 애플 II를 위시한 당시의 8비트 PC들은 대부분 64KB가 메모리의 한계였을 정도다. 참고로 MS-DOS용 실행파일 중에 확장자가 .com인것과 .exe인 것이 있는데 .com인 것이 바로 이 세그먼트 하나(64KB)에 들어가도록 만들어질 것을 고려한 구조의 실행파일이다.