計算機の構造と命令

  1. 計算機の構造

    1. 概論

       ここでは、計算機の構造と式の計算を実行する仕組みを説明します。条件付きの実行や繰り返し処理を行うプログラムの仕組みについては次回説明します。
    2. プログラム内臓方式(ノイマン型)

      一般的な計算機の構造は「プログラム内臓方式」で、下図のような構造です。「プログラム記憶」には「プログラム」が「データメモリ(記憶)」にはデータが記憶されます。「プログラム」は「命令」から構成され、「プログラム実行制御部」によって「実行」されます。通常、「プログラム記憶」と「データメモリ(記憶)」は同じメモリを使いますが、組み込み系のコンピュータでは、異なるメモリーが利用されます。

       「プログラム実行制御部」は「命令」の種類に応じて「演算部」や「周辺装置制御部」に処理を依頼します。また、実行に必要なデータを「データ記憶」から取り出し、実行結果を、「データ記憶」に保存します。「演算部」は整数や少数の算術計算やAND,OR などの論理演算を行います。ディスプレイ、鍵盤、などの入出力装置は 周辺装置 に含まれます。
       
    3. メモリと命令

       メモリ(主記憶)は記憶素子の集合で、アドレス(番地)によってアクセス(読み書き)するメモリの番地を指定します。一つの番地のメモリはバイト単位で構成され、小型の計算機では1バイト、少し高速の計算機では、4〜8バイトが同時に読み書きできます。C言語の変数や配列はデータメモリに記憶されます。
    4. フラッシュメモリ

       フラッシュメモリーは読み出し専用のメモリーの1種で不揮発メモリとも呼ばれます。通常のメモリは電源を切ると記憶内容が消えてしまいます。多くの計算機では、電源投入時にフラッシュメモリと呼ばれる、電源を切っても記憶内容が保持できるメモリを利用してハードディスクからプログラムを読み出し、実行を開始します。フラッシュメモリはUSBやディジタルカメラなどにも利用されています。
       組み込みコンピュータでは、プログラムはフラッシュメモリーに保存されます。
  2. 式の計算の仕組み

    1. レジスタ

       CPUの内部にはレジスタと呼ばれる高速な記憶素子があります。特殊な(重要な)レジスタは名前で参照されます。Wレジスタは演算部で中心的な役割を持ちます。命令を実行するためには、PS やIRと呼ばれるレジスタが使用されます。
    2. プログラムを連続実行する仕組み(ノイマン型コンピュータ)

       計算機がプログラムを連続実行する仕組みを考えます。プログラムはプログラム記憶に保存された 命令 の集まりです。プログラムを実行する仕組みの中心的な役割を果たすのは、実行する命令の番地を記憶する PS レジスタと命令の内容を記憶する IR レジスタ です。ここで、[PS] はレジスタ PS に記録された値を意味します。
       1.プログラムメモリーの [PS]番地の値を IR レジスタ に読み出す。
       2.IR に読み出した値に従い、命令を「実行」する
       3・[PS] を一つ増す
       4.1,2,3を繰り返す
       レジスタの値を一つ増すには、PS をカウンタ(計数器)として動作させることになります。命令を「実行」するには、IR レジスタの内容チェックし、そのビット構成から必要な処理を行います。[PS]を増しながら繰り返すことで、プログラムの命令を逐次実行することができます。
      このように、「記憶した命令を読みながら実行する方式」を一般にノイマン型あるいはプログラム内蔵型コンピュータと呼びます。計算機が、繰り返しや条件付き実行する仕組みは次回説明します。

  3. 演算プログラム

    1. 演算処理を行うプログラム

       ここでは、コンピュータが X = A + B * C といった式の計算を行う仕組みを紹介します。式の計算を行うには、式の計算を簡単な演算の組み合わせに分解する必要があります。
    2. レジスタと演算器

      下図 ALU(Arithmetic & Logic Unit)は演算器のモデルで、データ A と W の値を演算して結果を W レジスタに保存します。A の値は命令やメモリから取り出します。

       この回路を利用して、データを順に加えていく方法を考えて見ましょう。まず、ALUに 0 を出力するよう指定して、W を 0 にします。つぎに、A(ALUの左ポート) にデータ d0 を設定して ALU に加算指示を出すと、
        W = 0 + d0
      が W に記録されます。さらに、A にデータ d1 を設定して、再び、加算を行うと
        W + d1 ( d0 + d1) 
      が W に記録されます。どうように A にデータ d2,d3, .. ,dn を設定しながら加算を行うと、
       W = d0 + d1 + d2 + .. + dn
      がWに記録されます。このように、「Wの値と計算したい値を演算する」のが演算回路の仕組みになります。
    3. 演算命令

       レジスタ W の値を 10 にする操作を、
        LDI 10
      と書くことにします。データ d0 を指定し加算を行う操作を加算命令と呼び、この操作を
       ADI d0
      と書きます。すると、10 + 25 + 32 を計算するプログラムは次のように書くことができます。
        LDI 10
        ADI 25
        ADI 32
       LDI や ADI を 命令(Instruction)とよび、このように記号で命令を記述したプログラムを記号(アセンブリ)プログラムと呼びます。LDI や ADI 以外に引き算や論理演算を指定できるようにすれば、演算の範囲が広がります。ここでは、乗算を MLI 、減算を SUBI と表記します。
    4. 演習1

      値 d をレジスタWに掛け算する命令を MLI d と書くことにします。(13 - 5)*10 を計算するプログラムを書きなさい。
    5. メモリの参照命令とプログラム

       番地 a のメモリをWレジスタ読み出す命令を
         LDM a
      とかきます。また、Wレジスタの値をb番地に記録する命令を
         STM b
      とかきます。この二つの命令を組み合わせると C言語の b = a が実行できます。W に a 番地の値を加える(減算する)命令と掛け算(割り算)をする命令を
         ADM a ,SBM a(減算)
         MLM a ,DVM a (除算)
      とかきます。
       ( 5 + [6] ) * [7]
      を計算し結果を8番地に保存するプログラムは以下のようになります。ここで、[6]は6番地の内容とします。これはC言語では  [8] = (5 + [6] ) * [7] に相当し、 [6],[7],[8] はC言語の変数 に対応します。
        LDI 5  //W = 5
        ADM 6  //W = W + [6]
        MLM 7  //W = W * [7]
        STM 8  //[8] = W

    6. 演算の優先順位

       式の演算には優先順位がありますから、式を単純な演算に分解するには演算の順番に注意をする必要があります。 [8] = [7] * (5 + [6] ) を計算する場合は、先頭からでなく、演算する順番を入れ替える必要があります。また、次のような、より複雑な計算では、中間の演算結果を一度適当な番地に保存する必要があります。
       [8] = (5 + [6])* ([7] +12)
       LDI 5
       ADM 6
       STM 9 //[9]<-5+[6]
       LDM 7
       ADI 12
       MLM 9 //中間結果に掛け算
       STM 8
    7. 演習2

       y = a * x * x + b * x + c
      を計算するプログラムを書きなさい。a,b,c は定数で、x ,yは変数で [10]、[11] 番地を利用する
      ヒント (a * x + b) * x + c と計算する。6命令で実行できます。
  4. プログラムの実行


    1. 機械語命令

       プログラムの各命令を0と1に変換してプログラム記憶に保存します。たとえば、LDM 命令を3ビットで 100、番地や定数を5ビットで表しますと、LDM 5 の命令は 100 00101 となります。このように 0と1で計算機の動作を指定した形式を「機械語命令」といいます。「機械語命令」を組み合わせたものが機械語プログラムになります。
    2. コンパイラ

       機械語でプログラムを作成するのは大変面倒です。そこで、C言語のようなプログラミング言語でプログラムを書き、コンパイラと呼ばれるプログラムで、それを機械語に変換する方式が実用化されました。
       VisualStudioでコンパイルすると、プロジェクトフォルダの直下にDebugフォルダが作成され、そこに、<プロジェクト名>.exe ファイルが作成されます。これが機械語プログラムのファイルでこれをダブルクリックするとプログラムを実行することができます。ただし、実行するには実行時に必要ならライブラリファイル(xx.DLL:後述)が必要です。
  5. まとめ

     CPUは記憶されたプログラムを逐次実行する。
     メモリとWレジスタを用いて計算する「演算命令」がある。
     式の演算順序を考慮して、プログラムをする必要がある
  6. 課題

    1. 演習

      ■ フラッシュメモリーの特徴と役割を説明しなさい。

      ■ノイマン型コンピュータの構造をわかりやすく説明しなさい。

    2. 小テスト

      ■CPUに含まれないものはどれか
       1 演算回路  2.プログラム実行制御  3.ハードディスク
      ■次のプログラムで8番地に記憶される値はどれか
        LDI 4 
        ADI 6 
        MLI 3 
        STM 8
       1.30  2. 22  3. 27  4. 13
      ■ノイマン型計算機の特徴はどれか
       1. 高速に実行できる  2.計算ができる  3.プログラムで処理内容が変化する
    3. 課題

      ■次の計算を行う記号プログラムを作成しなさい。[20]= は結果を20番地に保存する意味です。この処理は通常コンパイラが行う作業になります。
      [20]= 23 * [12] + 8
      [20]= (23 +[8])* (12 + [8]) 
      [26] = [23] * [24]*[24] + [25]*[24]+[25]
      ■コンピュータが命令を逐次実行する仕組みを自分の言葉で説明しなさい。