Intel 8086

Intel 8086の最新ニュースをまとめて検索!

8086
生産時期 1978年から
生産者 インテル
CPU周波数 5 MHz から 10 MHz
命令セット x86 (16ビット)
パッケージ 40ピン DIP

Intel 8086(インテル8086)はインテルが開発した16ビットCPU80x86アーキテクチャの最初のCPUで、1978年に発表された。

日本電気PC-9801などに採用されていた。対応のオペレーティングシステムに、MS-DOS、PC-DOS、CP/M-86があった。シリーズに、外部データバスを8ビットにした8088がある。初代のIBM PCに採用されたのは8088。協調して働くように準備されていた数値演算コプロセッサ8087があった。また、使われる機会は少なかったが、8089というI/Oプロセッサも存在した。

当時ライバルとされた製品には、モトローラ68000系CPUがある。

目次

[編集] アーキテクチャ

8086は8080のアーキテクチャを16ビットに拡張し、乗除算などの命令を強化したCPUである。またデータバスも16ビットとなっている。ただし、8080とバイナリーレベルの互換性はない。開発にあたってIntelは、8080からの速やかな移行を最重点事項に置き、8080のアセンブラソースコードに一切の手を加えることなく再アセンブルするだけで、8086用のバイナリを生成する事が出来た[1]

8086のレジスタセット

8080のアーキテクチャと大きく異なるのは、演算用のアドレスレジスタのほかに、セグメントレジスタという、アドレス変換のための16ビットのレジスタを持っていることである。実際にCPUがアクセスするメモリ空間は、16ビット幅のレジスタによって指定された64KBのアドレス空間に、さらに16ビット幅のセグメントレジスタの値を16倍(左に4ビットシフト)して加算するため、1MBのメモリ空間を利用できた。

8086のアーキテクチャでは、プログラム内で通常表現されるアドレスの値は16ビット幅であり、64KB以上のメモリ空間にアクセスする場合のみセグメントレジスタの値を変更したり、別のセグメントレジスタを指定してアクセスする手法が用いられている。内蔵する4本のセグメントレジスタの値を全て同一にすると、8ビットの8080と同等の環境となり、8080用ソースを8086へ移植するのが容易であるほか、実行バイナリのリロケータブル化が容易であるといったメリットもあった。

実装としてはかなりトリッキーであったが、互換性を重視しつつ開発が短期間で完了でき、かつコストパフォーマンスに優れた選択肢であった。これは、当時モトローラと激しいシェア争いを演じていたintelにとって極めて重大な要素だった[2]。反面、64Kバイトを超えるメモリ空間にアクセスする場合には、セグメントレジスタの値を変更しつつアクセスせざるを得ず、プログラム的に煩雑になってしまう欠点があった。

メモリ空間を1MBとしたのは、当時使われていた40DIPパッケージにアドレス・データバスを割り当てる際に、アドレスピンを効率良く増やして割り当てられる値であったとも言われる。

また、より大容量のアプリケーションを担い、高性能を発揮する次世代のプロセッサとしては、当時計画中であった32ビットCPU、iAPX432を充てる事が考えられていた。当初、8086は8ビットアーキテクチャから次世代のiAPX 432プロセッサへのつなぎとして考えられていたため、後に大規模な拡張を行う事は一切考えられていなかった[3]

演算に使えるレジスタが限定的だったり、メモリを直線的に使うのが面倒等の問題があったものの8080とのソースレベルでの互換性を重視し、既存の8080環境やCP/Mなどのアプリケーションの移植、プログラマの移行などにも積極的であったことが、現在のx86アーキテクチャの商業的な成功へとつながったと評価されている。

ハードウェア的には、供給クロックのデューティ比が1:2になっている。クロックジェネレータi8284に3倍のクロックを供給し、それを3分周することにより1:2のクロックを得る。[4]

[編集] プログラミングモデル

プログラム領域(コードセグメント)、データ領域(データセグメント)に対して、それぞれセグメントレジスタ使用の有無を考えると合計4つのモード(メモリモデル)が存在することになるため、コンパイル、あるいはリンク時に気を使う必要があった。

MS-DOSの実行ファイルの拡張子COM(セグメント固定でデータ・コードがそれぞれ64KB以内)と拡張子EXE(セグメント使用のリロケータブルファイル)の区別は、このメモリモデルの違いである。

C言語コンパイラの実装にあたっては、メモリモデルを限定してしまうか、ポインタ変数のデータ型をnear(セグメント未使用)、far(セグメント使用)の2つにわけていた。後者ではコンパイル時に、メモリモデルをTiny、Small、Huge、Largeなどの中から選択するようになっていた。

Tiny
CS(Code Segment)、DS(Data Segment)が同じ値を持ち、両者の合計が64KB以下に制限される。拡張子COMに対応する
Small
CSに最大64KB、DSに最大64KBを割り当てられ、各々が64KB以下に制限される。
Compact
CSには最大64KB割り当て、DSにはfarポインタを用いる。コードは小さいが、扱うデータが大きいときに用いられる。
Medium
CSにfarポインタを用い、DSには最大64KB割り当てる。コードが大きくても、扱うデータが小さい場合に利用される。
Large
プログラム領域、データ領域にそれぞれ64KBに制限されない任意のサイズを割り当てられる。
領域中の任意アドレスはfarポインタを用いる。個々の変数のサイズは64KBに制限される。
Huge
Largeに準ずるが、ポインタ値はhugeポインタを使用する。
hugeポインタはセグメント値を逐次再計算するので理屈の上では1MBを連続して扱える。

コード効率やセグメントの扱いやすさから、MS-DOS環境のソフトウェアは、Smallモデルでコンパイルし、必要に応じて最低限のセグメント操作をプログラマが指示する(適宜farまたはhugeポインタを使用し、また動的なメモリ確保によって64KBの制限を超える)構造を取っていたものも多い。

[編集] 1MBの壁

8086が登場して年月が経ち、1MBを越えるメモリが安価に手に入る時代に入ると、メモリ空間の小ささが問題となった。8ビットプロセッサの最大64KBの空間に比べると、8086が登場した当初は余裕があるように見えた。しかし、ROMVRAMの為に消費される空間を除いたメインメモリ空間は640KBまたは768KBに制限され、アプリケーションの規模が拡大し、また扱うデータが増大すると不足する様になる。この問題はオリジナルの8086の時代では問題にされなかったが、上位互換品である80286や80386のリアルモードを使う際に問題になった。(プロテクトモードで動作させれば1MBを越えるメモリを扱えたが、当時のMS-DOS及びそのアプリケーションは、多くの場合リアルモードを前提として動作していた為。)

この壁を乗り越えるハード的な実装は幾つかあったが、代表的なのは後に統一規格として制定されたバンク切り換えによるメモリ拡張方式EMSである。EMSを使用するソフトではデータを16KB~64KBの窓を通してアクセスする為、データの分解・再結合をしなければならず、またEMSを通常メモリのように透過的に扱うライブラリも無かった事から、やや煩雑なプログラミングをする必要があった。(コード領域をEMSに展開し、コンベンショナルメモリの負担を軽減するコンパイラはあった)。 80386からは仮想86モードを使ったソフトウエア的なEMSの実装が一般的となった。

[編集] データバスについて

8086の外部データバスは16ビットであるが、アドレッシングは8ビット単位で行われ、データバスの下位8ビットが偶数アドレス、上位8ビットが奇数アドレスとなる。 8086でシステムを構築する上で、従来からある8ビットCPU用の周辺チップ(8251、8255、8257、8259など)が多用されたが、これらのデータバスは8ビットであるため、8086に接続するには、8086のデータバスの上位もしくは下位8ビットのどちらかに接続することになった。 そのため、このような構成では、8086 CPUから見ると、周辺チップの連続するレジスタが偶数アドレスもしくは奇数アドレスのみにとびとびに割り当てられる格好となる。

PC-9800シリーズでは実際に上記のような構成になっており、I/Oマップが偶数アドレスと奇数アドレスで分断されている。 一方、外部データバスが8ビットの8088を採用したIBM PCではそのようなことはなく、8ビットの周辺チップは連続したアドレスに存在する。XTバスの拡張カードにより増設した機器も同様である。 そのため、後にPC/ATで16ビットのISAを採用した際に、8ビットの周辺機器をサポートするためにバス・サイジングの必要性が生じた。 また、PC-9800シリーズでも、PCカードのモデムなど、IBM PCシリーズ用に開発された8ビットの周辺機器をサポートする際に、バス・サイジングの必要性が生じた。

[編集] 互換製品

[編集] 脚注

  1. ^ 詳細はQDOS#PC-DOS の誕生及びCP/M-86も参照のこと。
  2. ^ モトローラは互換性より性能を重視した結果、6800シリーズと68000シリーズの構成を大きく切り替えた結果、アーキテクチャ的には優れたプロセッサとなったが、最終的にはx86アーキテクチャに敗れている。
  3. ^ ティム ジャクソン著 翔泳社刊 「インサイド インテル」より。
  4. ^ 沖電気製MSM80C86A-10(10MHz版)は1:1になっているなど、セカンドソースのメーカやクロック周波数によっては異なる場合もある。なお、インテルのi8086-1(10MHz版)では1:2である。

[編集] 関連項目

最終更新 2009年10月25日 (日) 01:41 (日時は個人設定で未設定ならばUTC)。
【Intel 8086】変更履歴

ご利用上の注意