**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ビット操作やセグメントアドレッシング以外では拡張できません。

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 段階で制御します:

  1. マイクロコード命令(マイクロインストラクション)が ALU を所望の操作に設定します。
  2. その後のマイクロインストラクションが ALU の結果を取り出します。

マイクロコードとマシンコード命令は、ALU に送られる制御信号を決定し、ハードウェア上でマイクロインストラクションを「結合」させます。

マイクロコードの構成

  • 各マシン命令は複数のマイクロインストラクションに分解されます。
  • すべてのマイクロインストラクションは 2 つの独立したタスク を実行します:
    • ソースと宛先間でのデータ移動。
    • 副次的なタスク:ジャンプ、サブルーチン呼び出し、メモリ読込/書込、または ALU 操作。
  • ALU 操作は 5 ビットフィールド(操作コード)と 2 ビットフィールド(入力を供給する一時レジスタ)で指定されます。
  • いくつかのマシン命令は同じマイクロコードを共有し、具体的な ALU 操作は後からオペコードにより決定されます。例えば
    ADD
    SUB
    ADC
    は同一マイクロコードを使用しますが、ハードウェアはオペコードで操作を選択します。

算術命令のマイクロコード例

M  → tmpa   XI   tmpa      最初の引数をロードし ALU を設定。
R  → tmpb   WB,NXT          二番目の引数をロード;メモリ書き込みが無ければ次命令へ進む。
Σ  → M       RNI  F           ALU の結果をストアし、次命令を実行、ステータスフラグを更新。
  • XI
    擬似 ALU 操作であり、ハードウェアは後からマシン命令のオペコードにより本来の操作に置き換えます。
  • ALU 操作は次のマイクロインストラクションが結果を取り出すまで記憶されます。

ALU の設計

8086 の ALU は各ビットごとに 2 つの LUT(ルックアップテーブル) を用いてキャリーと出力信号を生成します。適切な制御信号をこれらの LUT にロードすることで、28 種類の操作を実現できます。

  • 16 ビットすべてに同一回路があり、合計で 16‑bit 演算子を処理します。

特殊ケース

多くの命令には独自の挙動があるため、6 入力 LUT を超える追加制御信号が必要です:

命令特殊な振る舞い
CMP
減算と同じですが、数値結果は破棄され、ステータスフラグのみ更新。
ADD
vs
ADC
0 ビット目のキャリー入力が異なる。
減算キャリー(借用)を反転させて処理。
インクリメント/デクリメント通常だが、
INC
/
DEC
が 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

同じ日のほかのニュース

一覧に戻る →

2026/01/24 10:00

**27ブランドから325車種へ対応したオープンソース自動運転**

## Japanese Translation: 提供された要約は正確で網羅的かつ明瞭であるため、変更の必要はありません。 --- **元の要約:** Comma Four は、オープンパイロットプラットフォームを利用した高度なドライバーアシスタンス機能を車両に提供する AI 主導型アップグレードです。トヨタ・ヒュンダイ・フォードなど 27 社の 325 台以上の車に追加でき、広範なモデルでテストされ、人間の入力を最小限に抑えて数時間動作可能であることが示されています。オープンパイロットの実証済み自律走行機能を基盤とし、Comma Four は自動運転技術の業界全体への普及へ向けた一歩を表します。同社はユーザーにコミュニティ参加と将来の自律システム形成への貢献を呼びかけつつ、プロダクト開発・自律工学・運用部門での採用も積極的に行っています。広く展開されれば、このアップグレードは多ブランドのドライバーアシスト機能の導入を加速し、自動車技術分野で新たなキャリアパスを創出する可能性があります。

2026/01/19 17:03

**現代のプログラミングで実践しているC++習慣** 1. **説明的な変数名を使う** - 単一文字の識別子は避け、意図が伝わる名前を選ぶ。 2. **不変データには `const` と `static const` を優先する** - 変更されないことを保証し、コンパイラ最適化を促進する。 3. **RAII(Resource Acquisition Is Initialization)パターンを採用する** - リソースの取得と解放をオブジェクトに閉じ込めることでリークを防止。 4. **必要に応じてヘッダーオンリ―ライブラリを利用する** - コンパイル依存性が減り、ビルド時間が短縮される。 5. **型推論には `auto` を使う** - 複雑なイテレータ型を簡潔にしつつ可読性を保つ。 6. **モダンなコンテナ初期化子を活用する** - `std::vector<int> v{1, 2, 3};` は手動の `push_back` よりも明確で簡潔。 7. **Catch2 や Google Test のようなフレームワークで単体テストを書く** - コードの正しさを保証し、リファクタリングを容易にする。 8. **関数は短く、目的を絞る** - 単一責任原則を目指すことで保守性が向上する。 9. **Doxygen コメントでドキュメント化する** - クリーンで検索可能な API ドキュメントを自動生成できる。 10. **最適化はプロファイル後に行う** - ホットスポットを測定し、実際のパフォーマンスボトルネックに対処する。

## Japanese Translation: 作者は主にC#とPythonで作業していますが、バインディングやニッチなタスクのために依然としてC(またはC++)を使用します。これは細粒度の制御を提供するからです。Cには公式のスタイルガイドラインがないため、ブログ、Rust、および完璧主義的マインドセットから引き出した個人的な習慣を構築しています。 新しいプロジェクトでは、GCC/Clang/MSVCサポート付き**C23**を好み、`#if CHAR_BIT != 8 #error` を強制して8ビットの `char` を保証します。彼らは簡潔な typedef のセット(`u8`, `i8`, `i16`, `u16`, `i32`, `u32`, `u64`, `f32`, `f64`, `uptr`, `isize`, `usize`)を採用し、<stdbool.h> からの C23 の `bool` をブール値に使用します。 ヌル終端文字列を避けるために、彼らは **長さ+データ構造**(`String` に `u8 *data; isize len`)を使用します。「parse, don’t validate」に触発されてオープックタイプと信頼できるコンストラクタ(Lelenthran のブログ参照)を作成しています。C23 のタグ互換性により、マクロ (`Tuple2(T1,T2)`) を使って単純なタプルを定義できますが、名前付き構造体は必要です。 エラーハンドリングは **sum types** でモデル化されています:列挙型とそれに伴う構造体(`ErrorCode`, `SafeBuffer`, `MaybeBuffer`)が戻り値に成功または失敗を符号化します。作者は純粋な C では動的メモリ割り当てを意図的に避け、ヒープ重視のコードには Rust または C# を好みます;アレーナアロケータも言及されますが使用されません。 標準ライブラリの使用は最小限です。文字列関数はほとんど使わず、代わりに生の `mem*` 呼び出しを優先します。また、OS API はエルゴノミクスが悪いため再実装されることがよくあります。作者は外部関数のドキュメントを注意深く読むことを強調し、将来的により安全なメモリ取り扱いのために **「slice」タイプ** を追加することを検討しています。 全体として、この記事は読者が自分自身の C スタイルガイドラインを作成するよう奨励しつつ、言語の強みと挫折の両方を認めています。

2026/01/20 0:06

**Go言語が1万5000行を削減** --- ### 概要 Goプログラミング言語は、最近の更新で約 **150万行(LOC)** のコードを削除し、コードベースの大幅な縮小を実現しました。これはコミュニティが言語をシンプルに保ち、保守性を向上させるために継続的に取り組んでいる結果です。 ### 主なポイント - **削減規模** - コアパッケージとツール全体で約1,500,000行が削除されました。 - **動機** - 現在の使用状況に合わなくなった重複コードやレガシーコードを排除する。 - 保守性を簡素化し、コンパイル時間を短縮し、可読性を向上させる。 - **開発者への影響** - 廃止予定の機能に対してわずかなAPI変更が加えられました。 - よりシンプルになったコードベースを反映したドキュメントが更新されました。 - **今後の展望** - ミニマリズムとパフォーマンスへの継続的な注力。 - 言語をさらに洗練させるため、コミュニティからの貢献を奨励しています。 ### 結論 Goプロジェクトが半百万行に及ぶ削減を意図的に実施したことは、世界中の開発者に対して明瞭性・効率性・長期的持続可能性へのコミットメントを示すものです。

## Japanese Translation: ``` ## Summary 著者はQuaminaにUnicode文字プロパティ正規表現の堅牢なサポートを構築し、`[~p{L}~p{Zs}~p{Nd}]`という構文を使用しました。 Goの標準ライブラリが最新のUnicodeバージョン(15.0対17.0)に追いついていないため、Quaminaは独自のデータを維持する必要がありました。著者は `UnicodeData.txt` を取得し、フィールド1と3を解析してすべての37カテゴリとそれらの補集合の範囲をリスト化したコードを生成しました—結果として従来の775K行アプローチに比べ5,122行のGoコードのみで済みました。 初期は、すべてのオートマタを事前計算しコードへ直列化すると約12Mのデータが生成され、起動時に長時間停止したりIDEがクラッシュする問題が発生しました。実行時キャッシュ戦略に切り替えることで、Quaminaは初回使用時にUnicodeプロパティオートマタを計算し保持できるようになりました。この変更で追加速度が135/秒から4,330/秒へ(30倍)向上しました。マッチング性能も高いままであり、UTF‑8の短さと浅いオートマタのおかげで数十万〜百万メッセージ/秒を処理できます。 著者は日常的な作業にGenAIツールを使用することを検討しましたが、ツール不足・時間制約・そのようなサービスのビジネス実現性への懐疑心から控えています。次の主要機能は数値量指定子サポート(例:`a{2-5}`)であり、これによりQuaminaの正規表現機能が完結します。この成功を受けてQuamina 2.0の安定リリースが計画されています。生活上の誘惑が勢いを鈍らせましたが、不確実性があるものの今後の開発は奨励されます。 ```

**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ビット操作やセグメントアドレッシング以外では拡張できません。 | そっか~ニュース