次の図2.1に示す簡単な構造のプロセサのブロックダイヤグラムに基づいて、命令を処理するステップを見て行こう。このプロセサは114回に載せたプロセサとほぼ同機能であるが、説明の都合上、ブロックダイヤグラムは若干異なっている。

図2.1 簡単な構造のプロセサのブロックダイヤグラム

左端の部分は実行する命令のアドレスを指すプログラムカウンタと、アドレスを次の命令に進めるインクリメンタである。メモリアドレスがバイト単位で付けられており、命令長が4バイトである場合は、次の命令を指すためには+4とする必要があるが、ここでは次の命令という意味で+1と表記している。

プログラムカウンタにプログラムの先頭の命令アドレスが設定されている状態から、メモリから最初の命令を読み出す手順は、次の図2.2のようになる。先ず、(1)プログラムカウンタの内容をメモリアドレスとしてメモリを読む。そして、読み出しデータを命令レジスタに格納する。そして、並行して(1)'でプログラムカウンタを+1して次の命令を指すようにする。これで、プログラムカウンタが指していたアドレスの命令が命令レジスタに入ったことになる。

図2.2 命令フェッチ(メモリからの命令の読み込み)

次に(2)で命令レジスタの内容を解釈して、プロセサの各部を動作させる制御信号を作る。一つの命令に対して複数サイクルにわたって制御信号を供給する必要があるが、ここでは細部については述べず、命令を解釈すると必要な制御信号が必要なタイミングで生成されるということにしておく。

そして、最初の命令はメモリからデータを読み込むLD [R1]→R2の形式のロード命令であったとしよう。この命令はレジスタファイルで実現されている汎用レジスタR1の内容が指すメモリアドレスの内容を汎用レジスタR2に格納するという動作を指定している。なお、[ ]は間接指定を意味しており、R1の内容ではなく、R1の内容で指されるメモリデータを意味する。

図2.3 メモリデータのロード

データが格納されているアドレスは、既にレジスタファイルに格納されているものとすると、図2.3の(3)でデータの格納アドレスを格納しているR1レジスタを読み、このアドレスを演算器を経由してメモリアドレスレジスタに転送する。そして、(4)でメモリアドレスレジスタの内容をアドレスとしてメモリを読み、命令で指定されたR2レジスタにデータを格納する。

次にまた、更新されたプログラムカウンタに基づいて命令フェッチが行われ、次の命令がメモリから読み込まれて命令レジスタに格納される。この命令は、ADD R1,R2→R3のような加算命令であったとしよう。この命令は、汎用レジスタR1とR2の内容を加算し、その結果をR3に格納することを指定している。

図2.4 レジスタデータ間の演算

図2.4の右端のレジスタファイルから(3)でR1とR2を読み、演算器で加算を行い、レジスタファイルのR3に格納すれば命令の実行は終わりである。

次に、また命令フェッチが行われる。この命令がデータをメモリに書き込むST R1→[R2]の形式のストア命令であったとしよう。この命令は、レジスタR1の内容をR2に格納されたアドレスで指されるメモリアドレスに格納することを指定している。

図2.5 メモリへのデータのストア

このストア命令の実行は、(3)でR2レジスタを読み出し、演算器を経由してメモリアドレスレジスタに書き込む。そして、(4)でR1レジスタを読み出し、演算器を経由してメモリデータレジスタに書き込む。これでメモリへの格納の準備は整ったので、(5)と(5)'でメモリへの書き込みを行う。

このようにLD、ADD、ST命令を実行すると、次の図2.6のように12サイクルを必要とする。

図2.6 LD、ADD、ST命令の順次実行の状況