CPUについて

CPUを作ろうという書籍やホームページがありますね。

  1. CPUの創りかた
  2. CPUをつくる

具体的なCPUの勉強は専門書籍を見ていただけばいいのですが、「私の思うCPUってこんな感じ」について書いてみたいと思います。

CPUが電子頭脳の中心部ですよね。これにメモリーやらIOデバイスやら、ストレージやら、あれこれ付いてコンピュータを形成しますよね。

CPUは何をするかというと、基本そりゃー計算でしょ。判断もするよね。

そもそもプログラムの解釈実行をしているのはCPUだもんね。

判断をするとか、計算をするとかどういう仕組みんだんだろー?と思うけど、ややこしそうですよね。取っつきにくそう。CPUを創る本は、私はまだ読んでおりませんので、内容はまだ知らないのです。私が読んだのは、どういう本だったかな。

  1. 絵で見るマイコン入門
  2. つくるマイコン
  3. 標準MS-DOSハンドブック

結構たくさん書籍を読みました。中学三年から高校生は、上記の1と2,そして、社会人になってPC-9801を買ってしばらくしてから、上記の3を読みました。

そういう書籍を読む中で、CPUって、こんな感じなんだーと、だんだんつかめてきた次第なんですが、利発な人に比べて納得するのに、随分時間がかかってしまって。

CPU内部構造の説明の一つの例ですが、これを見てもピンとこないと思います。もう一つCPUの内部構造の説明がありますが、こう言うのを見ても、まだ、ピンとくるはずがないと思います。私はTK-80から入りましたので、そのときのCPUはIntel 8080Aだったので、その内部構造の資料(wikiのBlockdiagrammの図)を見たのですが、ぜんぜん、そのピンときませんでした。

何を知ってピンとくるか、何を知って納得するかですが、

  1. CPUの中に何があるんだ?
  2. CPUの中で何やっているんだ?
  3. 判断ってどういうことなんだ?
  4. 演算って何をするんだ?
  5. アンドや、オアや、加算、減算はどうやってやっているんだ?
  6. 命令(マシン語)をどうやって解釈しているんだ?
  7. フラグレジスタってなんだ?
  8. アドレスレジスタってなんだ?
  9. アドレスバスってなんだ?
  10. データバスってなんだ?
  11. フェッチとラッチってなんだ?
  12. デコードって何するんだ?
  13. マシン語体系って、どういう意味?
  14. etc

等と、書き始めると、止めどなく疑問が出てきますが、先の資料を読んだって、そうそう全容を知ることは困難です。だから、早々やすやすとピンとくるはずはないと思います。

私は、相当長い間CPUを理解できませんでした。レジスタがあるとかALUがあるとかACCがあるとかアドレスレジスタがある、スタックポインタがある、フラグレジスタがあるとかは、8080のアーキテクチャの構造図などから学べるのですが、それがどうしたという感じで、ACCの全容は理解できないけど、2進数の半加算器と全加算器は理解できたので、ACCの中身はなんとなく推測はできたし、レジスタも大体は理解できた、アドレスレジスタも、スタックポインタについては、難渋しました、アドレスバスと、データバスとラッチとフェッチは大体理解できましたが、それでもしっくり来ません。

データをロードすると言う意味が、メモリーからCPU内部のいずれかのレジスタにデータを読み込むことだとか、レジスタから、レジスタにデータをコピーするとか、いずれかのレジスタとACC都の演算をさせてその結果をACCに保持するとか、演算結果に応じてフラグレジスタをセットするとか、演算結果がゼロなら、フラグレジスタのゼロフラグ部分を1にするとか、演算結果が桁オーバーしたら、フラグレジスタのキャリーフラグを1にするとか、そういう事は案外簡単に理解できる部分です。

判断とは比較です。

と言う事で、判断について、説明しますと、マシン語に、判断命令(if文)は無いのです。マシン語にあるのは比較命令だけなんです。だから、アセンブラとかマシン語でプログラムを組むときは、判断は比較と比較結果の評価とジャンプ命令で実現します。つまり、「A=Bなら、何番地にジャンプしろ、A≠Bなら、何番地に進め」と言う記述をします。さらっと書きましたが、比較命令で2つの値を比べた結果がフラグレジスタに反映されますので、比較後の評価とは、フラグレジスタの値によるジャンプです。

比較とは引き算です

比較後の評価がフラグレジスタに反映されると書いたのですが、今ひとつわからないと思います。書き直しますと、比較される値から比較する値を引くとか、そういう引き算をしますと、同じ値だったら引き算をした結果は0なので、フラグレジスタのゼロフラグが立ちますので、それを評価するのです。でもまだ、フラグレジスタを評価すると書くとわかりづらいと思います。評価をマシン語命令で書けば、JNZかJZですが、これはJZの意味はゼロならジャンプしろ、でJNZはゼロでなければジャンプしろと言う命令です。

ですので、「レジスタAとレジスタBを比較して同じ値だったら、アドレス8250番地にジャンプしろ。」と言う時は、比較(compareを略してcmp)命令と条件付きジャンプ命令を用いて次のように書きます。

cmp a,b
jz 0x8250

この様にして、概念的に、マシン語レベルで、どういう挙動になるかを理解できてきても、私はしっくり来ませんでした。それは、クロック供給されて内部ハードロジックの連鎖的動作の結果CPUの動きが作られることについて、解らなかったからなんです。その辺りはマイクロプログラム方式デコーダーについて学ぶとだいぶわかってきます。

そこで、マシン語の命令大系とデーコーダーについて学びますとようやく、少しわかった気がしてきました。CPUを学ぶにあたって、小規模なマシン語プログラミングやアセンブラプログラミングだけだと、理解するのが困難な部分があります。それは、高級言語のコンパイラーの動きを知ると、ああなるほどと、改めてCPUの内部構造で理解できる部分が出てきます。さらにOSを学ぶと、CPUの内部構造でああそういう事かと理解できる部分が出てきます。

CPUサイクルとパイプライン処理とか

CPUを理解しようとして、回路とロジックだけを眺めても、知ることのない世界があるのです。それは、コンパイラーや高級言語や、OSを理解して改めてCPUに目をやると納得できる機能がCPUには埋め込まれていますので、総合的に知識を貯めこんでからでないと、おそらく理解はできないのです。

ですので、理解できるところから理解を進めていくしかなくて、結構広範囲な知識を総動員してCPUを理解していく事になりますので、あれこれ好き嫌いせずに全般的に知識を習得していけば、CPUというものを理解できるのだと思います。

閑話休題

自動ピアノは、穴が開いた部分で音符を表現した楽譜を読ませることで、ジャズでもクラッシックでもピアノ演奏を聞くことができます。楽譜の入れ替えが面倒かもしれませんが、一旦楽譜をセットすれば、プロ並みの演奏を奏でます。

ジュークボックスでは、曲目を指定すると、一曲演奏してくれます。音自体はレコードの再生ですがプロの音質を聞くことができます。

そこで、CPUの内部の動きとマイクロコードなのですが、自動演奏ピアノの楽譜のように、動きを指定した楽譜が沢山あって、ジュークボックスのように番号指定できる場合を想像してみると、CPUがマシン語を読み込んでデコードして動くと言う状況が、ジュークボックスで、楽曲番号を指定された後、レコードじゃなくて、自動演奏ピアノの楽譜を読みながら、各部を動かすのと似たイメージになるなぁと、思えます。

命令を読み込むと一連のCPU内部の動作に対応する動きになるのですが、それはデコーダーでデコードした結果、内部の動作の楽譜に類するものに対応するので、機械的に自動演奏されるがごとく、レジスタに代入されたりフラグセットサれたり、レジスタからメモリーに格納されたりと言う一連の動作に還元される様子を思い浮かべることができると思います。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です