Intel 8086
出典: フリー百科事典『ウィキペディア(Wikipedia)』
Intel 8086(インテル8086)はインテルが開発した16ビットCPU。80x86アーキテクチャの最初の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とは互換性がない[1]。
8080のアーキテクチャと大きく異なるのは、演算用のアドレスレジスタのほかに、セグメントレジスタという、アドレス変換のための16ビットのレジスタを持っていることである。実際にCPUがアクセスするメモリ空間は、16ビット幅のレジスタによって指定された64KBのアドレス空間に、さらに16ビット幅のセグメントレジスタの値を16倍(左に4ビットシフト)して加算するため、1MBのメモリ空間を利用できた。
8086のアーキテクチャでは、プログラム内で通常表現されるアドレスの値は16ビット幅であり、64KB以上のメモリ空間にアクセスする場合のみセグメントレジスタの値を変更したり、別のセグメントレジスタを指定してアクセスする手法が用いられている。内蔵する4本のセグメントレジスタの値を全て同一にすると、8ビットの8080と同等の環境となり、8080用ソースを8086へ移植するのが容易であるほか、実行バイナリのリロケータブル化が容易であり、当時のパーソナルコンピュータのリソースを鑑みればこれらの制約も実装としては実利的、といった評価もある一方、直接指定できるアドレスが16ビットのままだったため、64Kバイトを超えるメモリ空間にアクセスする場合には、セグメントレジスタの値を変更しつつアクセスせざるを得ず、プログラム的に煩雑になってしまうという難点があった。
メモリ空間を1MBとしたのは、当時使われていた40DIPパッケージにアドレス・データバスを割り当てる際に、アドレスピンを効率良く増やして割り当てられる値であったとも言われる。
また、より大容量のアプリケーションを担い、高性能を発揮する次世代のプロセッサとしては、当時計画中であった32ビットCPU、iAPX432を充てる事が考えられ、8086は、8ビットアーキテクチャから32ビットアーキテクチャへの橋渡しとして位置づけられたので、それ自体を積極的に拡張する事は考えられなかったとも言われる。
一方、リニアなメモリ空間を実装できなかった事に対する批判もあるものの、8080との(ソースレベルでの)互換性を重視し、既存の8080環境やCP/Mなどのアプリケーションの移植、プログラマの移行などにも積極的であったことで、8086 の普及に繋がったと見ることもできる。
[編集] プログラミングモデル
プログラム領域(コードセグメント)、データ領域(データセグメント)に対して、それぞれセグメントレジスタ使用の有無を考えると合計4つのモード(メモリモデル)が存在することになるため、コンパイル、あるいはリンク時に気を使う必要があった。
MS-DOSの実行ファイルの拡張子COM(セグメント固定でデータ・コードがそれぞれ64KB以内)と拡張子EXE(セグメント使用のリロケータブルファイル)の区別は、このメモリモデルの違いである。
C言語コンパイラの移植にあたっては、メモリモデルを限定してしまうか、ポインタ変数のデータ型をnear(セグメント未使用)、far(セグメント使用)の2つにわけていた。後者ではコンパイル時に、メモリモデルをTiny、Small、Huge、Largeなどの中から選択するようになっていた。
- Tiny
- CS(Code Segment)、DS(Data Segment)が同じ値を持ち、両者の合計が64KB以下に制限される。
- Small
- CSに最大64KB、DSに最大64KBを割り当てられ、各々が64KB以下に制限される。
- Large
- プログラム領域、データ領域にそれぞれ64KBに制限されない任意のサイズを割り当てられる。
- 領域中の任意アドレスはfarポインタを用いる。個々の変数最大サイズは64KBに制限される。
- Huge
- Largeに準ずるが、ポインタ値はhugeポインタを使用する。
- hugeポインタはセグメント値を逐次再計算するので理屈の上では1MBを連続して扱える。
コード効率やセグメントの扱いやすさから、MS-DOS環境のソフトウェアは、Smallモデルでコンパイルし、必要に応じて最低限のセグメント操作をプログラマが指示する(適宜farまたはhugeポインタを使用し、また動的なメモリ確保によって64KBの制限を超える)構造を取っていたものも多い。
[編集] 1MBの壁
セグメント操作以外では、プログラムやデータのサイズに強い制約を課す「メモリ空間最大1MB」が深刻な壁として立ちはだかった。8ビットプロセッサの最大64KBの空間に比べると、8086が登場した当初は余裕があるように見えた。しかし、ROMやVRAMの為に消費される空間を除いたメインメモリ空間は640KBまたは768KBに制限され、アプリケーションの規模が拡大し、また扱うデータが増大すると不足する様になる。
この壁を乗り越えるハード的な実装は幾つかあったが、代表的なのは後に統一規格として制定されたバンク切り換えによるメモリ拡張方式EMSである。EMSを使用するソフトではデータを16KB~64KBの窓を通してアクセスする為、データの分解・再結合をしなければならず、またEMSを通常メモリのように透過的に扱うライブラリも無かった事から、低レベルなプログラミングをしなければならなかった(コード領域をEMSに展開し、コンベンショナルメモリの負担を軽減するコンパイラはあった)。
後に8086は80x86シリーズとしてパーソナルコンピュータ用CPUとして広く採用されるが、アドレッシング可能なメモリ空間最大の壁に都度直面している。これは8086を祖とする後継プロセッサでは旧ソフトウエア資産を継承する事が重要な命題であった故であり、レガシーアプリケーションが新しいアーキテクチャに移行するのが常に遅れていたのが原因である(その最たる物がマイクロソフトのオペレーティングシステムMS-DOSであった)。その為、80x86シリーズは1MBの壁に加えてアーキテクチャが改良される都度16MBの壁、4GBの壁によりユーザーを制約した(後に32GB~64GBの壁も生じたが、これはアーキテクチャの制約ではなくメモリバストポロジーによる制約である)。この制約は、インテルではなくアドバンスト・マイクロ・デバイセズ (AMD) によってもたらされた64ビットアーキテクチャAMD64の実現によって、実用上制約からユーザーを解放した。インテルはIntel 64として互換性のある実装を行った。AMD64を設計したアーキテクトは元ディジタル・イクイップメント・コーポレーション (DEC) に所属していた、Alphaプロセッサアーキテクトの一人であり、特にエンタープライズサーバー向けの主力プロセッサの座を巡る邂逅が長い紆余曲折を経て80x86系の元に戻ってきた事は、プロセッサー業界の複雑な関係の一端を見せている。
[編集] データバスについて
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ビットの周辺機器をサポートする際に、バス・サイジングの必要性が生じた。
[編集] 互換製品
[編集] 脚注
- ^ アセンブラのソースコードレベルでは、トランスレータの介在により同等のプログラムの生成が可能であった。詳細はQDOS#PC-DOS の誕生及びCP/M-86も参照のこと。
[編集] 関連項目
インテルのプロセッサ一覧 |
---|
4004 | 4040 | 8008 | 8080 | 8085 | 8086 | 8088 | iAPX 432 | 80186 | 80188 | 80286 | 80386 | i486 | i860 | i960 | Pentium | Pentium Pro | Pentium II | Celeron | Pentium III | StrongARM | XScale | Pentium 4 | Pentium M | Pentium D | Pentium E | Pentium Extreme Edition | Xeon | Core | Core 2 | Itanium | Itanium 2 (x86プロセッサ以外は斜体です) |