Intel 80386

**Intel 80386**（または**i386**）はインテルの32ビットマイクロプロセッサ (CPU) である。1985年10月に発表され、x86アーキテクチャを32ビットに拡張し、レジスタを強化した。インテルが現在使用している名称は**Intel386<sup>TM</sup>プロセッサ** (**Intel386<sup>TM</sup> Processor**) である。競合他社の互換CPUにも386の型番が付くものがある。

後にIA-32と呼ばれる、インテルの32ビットCPUのベースとなる命令セットアーキテクチャは、このCPUで確定した。アーキテクチャとしての**i386**については、**[[x86]]**および**[[IA-32]]**の項目も参照のこと。

## 概要
1985年の発表当初の名称はIntel 80386であった。80386専用の数値演算コプロセッサには80387がある。仕様上は80287も接続できるが、そのためにはマシンが80287に対応するように設計されている必要がある。

1988年に80386SX（SXはSingle-word eXternal、つまり16ビット外部バスを意味する） が80386シリーズに加わった際に、従来の32ビット外部バスのプロセッサには区別するためにDXをつけてIntel 80386DX（DXはDouble-word eXternal、つまり32ビット外部バスを意味する）と改名した。

また、インテルが80386からセカンドソースを廃止したため、Am386などの互換プロセッサが出現し、その対策もありi386DXと呼ばれるようになった（米国等、数字だけでは商標として登録・保護できないため）。

ごく初期の製品では32ビット演算が正しく行われない、仮想86モードが動作しないという不具合があったが、当初はDOSなどのリアルモードをベースとしたソフトウェアが主流であり、80286と同様に主として高速な8086/V30として使われていたために32ビット機能を使えなくても重大な支障はなかった。PC-9800シリーズ初の32ビット機「PC-98XL2」に採用された例では、32ビット機能がオプション扱いになっており、「機能拡張プロセッサ」を購入してCPUを交換することで32ビット機能を提供する仕様だが、機能拡張プロセッサは不具合が修正された80386そのものである。

80386で採用された32ビット命令セットや仮想86モードはやがて多くのオペレーティングシステム (OS) で徐々に使われるようになっていった。また、Unix系OSであるBSDが移植されて386BSDとなり、Linuxの開発も80386上で開始された。

## 特徴
### 機能

プロテクトモードとリアルモードの二つの異なる動作モードを備える。80286ではいったんプロテクトモードに入るとリアルモードに戻すにはリセットが必要であったのに対し、80386ではリアルモードとプロテクトモードを行き来することができる。また、プロテクトモード上で複数の8086を仮想的に動作させる仮想86モードが追加された。

汎用レジスタは32ビットに拡張された。32ビットレジスタはEAX、ESIのように従来の16ビットレジスタ名に「E」をつけて呼ばれる。従来の16ビットレジスタに上位16ビットを拡張した形で用意されており、下位16ビットは従来通りの16ビット/8ビットレジスタとしてもアクセス出来る。上位16ビットのみを独立した16ビットレジスタとして使用することは出来ない。

セグメントレジスタは従来のCS、DS、ES、SSの4個にFS、GSが追加された。プロテクトモード上ではセグメントレジスタは単にセグメントアドレスを格納するのではなく、メモリ上のセグメントディスクプリタを指すためのセレクタとなっており、レジスタサイズは16ビットのままである。オフセットアドレスは従来と同じく「ベース」、「インデックス」、「符号付き定数」の3項目の任意の組み合わせで記述するが、32bitの汎用レジスタを用いて記述する場合には必要に応じてインデックス側に`*1`、`*2`、`*4`、`*8`のいずれかの掛け算（スケールファクタ）も記述できるようになった。

既存の命令が32ビット演算に対応したほか、多くの新命令が追加された。レジスタの直交性が増し、従来「AX は演算用」「SI、DIはメモリ操作用」など16ビット命令では用途別に対応命令が細かく分化していたが、32ビット命令ではEAX、EBX、ECX、EDX、EBP、ESP、ESI、EDI合計8個の「汎用レジスタ」がほぼ均等に扱えるようになり、コンパイラ言語への対応が容易になった。

レジスタ及び命令の拡張はCPUのモードとは独立したもので、プロテクトモード・リアルモードの別なく使用可能である。従って、リアルモードでも32ビットプロセッサとして動作し32ビット幅のレジスタやデータを扱えるが、64KBを超えるアクセスを実行すると一般保護例外が発生する。

フラグレジスタも32ビットに拡張する形で新たなフラグが設けられた。第16ビットは RF (Resume flag) と呼ばれ、デバッグフォールトの発生を制御する。第17ビットは VM (Virtual 8086 mode)で、このビットが立つことにより仮想86モードに移行する。

従来のMSW (Machine status word)レジスタも拡張され、CR0 - CR3というコントロールレジスタ4個が設けられた。それぞれ32ビットで、CR0の下位16ビットがMSWそのものである。386で追加されたフラグはCR0の第4ビットのET (Extension type)フラグと末尾31ビットのPG (Paging enable)である。前者は80387が存在するとセットされ、後者をセットするとページングが有効になる。CR1は予約されており使用できない。CR2とCR3はページングに使われる。CR2はページング有効時にページフォールトが発生したときにそのアドレスが格納される。CR3の上位20ビットはページングで使用するページディレクトリのアドレス上位20ビットすなわちベースアドレスを記録する。

また、ハードウエアによるデバッグ支援機能が追加され、DR0からDR7のデバッグレジスタを備える。

さらにTLB（トランスレーション・ルックアサイド・バッファ）をテストするテストレジスタTR6-TR7が設けられた。

32ビット化に併せて論理・物理アドレス空間も4GB（32ビット）に拡張され、セグメントサイズも最大4GBに拡張された。従って、セグメント機構の無いプロセッサ同様のフラットメモリモデル(リニアメモリモデル)で全メモリ空間が使用可能である。また可変長のセグメントに加えて固定長のページ単位によるメモリ管理も追加され、近代的なOSの実装が容易になった。

### アーキテクチャ
x86アーキテクチャCPUとしては、複数の並列ステージ（Intel386 では6 ステージ）を持つ最初のインテル・アーキテクチャ・プロセッサとなった（初めての「パイプライン」ではないことに注意。80286は80386と同じ4段パイプライン構成）。80386のパイプラインは4段で構成されている。命令の実行は全てマイクロコードで実現されており、複数サイクルの時間を要する。また、複雑な命令の場合はデコードで所要サイクルが増加した。

### 80386の判別
80386では後のCPUID命令と同様のプロセッサ・シグニチャという概念が導入されたものの、まだCPUID命令そのものは無く、インテルはフラグレジスタを使ったCPU判別方法を紹介している。

80386と80486以降を区別する方法としては、80486で追加されたACビットの存在が利用できる。`PUSHFD`と`POPFD`で読み書きできる32ビット分のフラグのうち第18ビットが該当し、これを変更できれば80486以上、変更できなければ80386系のCPUであると判断できる。ただし32ビット分のフラグレジスタへのアクセス命令は16ビットCPUには存在しないので、これに先立ち80286以前か80386以降かをあらかじめ判別しておく必要がある（詳細はIntel 80286を参照）。

またリセット直後のEDXレジスタには、後のCPUIDのEAX=1に相当するCPUの識別情報（プロセッサ・シグネチャ）が格納されるようになったため、これが利用できる状況ならばそれを使うこともできる（CPUIDも参照）。ただし80386のプロセッサ・シグニチャは80486以降やCPUID命令とは定義に少々違いがあり、80386ではプロセッサタイプが4ビット分使われている。ファミリは4ビットで同じだが、モデル番号に相当する4ビットはメジャー・ステッピングと呼ばれ、ステッピングIDに相当する4ビットはマイナー・ステッピングと呼ばれる。なお上位16ビットはすべて予約ビットとなっており、拡張ファミリと拡張モデルは利用できない。

## 追加命令一覧
### システム命令
新たに追加されたコントロールレジスタ (CR0-3)・テストレジスタ (TR6-7)・デバッグレジスタ (DR0-7) のシステムレジスタはニーモニック上は`MOV`命令でデータ交換する書式ではあるが、当然ながら内部的には新規のシステム命令である。

### 既存命令の32ビット版に相当する一般命令
既存命令と同様の機能で、32ビットのデータや32ビットレジスタを扱うものを挙げる。以下のほか、実質的な追加命令として条件ジャンプ命令が一新されており、16ビットや32ビットのアドレス属性を扱えるコードが新たに用意された。

 CDQ (Convert doubleword to qwadword)
 CMPSD (Compare string double word)
 CWDE (Convert word to doubleword extended)
 INSD (Input string double word)
 IRETD (Interrupt return using EIP)
 JECXZ (Jump if ECX is zero)
 LODSD (Load string double word)
 MOVSD (Move string double word)
 OUTSD (Output string double word)
 POPAD (Pop all general doubleword registers)
 POPFD (Pop extended flags off stack)
 PUSHAD (Push all general doubleword registers)
 PUSHFD (Push extended flags onto stack)
 SCASD (Scan string double word)
 STOSD (Store string double word)

### その他の一般命令
* ビットをテストする命令群が6個追加された。
* アドレス（セグメント・オフセット）をロードする命令には、新たにSS・FS・GSのセグメントレジスタに対応したものが用意された。
* データのビット長を拡張する命令および、シフト命令について、結果を別のレジスタに保存できる命令が新たに追加された。
* 条件SET命令は各種の条件ジャンプ命令の冒頭の"J"の部分を"SET"にそれぞれ置き換えたニーモニック表記の命令群で、条件が合致した際にはジャンプする代わりに、判定結果を指定されたレジスタやメモリに保存するだけの動作となる。

 BSF (Bit scan forward)
 BSR (Bit scan reverse)
 BT (Bit test)
 BTC (Bit test and complement)
 BTR (Bit test and reset)
 BTS (Bit test and set)
 LFS (Load pointer using FS)
 LGS (Load pointer using GS)
 LSS (Load pointer using SS)
 MOVSX (Move with sign extend)
 MOVZX (Move with zero extend)
 SHLD (Double precision shift left)
 SHRD (Double precision shift right)
 条件SET (Byte set on condition)

### 非公開命令
* ICEBP
:ICEが接続されている状態でこの命令を実行すると、ICE側のプログラムに制御が移る。ICEが接続されていない状態ではシングルステップ割込みINT 1を実行する。のちにINT1（オペコードはF1）として公開された。

* UMOV
:ICE側のメモリとデバッグターゲット側のメモリ間の転送命令である。

* LOADALL
:1命令でCPUのすべての内部レジスタをロードする（詳細はLOADALLを参照）。
:ICE側でこの命令を実行するとICEBP実行時点のレジスタの状態をすべてもどしてデバッグターゲット側でのプログラムの実行に戻る。

## その他の80386シリーズ
### 80386SX

開発コード名P9。命令セットは80386と互換性があるが、外部アドレス幅を24ビット (16MB)、外部データバスを16ビット幅に縮小し、システム（システム基板、メモリを含む）のトータル的なコストダウンと、既存の80286搭載パーソナルコンピュータ (PC) をほとんど仕様変更せずにCPU換装を可能として、当時急速にシェアを拡大しつつあったAMDなどのセカンドソース版80286、特にIntelが提供していなかった16MHz版Am80286などの高クロック周波数動作対応モデルを市場から駆逐することを念頭に置いて設計されたCPUである。
特にメモリのバス幅が狭いことからプロテクトモードの利用は性能の低下が激しかったが、それでもこのCPUを採用することで、PCメーカーは従来の80286マシンをわずかな手直しを施すだけで「32ビットマシン」として販売することが可能となり、またユーザー側にとっても後述するようにDOS環境で1MB以上のメモリ空間にマッピングされるプロテクトモード対応増設メモリ（XMSメモリ）を仮想86モードの下でEMSメモリとして割り当てて使用可能となるほか、Microsoft Windows 3.x利用時には386エンハンストモードで起動でき、（遅くはなるが）HDDスワップを利用した仮想メモリが利用できるようになるなど、80286使用時と比較してメモリ利用の自由度が上がるというメリットがあったため、一時は広く普及した。

### 80386SL

80386SXをベースに、システムマネジメントモードを追加し、サスペンドやレジューム機能などに対応させたCPU。現在のモバイル用CPUの先駆けといえる。また、日本電気がインテルに発注して製造された、PC-9800シリーズアーキテクチャ専用のCPU、80386SL (98) もある。80386SL (98) にはi386SLロゴの下にPC-98ロゴも入っており、PC9800 NECと打刻されている。通常版にはPC9800 NECの代わりにISAと打刻されている。

### 80376
***'は、組込機器用の[[マイクロコントローラ]]である。80386SXに基づいているものの、[[リアルモード]]を実装しておらず、ブート時から[[プロテクトモード]]で動作する。

=== 80386EX ===
***'は、フルスタティック設計の80386SXコアとした組込機器用のマイクロコントローラ。クロック、システムマネージメント、タイマーカウンター、ウォッチドッグタイマー、同期/非同期シリアル入出力、パラレル入出力、DMAコントローラ、DRAMリフレッシュ、JTAG検査ロジックなどの周辺回路を混載し、フットプリントと消費電力とコストの低減を図っている。

### RapidCAD

80386ピン互換の486DX相当プロセッサだが、プロセッサ・シグネチャは386系を示すx3xx (0340) を返す。FPU内蔵のため、数値演算コプロセッサのソケットにはダミーを挿して使う。

### IBM製

Intel製80386には存在しない独自のCPUキャッシュを搭載した。また、`RDMSR`・`WRMSR`命令が実装されていた。

#### IBM 386SLC
386SL (386SX) ベースのIBM改良版。内部32ビット、外部データバス16ビットのまま、内蔵キャッシュ8Kを搭載。IBM PS/2 などに搭載。インテルは80386からセカンドソースを廃止したが、IBMはインテルとの提携により、80486までは製造ライセンスを持っていた。名称の「C」はCacheの略とも言われる。

#### IBM 486SLC
IBM 386SLCの改良版。内蔵キャッシュ16Kを搭載。内部32ビット、外部データバス16ビットのまま、内蔵キャッシュ16Kにより486SXと同レベルの性能を実現。ThinkPadなどに搭載。名称こそ486SXに類似するものの、486SXのIBM改良版ではなく、**コアは386SL (386SX) ベース**である。

#### IBM 486SLC2
IBM 486SLCのダブルクロック版。内部32ビット、外部データバス16ビット、ダブルクロックのまま、内蔵キャッシュ16Kを搭載。PS/V、ThinkPadなどに搭載。比較的後年までCPUアクセラレータにも使われた。サードパーティではSusTeenのWinMasterシリーズの一部の下位機種に搭載されたことがある。

#### Blue Lightning
IBM486SLCシリーズの32ビット版に相当する製品群の通称。いくつかの種類があり、最大で3倍速のものも登場した。製品によって386DXベースとも486SLベースとも言われる。

## 影響
32ビットCPUとして登場したものの、当初のPC市場にはその機能を活用できるOSは存在しておらず、単に高速なx86CPUとして、主にMS-DOS環境で使われる場合が多かった。

その後、80386のアーキテクチャを前提として新たに開発された32ビットOSとして、OS/2 2.0やWindows NTが市場に登場するが、その頃には既に80486が登場しており、80386は下位機種向けで外部16ビットバスの386SXが主流となりつつあった。外部16ビットのシステムで32ビットOSを動かすには力不足が明白であり、結果的により高速なIntel486やPentiumプロセッサがその後を受け継ぐこととなった。

### DOS
DOS環境における利点は、メモリマネージャとよばれるソフト（EMM386.EXE等）によって仮想86モードへと移行し、高速・広帯域のプロテクトメモリを転用してEMSメモリをハードウェアEMSと同等、またはそれ以上の性能で実現できたことである。これは本来の80386の機能・スペックからすると中途半端な使い方であり、80386本来の機能を活かし切るには程遠いものであったが、かといって本来の機能を積極的に活用したプログラムは80386では荷が重いものになりやすく、結果的には80286同様にDOS相応の軽めの処理で使われることが少なくなかった。

80386は80486以降のような内部キャッシュメモリを持たないため、特に16ビットの用途では同クロックの80286と比べても処理速度が速いわけではなかった。また同じ理由でメモリアクセスが足を引っ張り、動作クロックが25MHzや33MHzにも達してもクロック相応の性能向上が見込めなくなるため、極端なことを言えば仮想86モードで都合の悪い処理をピンポイント的に繰り返した際には高クロックの80386が12MHzの80286と大差ない状況や、場合によってはむしろ劣るといった状況を招いてしまうこともあった。ただしクロックの高い上位機種ではマザーボード側に外部キャッシュメモリを搭載してメモリアクセスが高速化されていることがあり、また通常の演算処理やメモリ操作に関してはCPUおよびメモリの高い駆動クロックが実効性能にある程度反映されるため、多くの場合そこまで極端に性能が低下するわけではない。

### Microsoft Windowsなど
80386用に改良されたOSとして以下が登場した。

*Microsoft Windows (Windows)
**Windows386 2.1 （リアルモード用16ビットアプリケーションを前提とした16ビットOSだが、OS自体は80386のプロテクトモードを活用するようになった）
**Windows 3.0 （80286相当のプロテクトモードに対応した16ビットアプリケーションを前提とした16ビットOSであるが、OS自体はエンハンスドモード動作時に32ビットの仮想86モードを活用している）
**Windows NT （OS自体を32ビット化）
*OS/2
**OS/2 2.0 （OS自体を32ビット化。MVDMに仮想86モードを使用する）
*NetWare
**NetWare386 （DOSから起動し、80386のプロテクトモードを使用できる）
*TownsOS
**富士通FM TOWNS用（DOSにDOSエクステンダを組み合わせたもの。80386のプロテクトモードを使用。4GBリニアな論理アドレス空間を活かしたマルチメディアデータの取り扱いを可能にした）

### UNIX
80386搭載PCは「高額」とは言っても、当時隆盛していたRISCワークステーション等よりは大幅に安価であったため、より大規模なシステムで利用されていたUNIXなどの32ビットOS環境をこれら安価なパーソナルコンピュータに移植する試みが、80386の登場によって始められた。1988年には当時既にSPARCプロセッサを搭載するSUN-4を製造販売していたサン・マイクロシステムズがSUN386iと称する、SunOS 4.0の386対応版を搭載するワークステーションを発表し、低価格であるだけでなく、当時のSPARC搭載機では困難であった、DOS環境とSunOS環境の共存を制限付きながら可能とするなど、当時のRISCプロセッサ搭載機にはない新しい機能についての提案を行った。その後、386BSD（後のFreeBSDおよびNetBSD）やLinuxなど、今日の代表的なPC-UNIX系環境の移植やビルドが始められたが、その理由や動機は、80386の登場によってパーソナルコンピュータがこれらの近代的な32ビットオペレーティングシステム環境を実現するだけの機能や性能を持ちえるに至ったからに他ならない。2000年代末にはWindowsがOS市場の殆どを占めたことに加え、PC-UNIXが伝統的なUNIXと同等の機能と信頼性を備えたことで、80386から始まったIA-32を利用した方が圧倒的にコストパフォーマンスが高くなったため、ハイエンド用途やレガシーソフトウェアの利用を除いてIA-32がSPARCを駆逐するにまで至っている。

## その後の状況
80386で実装された32ビット命令（のちのIA-32命令）は、登場から30年以上が経過したが、上位互換を保ったCPUがインテルから提供され続けている他、AMD、VIAが発売しているx86系のさまざまな互換CPUにおいても継承され続けており、多くのパーソナルコンピュータと多くのサーバで採用され続けている。80386の命令アーキテクチャは、ARMアーキテクチャと並び、これまでに最も普及した命令アーキテクチャと言える。80386以降のIA-32プロセッサでは基本命令の追加はあまりなく、MMX、SSE、SSE2、SSE3などのSIMD命令の追加が主であった。

## 脚注

### 注釈

### 出典

## 関連項目

*x86
*IA-32
*IA-64
*Intel Inboard 386