8086 [ 3 ] ( iAPX 86とも呼ばれる) [ 4 ]は、1976 年初頭に開発が開始された後、1978 年 6 月 8 日に Intel からリリースされた 16 ビット マイクロプロセッサ チップです[ 5 ] 。 [ 6 ] 1979年にIntel 8088がそれに続き [ 7 ]、これは外部8ビットデータ バスを備えたわずかに改良されたチップで(より安価で少ないサポートICの使用を可能にした) ました。[注 1 ] 。
8086はx86アーキテクチャを生み出し、それが最終的にインテルの最も成功したプロセッサシリーズとなった。2018年6月5日、インテルはIntel 8086の40周年を記念した限定版CPU、Intel Core i7-8086Kを発売した。[ 5 ]
1972年、インテルはインテル初の8ビットマイクロプロセッサである8008を発表しました。 [注2 ]これは、プログラマブルCRT端末を念頭に置いてデータポイント社が設計した命令セットを実装しており、汎用性も高いことが証明されました。このデバイスは、小型の18ピン「メモリパッケージ」に収められていたため、独立したアドレスバスを使用できなかったこともあり(当時インテルは主にDRAMメーカーでした)、機能するコンピュータにするにはいくつかの追加ICが必要でした。
2年後、インテルは、もともと電卓IC用に開発された新しい40ピンDILパッケージを採用して、独立したアドレスバスを可能にする8080を発売しました。8080は、 8008とソース互換(バイナリ互換ではない)の拡張命令セットを備えており[ 8 ] 、プログラミングを容易にするために16ビット命令も含まれていました。8080デバイスは最終的に、以前のチップの3つの異なる動作電圧の代わりに単一の+ 5V電源を使用する、デプレッションロードベースの8085 (1977年)に置き換えられました。 [注3 ]この時期に登場した他の有名な8ビットマイクロプロセッサには、 Motorola 6800(1974年)、General Instrument PIC16X(1975年)、MOS Technology 6502(1975年)、Zilog Z80(1976年)、Motorola 6809(1978年)などがあります。
8086プロジェクトは1976年5月に開始され[ 9 ] 、当初は野心的で遅延していたiAPX 432プロジェクトの一時的な代替として意図されていました。これは、モトローラ、ジログ、ナショナルセミコンダクターなどの他のメーカーの遅延が少ない16ビットおよび32ビットプロセッサから注目を集めるための試みでした。
8086 は 16 ビット マイクロプロセッサでしたが、Intel の 8 ビット マイクロプロセッサ (8008、8080、8085) と同様のアーキテクチャを採用していました。これにより、8 ビットで書かれたアセンブリ言語プログラムをシームレスに移行することが可能になりました。[ 10 ]符号付き整数、ベース + オフセット アドレス指定、自己繰り返し演算などの新しい命令と機能が追加されました。PascalやPL/Mを含むALGOLファミリーの言語でネストされた関数のソース コード コンパイルを支援する命令が追加されました。主任設計者のStephen P. Morseによると、これはよりソフトウェア中心のアプローチの結果でした。その他の機能強化には、乗算および除算アセンブリ言語命令のマイクロ コード命令が含まれていました。設計者はまた、 8087や8089などのコプロセッサも想定していたため、バス構造は柔軟になるように設計されました。
命令セットと高レベルアーキテクチャの最初の改訂版は約3か月後に完成し[注4 ]、CADツールはほとんど使用されなかったため、4人のエンジニアと12人の レイアウト担当者が同時にチップの開発に取り組んでいた[注5 ] 。8086はアイデアから製品化まで2年強かかり、1970年代の複雑な設計としては速いと考えられていた。
8086 は、ランダム ロジック[ 11 ]とマイクロ コードの組み合わせを使用してシーケンス[注 6 ]され、約 20,000 個のアクティブトランジスタ( ROMとPLAサイトをすべて含めると 29,000 個)を備えたデプレッション ロード nMOS 回路を使用して実装されました。すぐに、Intel が高速スタティック RAM製品の製造用に開発したHMOS (High performance MOS の略)と呼ばれる新しい改良された nMOS 製造プロセスに移行しました[注 7 ]。これに続いて、HMOS-II、HMOS-III バージョン、そして最終的には、 Intel のCHMOSプロセスを使用して製造された、バッテリー駆動デバイス用の完全スタティックCMOSバージョンが登場しました[注 8 ] 。オリジナルのチップは 33 mm² で、最小フィーチャ サイズは 3.2 μm でした。MUL および DIV 命令はマイクロ コード化されていたため非常に低速だったため、x86 プログラマは通常、乗算と除算にビット シフト命令を使用しました。
8086は1981年に2μmにダイシュリンクされました。このバージョンでは、オリジナルの3.5μmチップにあったスタックレジスタのバグも修正されました。その後の1.5μmおよびCMOS版は、社内開発ではなく、他社に製造を委託されました。
アーキテクチャは、Stephen P. Morseが定義し、最終的な改訂版の改良には Bruce Ravenel (8087 の設計者) が協力しました。論理設計者の Jim McKevitt と John Bayliss がハードウェアレベルの開発チームの主任エンジニアでした[注 9 ]、Bill Pohlman がプロジェクトのマネージャーでした。8086 の遺産は、今日のパーソナルコンピュータやサーバーの基本命令セットに永続的に残っています。また、8086 は、Intel 286やIntel 386など、後に拡張されたバージョンの設計にも最後の 2 桁を提供し、これらはすべて最終的にx86ファミリーとして知られるようになりました。さらに、 Intel が製造するシステム デバイスのPCI ベンダー IDは 8086 です。[ 12 ]

内部レジスタ、内部および外部データバスはすべて 16 ビット幅であり、これにより 8086 の「16 ビット マイクロプロセッサ」としてのアイデンティティが確立されました。20 ビットの外部アドレスバスは 1 MiB の物理アドレス空間 (2 20 = 1,048,576 x 1バイト) を提供します。このアドレス空間は、内部メモリの「セグメンテーション」によってアドレス指定されます。データバスは、すべての制御線を標準の 40 ピンデュアル インライン パッケージに収めるために、アドレスバスと多重化されています。16 ビットの I/O アドレスバスを提供し、64 KBの独立した I/O 空間をサポートします。内部アドレス/インデックス レジスタが 16 ビット幅しかないため、最大線形アドレス空間は 64 KB に制限されます。64 KB メモリ境界を超えるプログラミングには、セグメント レジスタの調整が必要です (下記参照)。この問題は、80386アーキテクチャでより広い(32ビット)レジスタが導入されるまで存在していた( 80286のメモリ管理ハードウェアはこの点では役に立たなかった。なぜなら、80286のレジスタは依然として16ビット幅しかなかったからである)。
すべての外部操作に不可欠な信号を伝送する制御ピンの一部は、デバイスが最小モードまたは最大モードで動作しているかどうかに応じて、複数の機能を持ちます。前者のモードは、小型のシングルプロセッサシステム向けであり、後者は、複数のプロセッサを使用する中規模または大規模システム(一種のマルチプロセッサモード)向けです。最大モードは、8087または8089コプロセッサを使用する場合に必要です。ピン33(MN/ MX)の電圧によってモードが決まります。ピン33の状態を変更すると、他の特定のピンの機能も変更され、そのほとんどはCPUが(ローカル)バスを処理する方法に関係しています。[注10 ]モードは通常、回路にハードワイヤリングされているため、ソフトウェアで変更することはできません。これらのモードの動作は、Intelのデータシートとマニュアルのタイミング図で説明されています。最小モードでは、すべての制御信号は8086自体によって生成されます。
8086には、8つのほぼ汎用的な16ビットレジスタ(スタックポインタを含むが、命令ポインタ、フラグレジスタ、セグメントレジスタは除く)があります。そのうち4つ(AX、BX、CX、DX)は8ビットレジスタペアとしてもアクセスできます(図を参照)。残りの4つ(SI、DI、BP、SP)は16ビットのみです。[ 13 ]
8ビットプロセッサにヒントを得たコンパクトなエンコーディングのおかげで、ほとんどの命令は1アドレスまたは2アドレスの操作であり、つまり結果はオペランドのいずれかに格納されます。最大で1つのオペランドがメモリ内に配置されますが、このメモリオペランドはデスティネーションにもなり得ます。一方、もう一方のオペランドであるソースは、レジスタまたは即値のいずれかになります。また、単一のメモリ位置をソースとデスティネーションの両方に使用できる場合も多く、これは他の要因と相まって、当時のほとんどの8ビットマシンと同等(多くの場合それ以上)のコード密度を実現するのに貢献しています。
ほとんどのレジスタの汎用性は、8080や8085よりもはるかに高い。しかし、8086のレジスタは、当時のほとんどのミニコンピュータよりも特化しており、一部の命令によって暗黙的に使用される。アセンブリプログラマにとっては全く理にかなっているが、このため、コンパイラのレジスタ割り当ては、PDP-11、VAX、68000、32016など、当時のより直交性の高い16ビットおよび32ビットプロセッサと比較して複雑になる。一方、6502、6800、6809、8085、MCS-48、8051などの、比較的ミニマルだが普及している8ビットマイクロプロセッサやその他の同時代のアキュムレータベースのマシンよりも規則性が高いため、8086アーキテクチャ用の効率的なコードジェネレータを構築するのははるかに容易である。
もう一つの要因として、8086はPascalやPL/Mといったスタックベースの高級プログラミング言語をより良くサポートするために、8080や8085にはなかった新しい命令をいくつか導入したことが挙げられます。特に便利な命令としては、Pascal呼び出し規約を直接サポートする`let size`や`ret size`などがあります。(`let size`や`ret size`など、他のいくつかの命令は、後継の80186、80286、80386プロセッサで追加されました。)pushmem-oppush immedenter
ハードウェアでは、アドレスが小さくなる方向に拡張される64 KB (1 セグメント)のスタックがサポートされています。16 ビットのワードがスタックにプッシュされ、スタックの最上位は SS:SP によって指されます。割り込みは256 種類あり、ハードウェアとソフトウェアの両方から呼び出すことができます。割り込みはカスケード接続が可能で、戻りアドレスはスタックに格納されます。
8086は、 64KBの8ビット(または代替として 32KBの16ビットワード)I/Oポート空間を備えています。
8086 には 16 ビットのフラグ レジスタがあります。これらの条件コード フラグのうち 9 つがアクティブで、プロセッサの現在の状態を示します。キャリー フラグ(CF)、パリティ フラグ(PF)、補助キャリー フラグ(AF)、ゼロ フラグ(ZF) 、符号フラグ(SF)、トラップ フラグ(TF)、割り込みフラグ(IF)、方向フラグ(DF)、オーバーフロー フラグ(OF) です。ステータス ワードとも呼ばれるフラグ レジスタのレイアウトは次のとおりです。[ 14 ]
また、 8086 CPU が1メガバイトのメモリに通常とは異なる方法でアクセスできるようにする4 つの 16 ビットセグメントレジスタ (図を参照) があります。アドレス空間がレジスタ サイズを超えるほとんどのプロセッサのようにセグメント レジスタとアドレス レジスタを連結するのではなく、8086 は 16 ビット セグメントを 4 ビット左にシフトしてから 16 ビット オフセット (16×セグメント + オフセット) に加算し、32 ビットのセグメント:オフセット ペアから 20 ビットの外部 (または実効または物理) アドレスを生成します。結果として、任意の外部アドレスは最大 2 12 = 4096 通りの異なるセグメント:オフセット ペアで参照できます。[ 15 ]
多くのプログラマーからは複雑で扱いにくいと思われているこの方式ですが、利点もあります。64KB未満の小さなプログラムを、独自のセグメント内の固定オフセット(例えば0000)からロードできるため、再配置 の必要がなく、最大でも15バイトのアライメントの無駄で済みます。
8086ファミリのコンパイラは、一般的にニアポインタとファーポインタの2種類のポインタをサポートしています。ニアポインタは、プログラムのコードまたはデータセグメントに暗黙的に関連付けられた16ビットのオフセットであり、1つのセグメントに収まるほど小さいプログラムの部分内でのみ使用できます。ファーポインタは、20ビットの外部アドレスに解決される32ビットのセグメント:オフセットのペアです。一部のコンパイラは、巨大ポインタもサポートしています。巨大ポインタはファーポインタに似ていますが、巨大ポインタに対するポインタ演算はそれを線形20ビットポインタとして扱います。一方、ファーポインタに対するポインタ演算は、アドレスのセグメント部分に触れることなく、16ビットのオフセット内でラップアラウンドします。
多数のポインタ、データ構造、関数に対してニアポインタとファーポインタを指定する必要性をなくすため、コンパイラはデフォルトのポインタサイズを指定する「メモリモデル」もサポートしています。tiny (最大64K)、small(最大128K)、compact(データ > 64K)、medium(コード > 64K)、large(コード、データ > 64K)、huge(個々の配列 > 64K)の各モデルは、コードとデータに対するニアポインタ、ファーポインタ、hugeポインタの実用的な組み合わせをカバーしています。tinyモデルは、ほとんどの8ビットベースのプロセッサと同様に、コードとデータが単一のセグメントで共有されることを意味し、たとえば.comファイルを作成するために使用できます。プリコンパイル済みライブラリは、多くの場合、異なるメモリモデル用にコンパイルされた複数のバージョンで提供されます。
Morse ら[ 16 ]によると、設計者たちは実際に 16 MB の物理アドレス空間を作成するために (4 ビットではなく) 8 ビットシフトを使用することを検討していた 。しかし、これによってセグメントが 256 バイト境界から開始せざるを得なくなり、 1976 年頃のマイクロプロセッサでは 1 MB は非常に大きいと考えられていたため、このアイデアは却下された。また、低コストの 40 ピンパッケージには、追加の 4 つのアドレスバスピン用のピンが十分になかった。
原理的には、アプリケーションがオペレーティングシステムからセグメントを取得し、異なるセグメント:オフセット ペアの等価性について仮定しない限り、シフト値を増やすことで、x86 シリーズのアドレス空間を後のプロセッサで拡張することができました。[注11 ]実際には、「巨大」ポインタや同様のメカニズムの使用が広く普及し、80386 の 32 ビット オフセット レジスタによって可能になったフラット 32 ビット アドレス指定により、最終的に限られたアドレス範囲がより一般的な方法で拡張されました。
命令ストリームはメモリからワードとしてフェッチされ、必要に応じてプロセッサによって内部的にバイトレベルでアドレス指定されます。命令ストリームキューイング機構により、デコードと実行を待機している間、最大 6 バイトの命令ストリームをキューに格納できます。キューは先入れ先出し(FIFO) バッファとして機能し、実行ユニット (EU) は必要に応じてそこから命令バイトを抽出します。キューに少なくとも 2 バイト分の空きがある場合、BIU はワードフェッチメモリサイクルを試みます。キューが空の場合 (たとえば、分岐命令の後)、キュー内の最初のバイトがすぐに EU で使用できるようになります。[ 17 ]
小規模なプログラムであれば、セグメンテーションを無視して、単純な16ビットアドレッシングを使用することができました。これにより、8ビットソフトウェアを8086に容易に移植することが可能になりました。MS-DOSはこの点を活用し、CP/Mと非常によく似たアプリケーションプログラミングインターフェースを提供するとともに、CP/Mと全く同じシンプルな.com実行可能ファイル形式を採用しました。これは、8086とMS-DOSが登場したばかりの頃は特に重要でした。なぜなら、既存の多くのCP/M(およびその他の)アプリケーションを迅速に利用可能にすることができ、新しいプラットフォームの普及を大幅に促進できたからです。

8086 の割り込みはIRET、ソフトウェアまたはハードウェアによって開始されます。割り込みは、プロセッサの状態も保存する長い呼び出しです。割り込みルーチンは通常、命令で終了します。すべての割り込みには、8 ビットの割り込み番号が関連付けられています。この番号は、アドレス 0~3FFH に格納されている 256 要素の割り込みベクタ テーブルでセグメント:オフセットを検索するために使用されます。いずれかのタイプの割り込みが発生すると、プロセッサの状態がプッシュされ、CS と IP がプッシュされ、割り込み番号が 4 倍されて新しい実行アドレスがインデックス付けされ、ベクタ テーブルからロードされます。
ソフトウェア割り込み命令INT nには、、、およびデバッグ用のINTOシングルバイトの 3 種類があります。INT 3
ハードウェア割り込みには、マスク可能なものとマスク不可能なものの2種類があります。
マスク不可能な割り込みは、マスク可能な割り込みよりも優先度が高くなります。割り込みイネーブルによって無効にすることはできません。NMI ピンがローからハイに遷移すると、基本的に割り込みがINT 2実行されます。
マスク可能なSTI割り込みは、それぞれ命令と命令によって有効化および無効化されますCLI。ハードウェア デバイスによって INTR がアサートされると、8086 は INTA を 2 回アサートし、バスから 8 ビットの割り込み番号を読み取ります。この番号は 4 倍され、ベクタ テーブル内の関連する割り込みサービス ルーチン アドレスを指します。マスク可能な割り込みは、INTA がアサートされている間は無効になりますが、IRET割り込みサービス ルーチンの最後に命令を実行すると再び有効になります。[ 17 ]
以下の8086アセンブリ_strtolowerソースコードは、ヌル終端ASCIIZ文字列をある場所から別の場所にコピーし、すべてのアルファベット文字を小文字に変換するサブルーチンです。文字列は1バイト(8ビット文字)ずつコピーされます。
このサンプルコードは、BP(ベースポインタ)レジスタを使用してコールフレームを確立します。コールフレームとは、サブルーチンの実行に必要なすべてのパラメータとローカル変数を格納するスタック上の領域です。この呼び出し規約はリエントラントコードと再帰コードをサポートしており、1950年代後半からAlgol系の言語で使用されています。フラットメモリモデルが前提とされており、具体的には、DSセグメントとESセグメントが同じメモリ領域をアドレス指定するものとします。

この特定のチップでは他の設計上の選択によって部分的に影が薄くなっていますが、多重化されたアドレスバスとデータバスはパフォーマンスをわずかに制限します。16 ビットまたは 8 ビットの転送は 4 クロックのメモリ アクセス サイクルで行われ、16 ビットでは高速ですが、多くの現代の 8 ビット ベースの CPU と比較すると 8 ビットでは低速です。命令が 1 バイトから 6 バイトまで変化するため、フェッチと実行は並行して行われ、別々のユニットに分離されます (これは今日の x86 プロセッサでも同じです)。バス インターフェイス ユニットは、6 バイトのプリフェッチ キュー (疎結合パイプラインの一種) を介して命令ストリームを実行ユニットに供給し、レジスタと即値の操作を高速化しますが、メモリ操作は遅くなります (4 年後、このパフォーマンスの問題は80186と80286で修正されました)。しかし、完全な(部分的なものではなく)16ビットアーキテクチャと全幅ALUの採用により、16ビット算術命令を1回のALUサイクルで実行できるようになった(8080や8085のように内部キャリーを介して2サイクル必要だったのとは対照的)ため、これらの命令の実行速度が大幅に向上しました。演算とオペランドタイプおよびアドレッシングモードの直交化、その他の機能強化と相まって、古いチップの方が高速な場合もあるものの(後述参照)、8080や8085に比べてパフォーマンスが大幅に向上しました。
これらの表からわかるように、レジスタと即値に対する操作は高速(2~4サイクル)でしたが、メモリオペランド命令とジャンプ命令は非常に低速でした。ジャンプ命令は単純な8080や8085よりも多くのサイクルを要し、IBM PCで使用された8088はさらにバス幅が狭いため、速度が制限されていました。メモリ関連の命令のほとんどが低速だった理由は次の3つです。
しかし、インテルの次世代CPUである8086ファミリーでは、メモリアクセス性能が劇的に向上しました。80186と80286はどちらも専用のアドレス計算ハードウェアを備えており、多くのサイクルを節約できました。また、80286はアドレスバスとデータバスが分離(非多重化)されていました。
8086/8088は、ハードウェア/マイクロコードベースの浮動小数点演算性能を追加するために、数学コプロセッサに接続することができました。Intel 8087は、8086および8088の標準数学コプロセッサであり、80ビットの数値を扱いました。Cyrix(8087互換)やWeitek(8087非互換)などのメーカーは、最終的に8087に対抗する高性能浮動小数点コプロセッサを開発しました。
クロック周波数は当初5MHzに制限されていました が[注12 ] 、 HMOSの最終バージョンでは10MHzに指定されました 。HMOS-IIIおよびCMOSバージョンは、組み込みシステム向けに長期間(少なくとも1990年代まで)製造されましたが、後継機種である80186/80188(チップ上に周辺機器がいくつか搭載されている)の方が組み込み用途でより普及しています。
8086のCMOS版である80C86は、GridPad、東芝T1200、HP 110、そして1998年から1999年にかけてのLunar Prospectorなど、多くのポータブルコンピュータや組み込みシステムで使用されました。
パッケージングに関しては、Intel 8086はセラミック製とプラスチック製のDIPパッケージの両方で提供されていた。
富士通、[ 29 ]ハリス/インターシル、OKI、シーメンス、テキサス・インスツルメンツ、NEC、三菱電機、AMDは、互換性のある、そして多くの場合、機能強化されたバージョンを製造した。たとえば、NEC V20とNEC V30 のペアは、NEC がそれぞれオリジナルの Intel クローン μPD8088D と μPD8086D を製造したにもかかわらず、80186 の命令セットと、80186 の速度強化の一部 (すべてではない) を組み込んでいたため、メーカーが設計を変更することなく、命令セットと処理速度の両方をアップグレードできるドロップイン機能を提供していた。このような比較的シンプルで低消費電力の CMOS 8086 互換プロセッサは、現在でも組み込みシステムで使用されている。
ソビエト連邦の電子産業は、産業スパイ活動とリバースエンジニアリングの両方を通じて8086を複製することに成功した。その結果生まれたチップ、K1810VM86は、8086とバイナリおよびピン互換性があった。
i8086とi8088は、それぞれソ連製のPC互換デスクトップEC1831とEC1832のコアでした。(EC1831はブルガリアで開発・製造されたIZOT 1036CのEC識別番号、EC1832はブルガリアで開発・製造されたIZOT 1037CのEC識別番号です。ECはЕдиная Системаの略です。)しかし、EC1831コンピュータ(IZOT 1036C)はIBM PCプロトタイプとはハードウェア面で大きな違いがありました。EC1831は動的バスサイジングを備えた最初のPC互換コンピュータでした(米国特許第4,831,514号)。その後、EC1831の原理の一部はPS/2(米国特許第5,548,786号)やその他のいくつかのマシン(英国特許出願公開番号GB-A-2211325、1989年6月28日公開)に採用された。
最も影響力のあるマイクロコンピュータの1つであるIBM PCは、 8ビットのデータバスを備えた8086のバージョンであるIntel 8088を使用していた。
[…]
8086は、
アセンブリ言語レベルでは
8080
とソフトウェア互換性があります。 […]
このマニュアルのタイミングとエンコーディングは Intel の許可を得て使用されており、次の出版物から引用されています: Intel Corporation。iAPX 86、88、186 および 188 ユーザー マニュアル、プログラマーズ リファレンス、カリフォルニア州サンタクララ。1986 年。(iAPX 286、80386、80387についても同様です。)
年) および PC/XT (1983 年) では、FDC は物理的に別のフロッピーアダプタカード上にありました。FDC 自体は NEC μPD765A または Intel 8272A などの互換部品でした。
IBM Displaywriterは、8086を使用する他の産業用マイクロコントローラよりも明らかに高価である。