道草はこの辺にして、図の単純な構造のコンピュータの動作の説明に戻ろう。
命令フェッチとデコード
まず、(1)プログラムカウンタの内容をメモリアドレスレジスタに転送し、(2)メモリを読み出してメモリデータレジスタに格納し、(3)メモリデータレジスタに読み出された命令を命令レジスタに転送する。そして、(4)命令の内容を解釈(デコード)して、コンピュータ各部を制御する信号を生成する。また、(5)次の命令の読み出しに備えて、プログラムカウンタの値を+1する。
命令の実行
例えば加算命令の場合は、アキュムレータの内容に命令で指定されたアドレスのメモリの内容を加算するという動作であり、(1)命令のオペランドアドレス部をメモリアドレスレジスタに転送し、(2)メモリを読み出してオペランドをメモリデータレジスタに格納し、(3)演算器でアキュムレータの内容とメモリデータレジスタの内容を加算してアキュムレータに格納する。
一方、加算結果をメモリに書き戻すストア命令の場合は、(1)命令のリザルトアドレス部をメモリアドレスレジスタに転送し、(2)アキュムレータの内容をメモリデータレジスタに転送し、(3)メモリに書き込みを行う。という動作になる。
入出力
アキュムレータの内容を出力する命令の場合は、(1)出力バッファの入力としてアキュムレータを選択して(図には含まれていないが)出力装置にデータレディの信号を送る。一方、メモリアドレスを指定し、そのアドレスの内容を出力する命令の場合は、(1)命令のメモリアドレス部をメモリアドレスレジスタに転送し、(2)メモリを読み出しメモリデータレジスタに格納し、(3)出力バッファに入力としてメモリデータレジスタを選択して出力装置にデータレディの信号を送るという動作になる。そして出力装置はデータレディー信号が"1"になったらデータを取り込むという動作を行う。
一方、入力の場合は、入力装置からのデータレディーを確認し、データを入力バッファ経由でアキュムレータに読み込む。
これらの命令のフェッチとデコードや命令の実行の各ステップで、意図した動作が起こるように、各レジスタに入力データを取り込ませたり、マルチプレクサの選択を切り替えたりする状態制御信号を作るのが、図の中央部にある状態生成回路である。
このコンピュータの命令は、メモリのロード、ストアや、演算、入出力、分岐命令など動作の種別を示すオペレーションコード部とオペランドやリザルトとなるメモリのアドレスを示す部分からなる。
DECのミニコンであるPDP-8の場合は、命令語長は12ビットであり、ある程度汎用的な処理ができる命令アーキテクチャとしては驚異的に短い命令語である。そのため、メモリアドレスの指定には7ビットしか使用できず、直接アドレスできるメモリは4K語のページの先頭の128語に限定される。従って、この範囲の1語に本当にアクセスしたいメモリアドレスを書いておき、命令ではメモリアドレスを書いた語のアドレスを指定して、読まれた内容をメモリアドレスとして、再度、メモリを読む間接アドレスという手法が採られた。
このコンピュータで、下記のような合計を求めるプログラムを実行しようとすると、
for ( i=0; i<100; i++) {
C+=A[i];
}
まず、ループカウント100と、合計を格納するCと、配列の先頭のA[0]のアドレスをページの先頭の128語の内に格納する。そして、次のような処理を行う。
- ループカウントをアキュムレータにロード
- 値がゼロならば、終了へジャンプ
- アキュムレータの値を-1する
- アキュムレータの値をループカウントにストア
- アキュムレータにCの値をロード
- A[i]を間接アドレスで読み、アキュムレータと加算し、結果をアキュムレータに格納
- アキュムレータをCにストア
- 配列アドレスをアキュムレータにロード
- アキュムレータの値を+1する
- アキュムレータの値を配列アドレスにストア
- (1)へジャンプ
この例から分かるように、本来やりたい合計の計算以外に、ループカウントのチェックや更新、配列アドレスの更新が必要であり、そのたびに、アキュムレータとメモリの内容を入れ替える必要がある。