法政大学国際文化学部

情報システム概論

担当 重定 如彦

20091020

 

5回 ハードウェア(その3)

1.      CPU制御の流れの例

それでは、具体的に例をあげて、CPUがどのように計算を行うかを見てみましょう。この例では、メモリの(2000)16番地から以下のようなプログラムが機械語で格納されておりそれを実行した場合CPUの中でどのような動作が行われるかを詳しく述べます。

 

1.         (2000)16:メモリの(4000)16番地の内容を汎用レジスタ1に読み込む。

2.         (2001)16:メモリの(4001)16番地の内容を汎用レジスタ2に読み込む。

3.         (2002)16:汎用レジスタ1と汎用レジスタ2の中身を加算し、結果を汎用レジ
        スタ3に格納する。

4.         (2003)16:汎用レジスタ3の内容をメモリの(4002)16番地に書き込む。

 

上記のプログラムを実行すると、メモリの(4000)16番地の内容とメモリの(4001)16番地の内容が加算され、メモリの(4002)16番地に書き込まれます。

前準備として、あらかじめメモリの(4000)16番地に数字の1、(4001)16番地には数字の2、プログラムカウンタにはこれから実行するプログラムが格納されているメモリの先頭の番地である(2000)16を格納されているものとします。従ってプログラムの実行前では、それぞれのレジスタやメモリの内容は以下のようになっています。

なお、PCはプログラムカウンタ、GR1〜GR3は汎用レジスタ1〜汎用レジスタ3を表し、?は値が設定されていないため内容が不明であることを表します。また、表の中の数値はすべて16進数です。

 

レジスタ

 

メモリ

PC

GR1

GR2

GR3

 

4000

4001

4002

2000

 

 

参考までにCPUの図を次のページに再掲します。

1.         PCの指すメモリの内容を読み込み、命令レジスタに格納する。具体的にはまずPCの内容をアドレスバスを経由してアドレス選択部に送り、これから実行する機械語の命令が格納されたメモリのアドレスの番地を指定します。そして、同時にメモリの制御部のR/W信号に読み込み信号を送ることで、メモリから(2000)16番地の内容が読み出だされ、その内容がデータバスを通って命令レジスタに格納されます。

2.         命令レジスタの内容をデコーダに送り、(2000)16番地の命令の内容を解読する。

3.         命令の内容は「メモリの(4000)16番地の内容を汎用レジスタ1に読み込む」なので、メモリの(4000)16番地の内容を読み込んでGR1に格納する。読み込む具体的な手順については1と同様です。

4.         命令の実行が終了したので、PCの内容を1加算する。この結果レジスタとメモリの内容は以下のように変化します(変更された部分は灰色でぬりつぶされています)。

レジスタ

 

メモリ

PC

GR1

GR2

GR3

 

4000

4001

4002

2001

 

5.         上記の1〜4の作業を再び行い、メモリの(2001)16番地に記述されていた、「メモリの(4001)16番地の内容を汎用レジスタ2に読み込む」を実行する。

レジスタ

 

メモリ

PC

GR1

GR2

GR3

 

4000

4001

4002

2002

?

 

6.         次に、(2002)16番地の「汎用レジスタ1と汎用レジスタ2の中身を加算し、結果を汎用レジスタ3に格納する」を実行する。この時、GR1とGR2の内容がデータバスを通り算術演算回路に渡される。演算回路は合計の演算を行い、その出力結果をGR3に格納する。

レジスタ

 

メモリ

PC

GR1

GR2

GR3

 

4000

4001

4002

2003

 

7.         最後に(2003)16番地の「汎用レジスタ3の内容を(4002)16番地に書き込む」が実行され、(4002)16番地に1+2の演算結果である3が格納される。

レジスタ

 

メモリ

PC

GR1

GR2

GR3

 

4000

4001

4002

2004

 

上記の例は非常に小さなプログラムの実行例でしたが、大きなプログラムでもこの手順は変わらず、こうしたことの繰り返しでCPUはプログラムを実行します。

2.      演算回路の仕組み

CPUの具体的な制御の流れは大体上記のとおりですが、次に具体的な演算を行う演算回路がどうやって計算を行っているかについて説明します。

·           論理演算

演算回路の説明をおこなう前に、演算回路で使われる論理演算について説明します。論理演算は1つまたは、2つの1ビットの数字の演算で、AND、OR、NOTの3種類の演算があります。ANDは2つの1ビットの数字が共に1であった場合のみ1を計算結果として返すという演算で、日本語でいえば、「かつ」に相当します。2つの1ビットの数字の組み合わせは4通りあるので、

   0 AND 0 = 0
    0 AND 1 = 0
    1 AND 0 = 0
    1 AND 1 = 1

となります。これを表にまとめると以下のようになります。

AND演算

ORは2つの1ビットの数字のどちらか片方が1の場合1を返すという演算です。日本語でいうと「又は」になり、表になおすと以下のようになります。

OR演算

NOTはANDとORとは異なり一つの1ビットの数字を反転、すなわち1を0に、0を1にする演算です。

      NOT 0 = 1

      NOT 1 = 0

ここまでは、1ビットの数字の論理演算を説明しましたが、複数ビットの数字の論理演算も可能です。複数ビットの場合、それぞれの桁ごとに演算をおこないます。2進数以外の数の論理演算をおこなう場合は、一旦2進数になおしてから計算する必要がある点に注意して下さい。なお、ANDやORの演算で片方の数字の桁の数が少ない場合は足りない部分に0をおぎなって計算します。また、NOTの場合は何桁で計算するかをあらかじめ決めておく必要があります。

例1: (10011) AND (1110) を演算する場合、以下のように縦に数字を並べ、それぞれの桁をAND演算すればよい。

        (10011)

   AND  (01110)

   答えは  (00010)

例2: 10進数の9を8桁の2進数でNOT演算するには、まず9を一旦8桁の2進数になおしてから演算します。9を8桁の2進数に直すと(00001001) になり、この各ビットの数字を反転すれば良いので答えは (11110110) です。

·           課題1
以下の論理演算を行い、答えを2進数で示せ。

Ø  (11011) OR (1101)

Ø  NOT 109     (ただし、109は10進数。答えは2進数8桁で)

Ø  (6C)16 AND (D9)16

·           論理回路
 上記のAND、OR、NOTは、電気回路になおすことが出来ます。例えばAND回路はリレーを使って以下のように作成することが出来ます。

上記の回路では電球にランプを点灯させるには、内側の2つのスイッチを両方ともONにする必要がありますが、これはまさに、両方とも1(スイッチがON)の場合だけ1(電球が点灯する)を返すというAND回路を表します。同様の方法で、OR回路やNOT回路を作ることができます。

なお、実際の論理回路はリレーではなく、高速な電子回路を使って作られていますが、原理はリレー回路と同じです。

·           1桁の2進数の加算回路
それでは、実際も上記のAND、OR、NOTの論理演算回路をどのように組み合わせれば、演算を行う電子回路で作成できるかの例を1桁の2進数の足し算をおこなう回路で説明します。1ビットの足し算は以下の4通りに場合わけできます。なお、下の式で()は省略します
 
0+0=00  0+1=01  1+0=01  1+1=10

これを桁ごとに表になおすと以下のようになります。

2の位の答え

 

1の位の答え

 

 

ここで、2の位の答えをよくみると、ANDの表と全く同じであることがわかります。従って、1ビットの数字の足し算の2の位の答えは、AND回路を一つ使った回路で答えを求める回路を作成できることがわかります。 

一方1の位ですが、こちらはそれほど単純ではありませんが、計算する数をそれぞれA,Bとすると 

(NOT(A AND B)) AND (A OR B)

という論理演算で答えを表すことができます。この式の求め方はこの授業の範囲外なので説明しませんが、この式で1の位の答えが求められることを確かめてみましょう。式の左の部分の (NOT(A AND B)) の部分は、 A AND B をNOT演算によって1と0を反転させたものなので表になおすと、

NOT(A AND B)

 となります。この表に A OR B の各値を AND 演算すればよいので、結果として以下のように正しく計算できていることがわかります。

NOT(A AND B)

 

A OR B

 

1の位の答え

AND

 

 

 

これを回路図になおすと以下のようになります。一桁の足し算をおこなうためにずいぶん複雑な回路が必要だと思うかもしれませんが、実際の複数桁の計算を行うなどの演算回路はこれをもっと複雑にしたもので、コンピュータの演算回路のほとんどはこの3種類の論理演算回路の組み合わせによって作られているのです。

この回路の動作例として、この回路で1+0を計算した場合の動作を手順を追って説明します。1+0を計算するにはまず、Aに電流を流し(=1)、Bに電流をながさない(=0)状態にします。この後はa〜kの値を順番に見ていくことで、この回路の出力結果であるjとkを求めることができます。

1.         まず、Aとa、c、eは直接繋がっているので、aとcとeの値は1に、Bとb、d、fも直接繋がっているのでbとdとfの値は0になります。

2.         j = a AND b = 1 AND 0 なので jの値は0になります。

3.         g = c AND d = 1 AND 0 なので gの値は0になります。

4.         h = NOT g = NOT 0 なので hの値は1になります。

5.         i = e OR f = 1 OR 0 なので iの値は1になります。

6.         k = h AND i = 1 AND 1 なので kの値は1になります。

上記の結果から、j=0、k=1 となり、 0+1=01 とこの回路が正しい答えを出していることがわかります。

 

·         課題2

A=1、B=1の場合、上記の回路のaからkの値が何になるかを計算し、それぞれの値を述べよ。また、A+Bの計算結果がいくつになるかを答えよ。

 

·         その他の論理演算

論理演算には実はANDORNOT以外にもいくつか種類があります。例えばビットシフトという論理演算は、数字の各ビットを一つ左(又は右)にずらす論理演算です。左にずらした場合、一番左の桁は捨てられ、一番右の桁には0が代入されます。

比較演算は、2つの数字の大小を比べる論理演算です。CPUの比較演算回路では、比較した結果を2ビットのフラグレジスタに格納します。フラグレジスタの片方のビットは比較結果が等しかった場合に1になり、もう片方のビットは比較した結果前者の数字のほうが大きければ1になります。下にABの数字を比較回路で演算した結果のフラグレジスタの内容を表にまとめます。

 

フラグレジスタ

上位ビット

下位ビット

A>B

A=B

A<B

 

3.      機械語とアセンブラ言語

ここまでの授業で、CPUが機械語と呼ばれる言語によって記述されたプログラムによって動いていると説明しました。次はこの機械語についてより具体的に説明します。

機械語の命令は前回の授業で述べたように、一つ一つの命令が数字で表現されますが、この数字と命令の対応を人間が覚えるのは非常に大変です。また、例え覚えられたとしても、その数字を人間が一つ一つ並べてプログラムを作ることは非常に大変です。

そこで、実際の機械語のプログラミングでは、アセンブラ言語と呼ばれる、機械語の命令を数字ではなくアルファベットで表現するという、機械語よりも人間が扱いやすい言語を使って行います。アセンブラ言語は機械語の命令の種類を表す「命令コード(又はオプコード)」と、命令の操作の対象となるデータを表わす「オペランド」の2種類の文字列で機械語の命令を表現します。例えば、足し算を行う機械語命令の命令コードを「ADD」、汎用レジスタのオペランドを「GR(general registerの頭文字)」と表現する場合、

   ADD GR, 2000

と記述することで汎用レジスタの値にメモリの2000番地の内容を足すという機械語の命令を表現することができます。機械語命令はそれぞれ記述するオペランドの数が決まっており、その数をとって「○オペランド命令」(○には必要なオペランドの数が入ります)または「○アドレス命令」と呼びます。例えばADD命令は2つのオペランドで指定された数を加算する命令なので2オペランド命令です。一般的なアセンブラ言語には0オペランド命令、1オペランド命令、2オペランド命令、3オペランド命令があります。

アセンブラ言語で記述されたプログラムはそのままでは実行できず、翻訳プログラムによって機械語に翻訳されてはじめて実行することができます。この翻訳の操作のことを
アセンブルと呼びます。アセンブラ言語で記述された命令と実際の機械語の命令は1対1に対応しており、アセンブルを行うプログラムは、アセンブラ言語で記述されたプログラムの行を一つ一つ対応する機械語に直すという作業を行います。

ポイント

·           コンピュータ(CPU)は機械語しか理解できない。

·           しかし人間が機械語でプログラムを書くのは非常に大変。

·           機械語の命令と1対1に対応する、人間が扱いやすいアセンブラという言語が作られ、人間はアセンブラ言語でプログラムを記述する。

·           アセンブラ言語で記述したプログラムは別の翻訳プログラムでアセンブルされ、CPUが理解できる機械語に翻訳される。

·           実際に実行されるのは、アセンブルされて作られた機械語の命令である。

機械語のプログラムの作成、実行の手順

(注:右の図の機械語の数値(16進数)は適当な値で、実際のものとは異なります)

 

 

4.      CASLとCOMET

機械語とアセンブラ言語はコンピュータのCPUの種類によって異なります。授業ではアセンブラ言語の勉強を目的として作られたCOMETという仮想的なCPUと、COMETのアセンブラ言語であるCASLについて解説します。COMETは機械語の学習に必要とされる基本的な機械語命令を備えおり、COMETのアセンブラ言語であるCASLは実際の情報処理技術者試験で出題されるアセンブラ言語の一つとして採用されていました(現在ではバージョンアップしたCOMETUが使われているようです)。

実際のCOMETを搭載したCPUを一人一人用意することはできませんので、授業ではWindows上で動作するCOMETの動作をシミュレートする「COMETシミュレータ」と、CASLで記述されたアセンブリ言語をCOMETの機械語に翻訳する「CASLエディタ/アセンブラ」というアプリケーションを使用します。

5.      COMETの仕様

アセンブラ言語の解説を行う前に、COMETのCPUの仕様について説明します。

·           メモリ

COMETのメモリのアドレス空間(アドレスの番地の範囲のこと)は16ビットであり、16進数で(0000)16〜(FFFF)16、10進数で0〜65535で表されます。また、一つのアドレスには16ビットのデータを格納することができます。

·           レジスタ

機械語のプログラムで制御することのできるレジスタには、汎用レジスタ、プログラムカウンタ、フラグレジスタがあります。汎用レジスタは16ビットのデータを格納できるレジスタが5つ用意されており、それぞれGR0〜GR4と表現します。プログラムカウンタはメモリのアドレスを表す16ビットのデータを格納できるレジスタでPCと表現します。フラグレジスタは演算の結果を表す2ビットのデータを格納できるレジスタでFRflag register)と表現します。

表記

名前

ビット数

意味

GR0〜GR5

汎用レジスタ

16

任意の用途に使用可能なレジスタ

PC

プログラムカウンタ

16

次に実行する機械語の命令のメモリのアドレスを指すレジスタ

FR

フラグレジスタ

演算の結果を表すレジスタ

 

 

演算結果

負の値

正の値

FRの値

(10)

(01)

(00)

·           数値

COMETが扱う数値は一番左のビットが符号を表す16ビットの固定小数点数であり、負の数は2の補数で表現されます。2の補数とは以下の方法で負の数を表す方法のことです。

Ø  数の絶対値(符号をとりはらったもの)を計算しそれを16ビットの2進数に直す。

Ø  各ビットの数字を反転させる。

Ø  1を加える。

例えば −100 を16ビットの2の補数で表すには、まず−100の絶対値である100を2進数になおします。  100=(0000000001100100)

次に、この各ビットを反転させると   (1111111110011011)

最後にこれに1を足すと        (1111111110011100)

となり、これが−100を16ビットの2の補数で表現した値です。

 

2の補数が使われる理由は2つあり、一つは負の数をビットを反転させて表したほうが演算回路を作りやすいからです。もう一つはビットを反転させただけでは0を

  (0000000000000000)  

  (1111111111111111)

の2種類の方法で表すことができてしまいます。同じ数字を2種類の方法で表現することは、なにかと不都合がおきるのでそれを避けるために最後に1を足します。なお、2の補数で表現された負の数の絶対値を求める(正に直す)には全く同じ作業を行えばOKです。

最後の「1を加える」という作業を行わないものを「1の補数」と呼びます。

·           制御方式

COMETでは、一つの機械語命令が32ビット(メモリのアドレス2つ分)で表現され、プログラムは逐次方式(機械語の命令を記述されているアドレスの番地の順に実行する方式のこと)で実行されます。従って一つの機械語命令が実行されるとPCに1ではなく、2が加算されます。機械語の命令の種類については、次回の授業で説明します。

6.      前回の課題の答え

(9ABC)16番地を2進数に直すと以下のようになります。
 
(1001101010111100)


 

  それぞれ16進数の   9   A   B   C   に対応する。
 

従ってアドレスバスには以下のような信号を流します。

 

A0

A1

A2

A3

A4

A5

A6

A7

A8

A9

A10

A11

A12

A13

A14

A15

 

(6E)162進数に直すと以下のようになります。
 
(01101110)
 

      それぞれ16進数の   6   E   に対応する。
 

従ってデータバスには以下のような信号を流します。

 

D0

D1

D2

D3

D4

D5

D6

D7

この問題ではデータを書き込むので R/W 信号には「書き込み」を表す「0」を送ります。

また、書き込みまたは読み込み時にはCE信号には「1」を送ります。

 

7.      課題

このプリントの課題1と2を行い課題のメールとして提出して下さい。

締め切りは来週の授業までです。

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

課題のメールは masaki.yamashita.67@gs-art.hosei.ac.jp までお願いします。

質問のメールなどは、sigesada@.hosei.ac.jpまでお願いします。

授業の資料の最新版はhttp://www.edu.i.hosei.ac.jp/~sigesada/にあります。