COMET II
のレジスター山本昌志∗
2004
年5
月24
日1
これまでの復習と本日の内容1.1
これまでの復習コンピューターを構成する最も重要な要素は、
• Central Processing Unit (CPU:中央処理装置)
• メイン メモリー(main memory:主記憶装置)。単にメモリーと呼ぶことも多い。
です。これまでは、メイン メモリーの中でのデータ(数値、文字)の格納方法を学習しました。次のような ことを理解しなくてはなりません。
• COMET IIでは、16ビットを1ワード (1語)と言い、この単位でデータの処理を行います。
• メモリーには、1ワード 毎にアドレスがついています。
• 数値も16ビットで表現します。符号付整数の場合は、それで表すことができる範囲は、以下の通り です。
– 正の数の絶対値の最大値は、(0111 1111 1111 1111)2 = (215-1)10=(32767)10
– 負の数の絶対値の最大値は、(1000 0000 0000 0000)2です。これは第15ビットが1なので負の 数で、2の補数表示です。したがって、その絶対値を求めるためには、ビット反転を行い、1を 加算すればよい。したがってこれは、-(215)10=-(32768)10を表します。
• 符号無整数の場合は、以下の通りです。
– 表現可能な最小値は、(0000 0000 0000 0000)2 = (0)10です。
– 表現可能な最大値は、(1111 1111 1111 1111)2 = (216-1)10=(65535)10です。
• 数値と異なり、文字にはそれぞれ、番号をつけて区別します。文字とそれに対応する番号は、規格JIS X0201ラテン文字・片仮名用8単位符号で決まっています。
• この番号は、8ビットなので、最大256文字しか使えません。数字とアルファベットと片仮名と記号 を表すのであれば十分です。漢字は、使えません。
• COMET IIの1ワード16ビットに対して、文字は8ビットしか使いません。COMET IIでは1ワー ド で1文字を表すため、16ビットのうち上位8ビットは0として、下位8ビットで1文字分を表し ます。例えば 、アルファベットのYamaを表す場合、Yは(59)16、aは(61)16、mは(6D)16、という 番号がついているので、COMETのメモリーには、次のように格納されます。ただし 、アドレスの実 際の割り当ては、OSが決めます。
図1: 文字列”Yama”のメモリーへの格納
• 数値と文字では、メモリーの中身は異なります。例えば 、数値の(9)10と文字の”9”は、以下のように なります。文字の”9”は、JIS X0201では、(39)16です。
図2: 数値の(9)10と文字”9”のメモリーへの格納
• メモリーの中身を見ると、それが数値なのか文字なのか、判断できません。命令毎に数値を扱うのか、
文字を扱うのか決まっています。以降の、学習で分かるでしょう。
1.2
本日の内容本日は、レジスタについて学習します。これは、CPU内のデータの記憶する場所と考えてください。教
科書のP.15〜P.20の指標レジスタの前までです。ここまでを中間テストの範囲とします。
2
レジスタとは何か2.1
レジスタとは何かレジスタを一言で言うと、CPU内の記憶装置みたいなものです。メモリーと同じで、いろいろなデータを 記憶させます。メモリとレジスタの違いは、どこにあるのでしょうか?。以下のような違いを列挙できます。
• レジスタはCPU内部にあり、データを加工するために一時的に、記憶させる。また、加工結果も記 憶する。
• メモリに比べて、レジスタの記憶領域は小さい。COMET IIの場合、メモリーのアドレス数は65536 個あるに対して、レジスタは20〜30個程度です。
• メモリは番地を指定して目的のデータにアクセスする。一方、レジスタは名前を指定して 、目的の データにアクセスする。
• 現実の装置の場合、CPUのデータのアクセススピードは、レジスタの方がはるかに早い(C言語では レジスタを使ったプログラムができる)。
2.2
コンピューターはどのようにプログラムを実行するかコンピューターのプログラムは、データと命令から構成されます。この命令とデータは、実行時に主記憶
装置(メイン メモリ)に格納されます。この格納の動作をロード と言います。これらのプログラムは、CPU
内部のレジスタに読み込まれ、処理されます。実際のコンピューターでのプログラムの動作順序は、次の通 りです。
1. 補助記憶装置(ハードデ ィスク等)からプログラムが メイン メモリーにロード されます。この指令は、
Operating System(OS)が出します。
2. メイン メモリーに格納されたプログラムの指示に従い、CPUが動作します。その動作は、
(a) CPUがメインメモリーから命令を取り出します。命令を取り出すアドレスは、CPUのプログラ
ムレジスタに書かれています。
(b) 取り出した命令は、CPU内の命令デコーダーにより、命令の内容を解析されます。
(c) 解析された命令は、論理演算装置(ALU:arithematic logic unit)により、演算が実行されます。
(d) 演算結果は、各種のレジスターに格納されます。
(e) プログラムレジスタの値を再設定します。
(f) 以上の動作をプログラム終了まで繰り返します。
です。
このプログラムの実行方法からも、CPUの中にもデータを記憶する場所が必要と理解できるでしょう。そ
使えば良いのでは 、と考える人も居るかもしれません。たぶんそれでもコンピューターはできるでしょう が 、今よりも複雑になると思います。また、CPUとメモリーのデータの交換が増えて、動作が遅くなるで しょう。
CPUと主記憶装置は、図3のような関係です。CPUは主記憶装置のアドレスを指定することにより、主 記憶装置に格納されているデータを引き出します。そして、それはレジスタに記憶され 、その中身に従い、
処理されます。処理された結果ももちろん、レジスタに記憶されます。レジスタの中身を主記憶装置に戻す ことにより、データの加工が完了します。
レジスタもデータなどを蓄えるので、メインメモリー同様、記憶装置の一種です。しかし 、それぞれ、役 割が異なります。
• 主記憶装置
– CPUとは独立です。
– プログラムを格納します。
– データも格納します。
• レジスタ
– CPUの構成部品のひとつです。
– 演算の対象や演算結果を格納します。
– 主記憶装置のアドレスを格納するレジスタもあります。
要するに主記憶装置は、いろいろなデータ(命令もデータの一種と考える)を蓄えるファイルキャビネット のようなものです。一方、レジスタは、実際にCPUがデータを加工するときに一時的に記憶する場所と考 えてください。
C言語やFORTRANのプログラムでは、主記憶装置のデータを加工して、書き換えているように思いま
すが 、実際は、それらを加工する場合、レジスタが一時的にデータを記憶し 、それをCPUが加工して、主 記憶装置に戻しています。
3 COMET II
のレジスタ図3のうち、プログラマが注意を払うべきものは、
• 主記憶装置
• レジスタ
です。今後アセンブラでプログラムを書いてみると分かりますが、制御装置や演算装置について、あまり注 意を払う必要はありません。COMET IIのレジスタを表1にまとめておきます。以降、それぞれのレジス タについて、説明します。
主記憶装置
図3: CPUと主記憶装置の関係
表1: CASL IIのレジスタ
記号 語源 日本語 機能
GR General Register 汎用レジスタ 計算等に用いる。またGR1〜GR7は指
標レジスタとしても使われる。
SP Stack Pointer スタックポインタ スタック領域の最上段のアドレスを保持
する。
PR Program Register プログラムレジスタ 次に実行する命令のアドレスを保持する
FR Flag Register フラグレジスタ 演算結果の状態を保持する
3.1
汎用レジスタこれは、算術や論理、比較、シフト演算を実行するときに使います。GR0〜GR7までの8個用意されて います。あとは、教科書の通りです。
• 汎用レジスタは、8個用意されています。
• 汎用レジスタは、16ビットです。メイン メモリーのデータのビット数とおなじです。
3.2
プログラムレジスタプログラムカウンターと呼ばれることもあります。このレジスタの値は、プルグラムが次に実行する命令 語の先頭番地です。したがって、
• 必要なプログラムレジスタは、1個です。
• プログラムレジスタは、16ビットです。アドレスのビット数と同じ 。 となります。
プログラムを事前に主記憶装置に格納して、プログラムレジスタPRの値によって、プログラムを構成す る命令を1つずつ取り出して、処理を行います。このような方式を逐次制御方式と言ったり、プログラム内 蔵方式(stored program)と言ったりします。
3.3
フラグレジスタFlag Regisuterのフラグとは、旗のことです。サッカーの試合で、プレーの状態により旗を上げます。あ れと同じです。コンピューターでは演算の結果により旗を上げます。
COMET IIには、1ビットのレジスタが3個あります。演算結果によって、それらのレジスタの値がセッ
トされます。セットされる内容は、教科書P.18の表2.4の通りです。主に、このレジスタは、実行順序を 変更、分岐命令に使われます。
• フラグレジスタは、3個あります。それで、計算結果の状態を表します。
• 各レジスタは、旗の上げ下げなので、1ビットです。
あとは教科書の説明通り。
3.4
スタックポインタメインメモリーの一部をCPUが専用の記憶領域として使います。そのときのメインメモリーのアドレス を示します。したがって、
• 必要なプログラムレジスタは、1個です。
• プログラムレジスタは、16ビットです。アドレスのビット数と同じ 。 となります。
これは、ここでは少し早すぎますので、実際に使うときに説明します。
3.5
指標レジスタ(index register)
これは、特殊なレジスタで、ハード ウェアーは汎用レジスタが兼ねます。汎用レジスタのうちGR1〜GR7 をつかいます。GR0を使わない理由、これはマシン語との関係で、後の授業で述べます。
• 指標レジスタは、汎用レジスタの7個が使えます。
• 指標レジスタは、16ビットです。メイン メモリーのデータのビット数と同じです。
教科書の図2.5の表現は分かりにくいので、具体例でその動作を示します。例えばクラス40人分の数学 と英語と電子計算機のテストの点が 、メモリに格納されており、それぞれの平均点を求めたい場合、指標 レジスタを使うと便利です。このプログラムでは、それぞれの教科のクラスの合計点を計算するところが 、 重要です。指標レジスタを使う場合と使わない場合のフローチャートを図4に示します。
指標レジスタを使わないと、プログラムが大変でしょう。このように、指標レジスタを使うことにより、
基準点からのアドレスを加算してそのデータにアクセスできます。このように、アドレスを操作することを アドレス修飾と言います。
実は、皆さんは、これと同じプログラムテクニックをFORTRANの授業で学んだはずです。FORTRAN の配列と同じです。FORTRANでは分かりにくいのですが 、C言語の配列はまさにこれと同じことを行っ
ています(実感できます)。
"!#$%'&()*,+-
.0/132
, "!#$%&3(4'-
.5/61
2
図4: 指標レジスタを使った場合と使わない場合のプログラム。クラスの数学のテストの合計点を計算して いる。GR1を指標レジスタとして使っている。