
2026/01/24 2:26
**Intel 8086プロセッサ – 算術論理演算装置(ALU)** - **機能性** - 加減乗除などすべての算術演算を実行します。乗算は外部乗算ユニット、除算は外部回路で処理されます。 - AND・OR・XOR・NOT といった論理演算も可能です。 - データレジスタやメモリオペランドに対してシフト/ローテート命令を扱います。 - **関与するレジスタ** - 一般目的16ビットレジスタ(AX、BX、CX、DX)が ALU 操作の主なオペランドです。 - 演算結果はフラグレジスタに反映されます: - CF – キャリーフラグ - PF – パリティフラグ - AF – 補助キャリーフラグ - ZF – ゼロフラグ - SF – シグニフィアフラグ(符号) - OF – オーバーフローフラグ - **命令実行** - 命令はインストラクションデコーダで解読され、ALUへ送られます。 - 大半の算術/論理命令は1クロック周期で処理されます。 - 複数バイト演算(例:16ビット加算)では結果を目的レジスタまたはメモリに戻します。 - **性能上の考慮点** - パイプライン遅延が解消された後、8086 は1クロックあたり1命令ずつ ALU を実行できます。 - 乗算・除算など複雑な演算は外部回路を必要とし、複数周期で処理されます。 - **典型的な使用パターン** - `ADD AX, BX` – BX を AX に加算し、フラグを更新。 - `AND CX, DX` – CX と DX の論理積。 - `SHL AL, 1` – AL を左に 1 ビットシフト(2 倍に相当)。 - **制限事項** - 乗算・除算は内蔵されておらず、外部ユニットに依存します。 - 16ビット演算が基本で、8ビット操作やセグメントアドレッシング以外では拡張できません。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
要約:
1978年に登場したIntel 8086は、x86アーキテクチャの基盤となる16ビットCISCスタイルプロセッサを導入しました。ALUは28種類の16ビット演算を実行でき、5ビットの操作フィールドと2ビットの一時レジスタ選択子からなる2領域マイクロコード形式で制御されます。オペランドの各ビットはキャリーと出力信号を生成する2つのルックアップテーブル(LUT)によって処理され、16個の回路が1ワード全体を扱います。
実行は2ステップのマイクロ命令で進みます―最初にALUを設定し、次に結果を取得します。多くのデフォルト操作(例:ADD)は設定ステップをスキップできるため、サイクルを節約できます。XI擬似ALUは8つの算術/論理オペコード(ADD, SUB, ADC, SBB, AND, OR, XOR, CMP)でマイクロコードを共有し、そのマルチプレクサは「X」レジスタ、命令レジスタ、およびグループデコードROMからビットを統合して実際の操作コードを供給します。
ダイ上の制御論理はPLAsで実装されており、各マイクロ命令を27個の制御信号にデコードします。そのうち5つは後で使用するためにラッチ化されます(操作コードと一時レジスタ)。比較、加算+キャリー、インクリメント/デクリメント(二倍)やシフト/ロータートバリエーションなどの特殊ケースでは、6つのLUT信号を超える追加制御ラインが必要です。
この設計はCISCアプローチを示しています―複数のオペコード位置、多くの特殊操作、およびマイクロ命令間での状態保持―そして将来のCPUが豊富な命令セットと効率的な実行サイクルをどのように両立させるかを予見しています。
本文
1978年、Intel は 8086プロセッサ を登場させました。これは現代の x86 アーキテクチャを生み出した革命的なチップです。
今日の 64‑bit プロセッサとは異なり、8086 は 16‑bit CPU であり、その算術/論理ユニット(ALU)は 16‑ビット値上で加算・減算・AND・OR・XOR・各種シフト演算を実行します。ALU には 28 種類 の操作があります。
ALU が制御される仕組み
8086 はすべての操作について、2 段階で制御します:
- マイクロコード命令(マイクロインストラクション)が ALU を所望の操作に設定します。
- その後のマイクロインストラクションが ALU の結果を取り出します。
マイクロコードとマシンコード命令は、ALU に送られる制御信号を決定し、ハードウェア上でマイクロインストラクションを「結合」させます。
マイクロコードの構成
- 各マシン命令は複数のマイクロインストラクションに分解されます。
- すべてのマイクロインストラクションは 2 つの独立したタスク を実行します:
- ソースと宛先間でのデータ移動。
- 副次的なタスク:ジャンプ、サブルーチン呼び出し、メモリ読込/書込、または ALU 操作。
- ALU 操作は 5 ビットフィールド(操作コード)と 2 ビットフィールド(入力を供給する一時レジスタ)で指定されます。
- いくつかのマシン命令は同じマイクロコードを共有し、具体的な ALU 操作は後からオペコードにより決定されます。例えば
、ADD
、SUB
は同一マイクロコードを使用しますが、ハードウェアはオペコードで操作を選択します。ADC
算術命令のマイクロコード例
M → tmpa XI tmpa 最初の引数をロードし ALU を設定。 R → tmpb WB,NXT 二番目の引数をロード;メモリ書き込みが無ければ次命令へ進む。 Σ → M RNI F ALU の結果をストアし、次命令を実行、ステータスフラグを更新。
は 擬似 ALU 操作であり、ハードウェアは後からマシン命令のオペコードにより本来の操作に置き換えます。XI- ALU 操作は次のマイクロインストラクションが結果を取り出すまで記憶されます。
ALU の設計
8086 の ALU は各ビットごとに 2 つの LUT(ルックアップテーブル) を用いてキャリーと出力信号を生成します。適切な制御信号をこれらの LUT にロードすることで、28 種類の操作を実現できます。
- 16 ビットすべてに同一回路があり、合計で 16‑bit 演算子を処理します。
特殊ケース
多くの命令には独自の挙動があるため、6 入力 LUT を超える追加制御信号が必要です:
| 命令 | 特殊な振る舞い |
|---|---|
| 減算と同じですが、数値結果は破棄され、ステータスフラグのみ更新。 |
vs | 0 ビット目のキャリー入力が異なる。 |
| 減算 | キャリー(借用)を反転させて処理。 |
| インクリメント/デクリメント | 通常だが、/ が 2 を加減するときはビット1へのキャリーを使用。 |
| シフト/ローテーション | キャリーを含む/除外することがあり、算術右シフトでは上位ビットを複製。 |
チップ内の ALU 制御論理
マイクロインストラクション → ラッチ → PLA(デコード)→制御信号→ALU
- XI マルチプレクサ は操作フィールドを、次の情報で生成された値に置き換えます:
- 「X」レジスタ内の 3 ビット、
- 命令レジスタからの 1 ビット、
- グループデコード ROM からの 1 ビット。
- 一時レジスタは 3 個のフリップフロップで追跡され、各マシン命令開始時に レジスタ A にリセットされます。
- 5 ビット操作フィールドを保持する 5 フリップフロップは、各マシン命令開始時に ADD にリセットされます。
- 生成された 5 ビット出力は操作 PLA に入力され、27 の制御信号 をデコードし、そのうち約 15 が ALU 用 LUT PLA を駆動します。
要点
8086 の複雑さ―マシン命令ごとに複数のマイクロインストラクションを持つこと、ALU 操作の動的置換、そして多くの特殊ケース―は、CISC デザインが RISC に比べてより細密である理由を示しています。この正確な複雑さこそが、x86 ファミリーが長年にわたり成功し続ける要因となっています。
参考・クレジット
- マイクロコード解析は Andrew Jenner の 8086 マイクロコード逆アセンブルを基にしています。
- Marcin Peczarski との議論を参照。
フォローして最新情報をゲットしてください:
Bluesky (@righto.com) | Mastodon ([email protected]) | RSS