AOBA's Information Processing Education
1998/01/18
注意1:このページは、回線を切断した後でゆっくりご覧になってください(テキストを印刷する場合は、その取り扱いに注意してくださるようお願いします)。
注意2:背景が白地の画面を長時間見つめていると頭が痛くなってしまいますので、ここは背景をグレーにしています。
「CPUは主記憶装置から一つの命令を取り出し、それを解釈、そして実行する」。「コンピュータ(というかCPU)はこの動作を次々と繰り返し処理を進行する」。
以上はこれまでも何回か説明した点です。
このとき、主記憶装置から一つの命令を取り出してから、その命令の実行を終了するまでの過程を、命令サイクルといいます。
今回はこの命令サイクルについて説明しましょう。
ただし、命令サイクルを理解するには機械語の命令の構成についても知っておく必要がありますので、まずは簡単にこの説明から。機械語の命令に限らないのですが、一般に命令と呼ばれるものにはオペレーションとオペランドがあります。ちょっと難しく言えば、オペレーションとはその命令で規定する演算で、オペランドとはその演算の対象となるデータのことです。
例えば、”x+y”という命令においては、”+”がオペレーションで、”x”と”y”がオペランドになります。
そして機械語の命令にもオペレーションとオペランドがあり、機械語の命令におけるオペレーション部分を命令部、そのオペランド部分を番地部、といいます。この定義に従えば機械語の命令は、次の構成で表すことができます。
命令部 番地部 もちろん機械語ですから、命令部も番地部も2進数ですね。
機械語のオペランドを”番地部”と呼ぶことで分かるかもしれませんが、機械語のオペランドは一般に演算対象のデータそのものではなく、演算の対象のデータが存在する(主記憶装置上の)番地を指定します。だから先の例で言えば、”x”や”y”の値そのものではなく、これらのデータが存在する主記憶装置上の番地になります(絶対番地か相対番地かは、ここでは無視する)。
さてここで一つ疑問が出たかもしれません。”x+y”の命令にはオペランドが二つありますが、機械語の命令の構成では番地部が一つしかありませんね。
実はオペランドは1つしかない場合もあるし、3つとる場合もあります。また番地部がない場合もあるのです。次の図を見てください。この図で”番地”となっている部分を総称して”番地部”といいます。だからオペランドを複数とることもできるのです。
命令部
命令部 番地
命令部 番地 番地
命令部 番地 番地 番地 (注)この形式のことを命令形式といい、上から順に0アドレス指定方式、1アドレス指定方式、2アドレス指定方式、3アドレス指定方式、といいます。どの命令形式をとるかは、各コンピュータ(というかCPU)のアーキテクチャ等によるのですが、ここでは無視。
ここからちょっとややこしいのですが、実は上記の4つの命令形式の他に、もう一つ命令形式があります。それは1+1/2アドレス指定方式というものですが、何はともあれこの形式を以下に示しましょう。
命令部 レジスタ 番地 この形式の命令のオペランドは、一方をレジスタで、もう一方を番地で表現します。
0アドレス指定方式〜3アドレス指定方式は、番地部がすべて番地なのですっきりしていますが、1+1/2アドレス指定方式は、番地部に”レジスタ”というものがあってちょっと奇異に感じるかもしれません。ところが、この命令形式が最もポピュラーな命令なのです。ところで、”レジスタ”とは何でしょうか。
これを説明し出すと本筋からどんどん離れていってしましますので、ここでは簡単に、”レジスタとは、CPUの中にある数バイトの領域を持った(記憶をつかさどる)装置”と覚えてください。レジスタは主記憶装置より圧倒的に記憶容量が小さいですが、その代わり、主記憶装置よりも高速に読み書きすることができます。
また、一口にレジスタと言っても沢山の種類があります。ただしここで”レジスタ”と言った場合は、汎用レジスタを指すものと思ってください。
汎用レジスタとは、プログラムの中から自由にその内容を参照・更新することができるレジスタで、GR0〜GR15(GRはGeneral Registerの略)まで16個あるのが一般的です。(注)何と、汎用レジスタを主記憶装置の一部に割り当てている特殊なコンピュータもあるのですが、ここでは無視します。
ここまでついてきていますか?(心配だなー)。たぶん初心者にとっては、ここら辺が最初の壁でしょう。でもこれが理解出来ると、後々楽できますよ。なんせ今説明しているところあたりは、コンピュータの動作の神髄のようなものですから。閑話休題
前に述べたように、1+1/2アドレス指定方式の命令が最もポピュラーな命令ですので、ここからの説明は、機械語の命令形式はすべてこの形式である、という前提で説明を行います(そうするとコンピュータの動作が理解しやすいので)。
さて、機械語の命令の番地部に表れるレジスタは汎用レジスタですので、命令形式を以下のように書き直しましょう。
命令部 GR× 番地 (注)×:0〜15
また、CPUがこれから実行しようとする命令は、命令部が加算命令(便宜的に16進数で20を加算命令とする),GRは1(16進数で01),番地は(16進数で)1000であるとします。すると機械語の命令は次のものとなります。
20 01 1000 この命令の意味は、「GR1の内容と(16進数で)1000番地の内容を加算して、それをGR1に設定せよ」というものです。
これまで命令の演算結果をどうするかについては触れませんでしたが、この例の加算命令では、演算結果を元のレジスタに書き直します。
この様子を以下の図に示します。
![]()
以上説明したように、一般の機械語の命令を実行すると、汎用レジスタの内容と主記憶装置上の内容とで演算を行います。そして、その演算は命令部で、その演算のオペランドは番地部(レジスタ番号と主記憶装置上の番地)で示されるのです。
ここまでが機械語の命令の構成についての説明です。もっと簡単に説明しようと思いましたが、少しくどかったかもしれませんね(反省)。
ということで、命令サイクルはまた来週にしましょう(実をいうと、機械語の命令の構成の説明がこんなに長くなると思わなかったので、慌ててタイトルだけを変更したのです。終わり方が唐突なのはそのせいです)。
ではまた。