CPU の話 by maechan@hannan-u.ac.jp

我輩の出来る範囲で、極力簡単に CPU の原理をたとえ話で説明しよ うと試みます。幼稚な部分もありますが、しばしご辛抱を。

実直なTD4君

TD4君 (ネーミングがいまいちだけど、直接的とゆーことでご 勘弁(汗)) は、非常に素直で、しかし一度に複雑なことはできない奴 です。
このTD4は処理単位が4ビットなので、メモリのデータ(後述) を除く、ほとんどの情報が4ビット単位(16進数だと1桁)である、という ことになっています。
言われたことはその通りにしますが、何せ物覚えが悪いので、いつもすぐにメ モできるように身の回りに書いたり消したりできるメモを2枚持っています。
それを レジスタ (register, reg. とも表記) と呼び、 取り敢えずAとBの2つがある(メモ用紙2枚に対応)とします。このTD4君は、 処理単位に従ってレジスタも4ビット単位です。
TD4君は何せ単純なので、先生(父親でも上司でも可?)が仕事をお願いする ときも一度に複雑なことを言ったのではパニックしてしまいます。なので、逐 一単純な仕事に細かくわけて、それを順々に指示をしないといけないのです。 そこで先生は考えました。引出し付き書棚を用意しておいて、その中に分解し た作業をメモにして順番にいれておき、TD4君には最初(一番上)の引出しから 順々にあけていき、そこに書いてある指示にしたがえばよい、という約束にし ました。
これが メモリ (memory) です。このTD4君は、メモ リは8ビット単位です(後述)。
そのとき、いま何段目までやったか忘れないように[今実行している指示は何 段目のもの]か、もメモっておくことにします。ちなみに一番最初は1ではな く0から始まることになっています。さらに、特に指示がない限り、何か指示 をこなすとメモの値を1増やしたものに書きかえる、とします。
このメモも4ビットの情報を持てるものとします。この特別な メモのことを "PC" (Program Counter) と呼びます。 4ビットなので0〜15 のいずれかになります。

仕事の仕方

上で説明しているように、逐一単純な仕事に細かくわけて、それを順々に指示 をしないといけないです。そのために引出し付き書棚を用意しておいて、その 中に分解した作業をメモにして順番にいれておき、TD4君には最初(一番上)の 引出しから順々にあけていき、そこに書いてある指示にしたがえばよい、とい う約束です。

さらに厄介なことに、メモは2進数8桁で、そのうち指示は左4桁、パラメー タは右4桁(パラメータが不要な場合もあり)になってい る (ご都合主義で申し訳ないです) ので、TD4 君にはその数と作業の対応関係の表も渡しておきます。

この対応関係をひもとくことこそ、CPU の動作の fetch-decode-execute の decode (復号?) に対応する処理なのです、が、詳細は略します。

先生は、とりあえずこのやり方で仕事を頼んでみることにしました。

とある仕事


TD4君は早速お仕事を開始します。0段目を読んでみると0011です。これを対照 表で探すと、「右の数をAレジスタに保存してする」か。右にはは…ふむ、 0001が入ってる、ということで、TD4君は1つ目のメモ(Aレジスタ)に1を書 き込みます。それと同時に、特に指示がない限り、PC を1増やすことになっ ている、とします。「ということは、いま0段目なので、次は1段目から実行 するということか。」とTD4君は納得します。
この場合、左4桁、すなわち実際に実行すべき機械語の命令のことを オ ペコード (operation code, opecode) 、右4桁のような、その命令の操 作対象(パラメータ)に対応するものを オペランド (operand) 、 と呼ぶことがあります。

さらに、このオペランドは、一般的に、レジスタ番号を持ったり、メモリアド レスを持ったり、直接の数値(今回はこれ)だったり、いろいろな場合がある ことも頭の片隅に置いておいてください。ちなみにこのような直接の数値のこ とを 即値データ (immediate data) と呼びます。


ということで、次に1段目を読んでみます。0100なので、「Aレジスタの値をB レジスタに保存」とあります。ということで、TD4君は先ほど入れた1つ目の メモの値である1を、2つ目のメモ(Bレジスタ)に書き移します。それと同 時に、PCを2にします。


次は2段目です。0101 なので「右の4ビットの数の数をBレジスタに加算」で す。右の4ビットは 0001 で、Bは元が 0001 なので、1+1=10(2) を新たにBの値とします。そして「2段目の引出しは終ったので、次は3段目だ な」ということで、PC を3にします。


次は3段目です。なので「Bレジスタの内容を表示」です。出力用LED4つにBレ ジスタの内容である 0010 を表示(出力)します。と同時に「3段目の引出しは 終ったので、次は4段目だな」ということで、PC を4にします。
この場合、レジスタの内容を表示するだけで、オペランドは無かった(何 か値があっても無視する)です。この TD4の場合はJMP (後述)以外の命 令は全てPC を1増やすのですが、他の CPU では、機械語命令の長さはひ とつに決まってるわけではないです。


4段目には1111があります。これは「右4ビットの数をPCに入れる」とありま す。PCは4ビットなので右4ビットちょうどということです。PC はもともと 0100 だったので、変わらないことになります。つまり、次も同じ命令を実行 するということで無限ループに陥り、もう他の仕事はしない、ということです。 つまり「おしまい」です。
実はこの TD4 には終了命令が無いので(ある CPU も勿論あります)、処理が 終了したら何もしない無限ループにする、という約束になっています。
おしまいということなので、TD4君は「簡単、簡単」ということで、今回のおし ごとは終了です。

それを見ていた先生は表示されてる数字を見て「ふむ、2か。ちゃんと足し算 できてるな」と納得しました。


次のステップ
講義用スタイル
印刷用スタイル
(開いてから、ページを再度更新してください)