8086は x86アーキテクチャの元祖

1978年6月リリース
8086
8086
AI生成コンテンツ / AI-generated contents
8086 は、インテルが1978年(昭和53年)に発表した16ビットCPUである。21世紀まで続く x86アーキテクチャの最初の製品となった。
外部データバスを8ビットにした廉価版の 8088 は、1981年(昭和56年)8月、IBM PC に採用され、オフィスへのパソコン普及に貢献した。
国内では、後に国民機と呼ばれる PC-9801 に搭載され、16ビット・パソコンの普及を牽引した。

目次

8086開発の背景

8086のダイ
8086のダイ
1970年代後半、8ビットCPUを搭載したホビーコンピュータが百花繚乱の様相を呈していた。販売台数で見ると、モトローラの 6800 をモデルとしてモステクノロジーが開発した 6502 を搭載した Apple IIPET 2001(国内ではファミコンやPC Engineが採用)と、インテルの 8080 を改良した Z80 を搭載したパソコンがしのぎを削っていた。
だが、8080 を開発したインテルは蚊帳の外であった。
IBM PCのマザーボード
IBM PCのマザーボード
そのころ、IBMがパソコンを開発しようと動き出し、短期間で上市するために部品は既存製品を活用する方針を打ち出していた。インテルは他社に先駆けて16ビットCPUを開発しており、ホビーパソコンの8ビットCPUより高性能である点にIBMが惹かれた。(実際には廉価版の 8088 が搭載されることになる)

x86アーキテクチャ

8086のレジスタ
8086のレジスタ
8086 は、8ビットCPU 8080 のデータバスを16ビットに拡張し、乗除算など命令を強化したが、レジスタ構成は 8080 に似ている。
AX はアキュムレータで、他のレジスタより高速に計算ができるほか、唯一除算命令が実行できる。BX はアドレス指定に使われる汎用レジスタ、CX はループカウンタなどに用いられる汎用レジスタ、DX レジスタはデータ処理に利用される汎用レジスタ。AXBXCXDXの4本は、たとえばAXをAH+ALのように分けて8ビット汎用レジスタとして用いることも出来る。
BP はベースポインタとしてアドレス指定ができる。セグメントレジスタ SS をデフォルト参照する。
SP はスタックポインタで、セグメントレジスタSSを参照する。
SIDI はインデクスレジスタとしてアドレス指定に使用できる。
フラグレジスタは、プロセッサ命令によって各種のフラグがセット/リセットされる。
インストラクションポインタ IP はセグメントレジスタ CS とセットで、現在実行しているプログラムのアドレスを示す。
セグメントレジスタと物理アドレス
セグメントレジスタと物理アドレス
セグメントレジスタ と呼ぶ4本の16ビット幅レジスタ(CS, DS, SS, ES)の値を左に4ビット・シフトして加算した20ビットをアドレスとして指定することができ、物理メモリ空間は1Mバイトに拡張された。
上図では、セグメントレジスタとオフセットのレジスタ値をセットして、物理アドレス &H C1234を指していることを表す。
メモリはセグメント切替のため、同一アプリケーションで利用できるメモリ空間は64Kバイトに制限されていたが、当時のプログラムはそれで十分だった。

このように従来アーキテクチャを踏襲したことで、8086 の開発はスピーディかつ安価に行われ、CPU自体も安定していた。ソフトウェアは 8080 とバイナリレベルの互換はなかったものの、再アセンブルすることでほぼ移植ができた。

OSとしては、1981年(昭和56年)、デジタルリサーチから CP/M8086 対応版となる CP/M-86 が発売されたが、同年、IBM PC に搭載された PC-DOS(後の MS-DOS)が主流となった。

8086と iAPX 432

iAPX 432
iAPX 432
AI生成コンテンツ / AI-generated contents
前述のように、従来アーキテクチャを踏襲し、8080 の延長として 80868088 の名が冠せられた16ビットCPUは、32ビット・アーキテクチャへの中継ぎという位置づけだったようだ。当時、ライバルのモトローラも、32ビット・アーキテクチャを目指した MC68000 の開発を進めていた。
インテルも、1975年(昭和50年)に32ビットCPU「iAPX 432」の開発に着手していた。当初、80088080 に続くCPUとして 8800 と名付けられ、メインフレームの要求を目指した。
そこで、
  • ハードウェアレベルでのフォールトトレランス
  • マルチプロセッサー対応
  • マルチタスク
  • プロセス間通信機能
  • オブジェクト指向
  • 拡張可能な入出力
といった仕様を設計に盛り込んだ。なかでも「オブジェクト指向」は、複数のデータ型をハードウェア的に取り扱うことができるという画期的なもので、現在の64ビットCPUでも実現できていない。もちろん、1970~80年代の技術では到底無理な要求仕様であり、その複雑さがゆえに、プロセッサーコアである GDP(General Data Processor)は、命令でコードまでを行う iAPX 43201 と、実行モジュールの iAPX 43202 の2つに分かれた。さらに、メモリーコントローラーの iAPX 43205、入出力コントローラの iAPX 43203 と、シングルプロセッサー構成でも4つのプロセッサが必要となった。

8080 のダイサイズは 20mm2、8086 が 33mm2 だった時代に、iAPX 43201
  • iAPX 43201‥‥66.3mm2
  • iAPX 43202‥‥74.0mm2
  • iAPX 43203‥‥75.3mm2
と、桁外れに大きかった。1984年(昭和59年)に登場する 80286 ですら 47mm2 である。プロセスルールの微細化によってダイサイズが小さくなったこともあるが、当時のウェハーは直径50~100mmしかなかったから、そこに、これほど巨大なダイを作り込むということは、歩留まりが低くなることを意味した。
1981年(昭和56年)に iAPX 432 の出荷が始まるが、部品点数が多くて高価であり、動作周波数が低く性能も低かったため、まったく売れなかった。

一方、IBM PC に採用された 80868088 はインテルに想定外の利益をもたらした。それは、営業的に失敗した iAPX 432 の赤字を補って余りあるほどで、インテル単独では 80868088 の受注に追いつかなかった。
そこで、NECなどにセカンドソースして、 80868088 互換プロセッサの製造を認めることになる。

8086 と V30

V30のダイ
V30のダイ
1983年(昭和58年)に、日本電気(NEC)は V30(μPD70116)を商品化し、1985年(昭和60年)に自社製パーソナルコンピュータ PC-9801U に搭載した。
V308086 互換とされるが、厳密に言うとそうではない。NECが 8086 互換CPUとして開発したのは μPD8086 で、V30 は μPD8086 の上位互換CPUである。V30 をインテルとの比較で言い表すと、8086 の周辺IC(クロックジェネレータ、割り込みコントローラ、タイマ、DMAC、チップセレクタ)をワンチップ化した 80186 の上位互換CPUにあたる。V3080186 にない命令も搭載していたが、実際に使われることはほとんどなかった。
NMOSとCMOS
NMOSとCMOS
8086NMOS (エヌモス)  技術で製造された CPUだが、V30 は最初から CMOS (シーモス)  技術で製造された。
NMOSCMOS はトランジスタの製造技術を指す。
NMOS は、Nチャネル MOSFET のみで構成され、Nチャネル FET でスイッチングを行う。論理「1」(High)を出力するときにトランジスタがオンになって電流が流れ、論理「0」(Low)を出すときでも電源からグラウンドへ少し電流が流れ続けるため、回路は単純で動作速度も速いが、消費電力が大きくなる。

CMOS は、Nチャネル MOSFET と Pチャネル MOSFET で構成され、NチャネルとPチャネルを対にしてスイッチングを行う。つまり、NチャネルとPチャネルの片方がオンならもう片方はオフという補完動作をするため、スイッチング時以外はほとんど電流が流れず、消費電力を小さくできる。その分、回路は複雑で、動作速度も NMOS に比べて遅くなる。
8086 のプロセスルールは3μmだったが、NEC は V30 で2μmにすることで、CMOS化しつつ、80186 の機能も取り込んだうえで、8086 とピンコンパチブルなパッケージに仕上げた。さらに、乗除算をはじめとする主要な演算命令を専用回路で実装するワイヤードロジック を採用し、CPU内部のバスを増強してデータ転送効率を上げることで、同じクロックで 8086 の最大1.5倍のスピードに上げることに成功した。搭載トランジスタ数は、 8086 の 29,000個に対し、2倍以上の 63,000個に達した。

V308080 のハードウェア・エミュレーションモードを搭載していた。こちらも、厳密には NEC の 8080 互換プロセッサ μPD8080AF のエミュレータである。

また、NECは 8088 互換の V20 や、それに周辺チップを組み込んだ V25 を開発・販売していた。その後、V30 の周辺LSIを取り込んだ V40V50 を発売した。
この時代、日米両国間では半導体の貿易摩擦が起き、インテルがNECに対してVシリーズはマイクロコードの著作権を侵害しているという裁判を起こすという噂が立ち、NECは先手を打って、1984年(昭和59年)にインテルの著作権を侵害していない旨の確認訴訟を米国カリフォルニア州連邦裁判所に提訴した。1989年(昭和64年)に要約判決が下り、8086 に著作権表示がなかったことから NECの訴えが認められた。しかし同時に、マイクロコードの著作権が認められ、32ビットのインテル 80486 の互換 CPU を製造していた米国内メーカーに大きなインパクトを与えた。
NEC はマイクロコードの著作権侵害を回避するため、ほぼすべてをワイヤードロジックで実装した V33 を用意する。さらに、インテルCPUとは全く異なる32ビットCPU V60 や、組み込み用途に特化した V800系 を発売する。

乗算・除算命令

前述のように、NECの V30 は乗除算を専用回路(ワイヤードロジック)で実装していたが、8086 には乗算専用の回路も除算専用の回路も無い。29,000個のトランジスタでは、16ビットの乗算器を作り込む余裕がなかった。8086 の演算回路(ALU)ができるのは、16ビットの加算・減算と、1ビットずつのシフトだけである。
それでも乗算命令 MUL や除算命令 DIV が使えるのは、これらをマイクロコードで実装しているからだ。マイクロコードとは、1つの機械語命令を、CPU内部だけで通用するさらに細かい命令(マイクロ命令)の並びに分解し、CPU内のROMに焼き込んだプログラムである。8086 のマイクロコードROMは21ビット幅×512本しかなく、乗除算は加算とシフトを何十回も繰り返すループとして書かれている。
8086の乗算アルゴリズム
AI生成コンテンツ / AI-generated contents
乗算のアルゴリズムは、筆算と同じ「シフトと加算」である。8086 は内部に3本の作業用レジスタを持ち、被乗数、乗数、答えの上位を分担させる。乗数と答えを合わせて32ビットのシフトレジスタとみなし、右へ1ビットずらすたびに、押し出された乗数のビットを見て、1なら被乗数を上位側に加算し、0なら何もしない。これを16回繰り返すと32ビットの積が完成し、上位を DX、下位を AX に格納する。乗数のビットが1のときだけ加算するので、乗数の値によって実行時間が変わる。
8086の除算アルゴリズム
AI生成コンテンツ / AI-generated contents
除算のアルゴリズムも筆算と同じ「シフトと減算」である。まず被除数の上位16ビットと除数を比べ、上位が除数以上なら商が16ビットに収まらないので、除算エラー(割り込み0番)を起こす。除数が0のときも、この1回の比較で検出される。次に、被除数を32ビットのシフトレジスタとみなして左へ1ビットずらし、上位側から除数を引けるなら引いて商のビットを1とし、引けないなら引かずに0とする。これを16回繰り返すと上位に余り、下位に商が残り、余りを DX、商を AX に格納する。
加算・減算がレジスタ同士なら3クロックサイクルで終わるのに対し、同じ16ビットでも、符号なし乗算 MUL は118~133クロックサイクル、符号なし除算 DIV は144~162クロックサイクルを要する。乗算は加算の約40倍、除算は約50倍である。符号付きの IMULIDIV は、いったん絶対値にして計算し、後から符号を戻す処理が加わるため、さらに20クロックサイクルほど長くなる。
5MHz の 8086 なら、加算が0.6マイクロ秒で終わるのに対し、除算には30マイクロ秒以上かかっていたことになる。
命令 内容 クロックサイクル数
ADD, SUB 16ビットの加算・減算 3
MUL 16ビットの符号なし乗算 118~133
IMUL 16ビットの符号付き乗算 128~154
DIV 16ビットの符号なし除算 144~162
IDIV 16ビットの符号付き除算 165~184
オペランドがレジスタの場合。メモリ上のデータを直接演算する形式では、
これに数クロックサイクルと実効アドレスの計算時間が加わる。

乗除算命令の高速化をめぐって

8086 は、16ビット整数の乗算命令 MUL に118~133クロックサイクル、除算命令 DIV に144~162クロックサイクルを要する。符号付きの IMUL は128~154、IDIV は165~184クロックサイクルだ(本節の数値は、オペランドがレジスタの場合で揃えている)。つまり、5MHzなら 1秒間に約4万回しか整数乗算を行うことができない。
乗除算命令を持たない 8080Z80 に比べれば長足の進歩だが、それでも、8080 の延長線上にあるアーキテクチャだから、タイガー計算機のハンドルを回しているのと大差ない。

その後に登場する16ビットCPUは、乗除算の結果をより速く出す方へ進化していく。
1980年(昭和55年)にモトローラが発売した16ビットCPU [/e-soul/gadget/1980/MC68000.shtm:MC68000] は、8086 に遅れること2年、その2.5倍の約7万トランジスタを搭載していた。乗算命令は最大70クロックサイクルと、8086 の半分程度になった。
インテルも負けてはいない。1984年(昭和59年)に発売した 80286 では、乗算21クロックサイクル、除算22クロックサイクルと劇的に短縮した。前述のNEC V30 は、NECの資料によれば8MHz動作で4~6マイクロ秒、すなわち32~48クロックサイクル相当である。
32ビットCPUの 80386 になると、16ビットの乗算は9~22クロックサイクルとなる。乗数の上位ビットが0や1で埋まっていれば途中で計算を打ち切る仕組み(アーリーアウト)が入ったためで、値によっては 80286 より速い。ただし最悪のケースは 80286 と変わらず、32ビット同士の乗算では9~38クロックサイクルに増える。80486 の16ビット乗算は13~26クロックサイクルで、最良のケースでは 80386 に及ばない。一方、モトローラの32ビットCPU 68030 は28クロックサイクルと、80286 並に短くなっている。
では、なぜ後発のCPUは速くなったのか。8086 の乗算は、118クロックサイクルを16ビットで割ると、1ビットあたり約7.4クロックサイクルかかっている。マイクロコードのループ1回に、2回のシフトと条件判定、加算で5前後のマイクロ命令が必要だったためだ。改善の方向は、1ステップを短くする、ステップ数を減らす、符号の処理を省く、の3つに整理できる。

MC68000 は、マイクロコードの下にもう一段「ナノコード」を置く2階層方式で、1つの制御ステップで動かせる回路が多い。1ビット分のシフトが1ステップ(2クロックサイクル)で済み、加算が必要なビットだけ1ステップ増える。所要クロックサイクルは 38+2n で、n は乗数に立っているビットの数である。さらに、符号付き乗算にブースのアルゴリズムを使うため、8086 のように絶対値へ直してから符号を戻す前後処理が要らず、符号付きの乗算も符号なしと同じ時間で終わる。ただし除算は約140クロックサイクルで、8086 の144~162とほとんど変わらない。乗算だけが速くなったCPUである。

V30 は、乗除算をマイクロコードのループで回すことをやめ、専用の回路に置き換えた。NECの資料は「専用ハードウェアが高速な乗算・除算(8MHzで4~6マイクロ秒)と実効アドレス計算を行う」と説明している。加えて、内部データバスを2本(メインバスとサブバス)持ち、2本のレジスタを1クロックサイクルで一時レジスタへ移せるので、加算が3クロックサイクルから2クロックサイクルに縮まった。実効アドレスの計算も、専用回路が全アドレッシングモードを2クロックサイクルで行う(8086 はマイクロコードで5~12クロックサイクル)。マイクロコードの1語は29ビットあり、8086 の21ビットより多くの制御を同時に指定できる。

80286 は、1クロックサイクルで1ビットずつ進む専用回路を持つ。21クロックサイクルを16ビットで割ると1ビットあたり1.3クロックサイクルで、8086 の7.4から大きく下がった。符号付きの IMUL も同じ21クロックサイクルであり、符号処理のペナルティが無い。実行ユニット、アドレスユニット、命令ユニット、バスユニットが独立して動くため、メモリ上のデータを直接乗算する形式でも3クロックサイクル増えるだけで済む(8086 は実効アドレスの計算だけで5~12クロックサイクル)。なお、この除算回路は 80386 にそのまま引き継がれ、16ビットの除算はどちらも22クロックサイクルである。
CPU 16ビット乗算 16ビット除算 乗除算の実装 1ビットあたり
8086 118~133 144~162 マイクロコード 約7.4
MC68000 38~70 約140 マイクロコード+ナノコード
(符号付きはブース法)
約2.4
V30 約32~48 約32~48 専用ハードウェア 約2
80286 21 22 専用ハードウェア
(1クロックで1ビット)
約1.3
単位はクロックサイクル。オペランドがレジスタの場合。
V30はNEC資料の「8MHzで4~6マイクロ秒」からの換算値。
「1ビットあたり」は16ビット乗算の最小値を16で割った概算。
Excelのような事務処理ソフトを使う範囲では、乗除算速度が問題になることはないが、シューティングゲームには影響が出る。
当時のディスプレイはブラウン管であったから、画面の書き換え時間(リフレッシュレート)は30~60Hz(1秒間に30~60回)だった。この期間中に計算が終わっていなければ、敵の位置が動かないまま背景だけ動いているという結果になりかねない。

アセンブラとMS-DOS

個人的には、こうしたクロックサイクルまで勘案して機械語プログラムをアセンブルしたのは x86アーキテクチャ が最後だったように思う。その後は、年々歳々CPUのクロック数が上昇したから、プログラミングで工夫するよりコストが安くなったからだ。

MS-DOSには、マイクロソフト製アセンブラ MASM(Microsoft Macro Assembler)が標準で付いてきた。マクロやプロシージャに対応しており、高級言語に近い構造化プログラミングが可能だった。

主要スペック

項目 仕様
メーカー Intel
発売開始 1978年6月
トランジスタ数 29,000
データバス 16ビット
アドレスバス 20bit
物理メモリ 1MB
CPUクロック 5~10MHz
プロセスルール 3μm
命令セット x86
ソケット 40ピンDIP
最大消費電力 1.87W

CPUの歴史

発表年 メーカー CPU名 ビット数 最大クロック
1970年Garrett
AiResearch
MP944 (軍用)20bit375KHz
1971年インテル40044bit750KHz
1974年インテル80808bit3.125MHz
1975年モステクノロジーMOS 65028bit3MHz
1976年ザイログZ808bit20MHz
1978年インテル808616bit10MHz
1979年モトローラMC68098bit2MHz
1979年ザイログZ800016bit10MHz
1980年モトローラMC6800016bit20MHz
1983年NECV3016bit16MHz
1984年インテル8028616bit12MHz
1985年インテル8038632bit40MHz
1985年インテルi96032bit100MHz
1985年サン・マイクロシステムズSPARC32bit150MHz
1985年エイコーンARM132bit6MHz
1986年MIPSR200032bit15MHz
1987年ザイログZ28016bit12MHz
1987年モトローラMC6803032bit50MHz
1988年MIPSR300032bit40MHz
1989年インテル8048632bit100MHz
1989年インテルi86032bit50MHz
1990年モトローラMC6804032bit40MHz
1991年MIPSR400064bit200MHz
1992年DECAlpha 2106464bit200MHz
1993年IBM, モトローラ, ApplePowerPC 60132bit120MHz
1993年インテルPentium32bit300MHz
1994年IBM, モトローラ, ApplePowerPC 60332bit300MHz
1995年サイリックスCyrix Cx5x8632bit133MHz
1995年AMDAm5x8632bit160MHz
1995年サン・マイクロシステムズUltraSPARC64bit200MHz
1999年IBM, モトローラPowerPC G432bit1.67GHz
1999年AMDAthlon32bit2.33GHz
2000年インテルPentium 432bit3.8GHz
2001年インテルItanium64bit800MHz
2003年AMDOpteron64bit3.5GHz
2003年インテルPentium M32bit2.26GHz
2006年SCE,ソニー,IBM,東芝Cell64bit3.2GHz
2006年インテルCore Duo32bit2.33GHz
2006年インテルCore 2 Duo64bit3.33GHz
2008年インテルCore i9/i7/i5/i364bit5.8GHz
2017年AMDRyzen64bit5.7GHz
2020年AppleM1/M2/M3/M4/M564bit3.49GHz
2023年インテルCore Ultra 9 / 7 / 564bit5.1GHz

参考書籍

表紙 忘れ去られたCPU黒歴史
著者 大原 雄介
出版社 角川アスキー総合研究所
サイズ 単行本
発売日 2012年07月10日頃
価格 1,540円(税込)
ISBN 9784048867719

参考サイト

(この項おわり)
header