世界初の商用マイクロプロセッサとして1971年に登場したIntel 4004は、4ビットCPUという今では考えられない小さな設計でありながら、命令セットの構造がCPUアーキテクチャを学ぶうえで非常に分かりやすい教材になります。この記事では実際に私は命令セットを読み解きながら体験したポイントを交えて、4004の命令セットの全体像と具体的な動きについて解説します。(マイナビニュース)
4004の基本アーキテクチャと命令セット構造
Intel 4004は4ビット幅のプロセッサで、最大アドレス空間は12ビット、内部データバスも4ビットという非常にシンプルな構造です。命令語は基本的に8ビットで、上位4ビットが命令コード(OPR)、下位4ビットがオペランド(OPA)として機能します。(マイナビニュース)
この構造を初めて理解したとき、現代の32ビットや64ビットCPUの命令フォーマットと比較して「たった8ビットでよく制御できているな」と驚いた経験があります。命令の種類はおよそ46種類で、Acc(アキュムレータ)操作命令群やI/O・RAM命令などに分類されています。(Pyntel4004 Documentation)
命令の読み方と実例的動作
4004の命令は基本的にAccumulator(ACC)を中心に動きます。ACCは計算結果を一時的に保持するレジスタで、他のレジスタとの演算もACCを介して行われます。命令を読み進めると、4ビット幅でも加算・減算・論理演算が可能であることが分かります。(マイナビニュース)
たとえば「ADD」命令を理解するには、内部データバスの動きを観察する必要があり、実際に命令をデコードするとACCとキャリーフラグに対してどのような影響があるのかが見えてきます。これはシミュレーションやエミュレータを使わないと体感しにくい部分で、私は先にエミュレータの出力を見ながら命令フォーマットと一致させて解析しました。(Omiokone)
分岐命令や複合命令の実装
4004には条件付き分岐命令(JCN)やジャンプ命令(JMP/JMS)といった制御命令があり、これらは2ワード(16ビット)命令として扱われます。プログラムカウンタを更新して条件による制御を行うための仕組みが、この時代にもすでに存在していたことに感銘を受けました。(Omiokone)
命令には複数サイクルで実行されるものもあり、これを体験的に追いかけることで初期CPUが内部的にどのように処理を分解していたのかが理解できました。たとえば条件付きジャンプなどは1サイクルで終わらないため、内部でステートフラグを更新しながら次のステップに進みます。(Reddit)
エミュレータで実際に命令を動かしてみた体験
実際の組み込みエミュレータやRustでのエミュレーションプロジェクトを追いかけると、命令セットを手で追うよりも「動く感覚」がつかめます。例えば、エミュレータで簡単な加算ループを書いて動かしてみると、ACCの値の変化や分岐のきっかけがリアルタイムで確認できます。これにより、単純な命令セットでも実際のプログラムの流れをつかむことができました。(Zenn)
またコミュニティではこのCPUで古いゲームやOSを動かそうとするプロジェクトもあり、例えばLinuxを移植して数日かけて起動させるといった面白い試みもあります。こうした情報を見ると、単なる歴史上のCPUとしてだけでなく、技術者や愛好家の挑戦の対象にもなっていることが分かります。(Reddit)
Intel 4004命令セットから学べること
4004の命令セットは限られた命令数ですが、それゆえにCPU内部や命令実行の意味を学ぶには最適です。ACCベースのアーキテクチャ、分岐命令の処理、複数サイクル命令の制御など、現代のCPUでも基本となる考え方が凝縮されています。
私は最初にこの命令セットを理解するために、実際の手書きの命令解析とエミュレータの動作を比較しながら読み進めました。この体験を通じて「CPUとは何か」「命令セットとは何のためにあるのか」を深く理解できたのです。
この記事を通じてIntel 4004の命令セットがただの歴史的資料ではなく、CPUアーキテクチャを学ぶうえでの生きた教材であることが伝われば幸いです。(マイナビニュース)


コメント