Web教材一覧ハードウェアとソフトウェア

アドレス指定方式

学習のポイント

CPUが命令を実行するには、命令の対象となるデータをメモリから演算装置へもってくる必要があります。それには、メモリ上でのデータの格納場所(アドレス)を指定する必要がありますが、ここではその方式について学習します。

キーワード

CPU、レジスタ、アドレス指定方式、直接アドレス指定、間接アドレス指定、ベースアドレス指定、インデックスアドレス指定、再配置可能


CPU命令(機械語)は、命令部とアドレス部から構成されます。
 アドレス部は命令の対象となるデータが存在する主記憶(メモリ)の存在場所(アドレス)を示しています。
 アドレス部のアドレスが直接にメモリアドレスを示していることもありますが、CPU内部にある各種のレジスタおよび主記憶上のアドレスを関連づけて、データのアドレスを指定する(アドレス修飾という)場合が多いのです。この場合、データが存在する実際のメモリアドレスを有効アドレスあるいは実効番地といいます。
 アドレス指定方式とは、有効アドレスを指定する方式のことです。

アドレス指定方式には、各種のレジスタおよび主記憶上のアドレスの関連で、多様な方法があります。実際には、CPUによりどの方式が利用可能かが異なります。また、複数の方式を組み合わせることもあります。
 なお、機械語やアセンブラでプログラミングする場合は、プログラマがアドレス指定を記述する必要がありますが、高級言語によるプログラミングでは、プログラマがそれを意識することはありません。

レジスタの種類

プログラムカウンタ(プログラムレジスタ)
次に実行される(フェッチされる)命令が格納されているメモリのアドレスが入っています。
このアドレスを用いることにより、用いるデータの有効アドレスを、命令のアドレスとの変位で指定することができます。
ベースレジスタ
ベースとなる値を保持しているレジスタです。通常は、ベース値としてプログラムの先頭アドレスを設定しておきます。
インデックスレジスタ
例えば、データが配列などで、等間隔のアドレスに格納されている場合、その間隔値を格納するのに使われます。命令のアドレス部で配列の先頭のアドレスを指定すれば、インデクスレジスタの値を加えることにより、次の要素のアドレスを得ることができます。
通常は、汎用レジスタをインデックスレジスタとして用います。
汎用レジスタ
特定の機能に限定せず、多目的に使用されるレジスタです。アキュムレータとして演算に用いられるだけでなく、インデックスレジスタやベースレジスタとして用いられることもあります。
その他のレジスタ
その他、CPUのレジスタには、
   命令レジスタ:メモリからフェッチされた命令を格納
   アキュムレータ:演算結果を一時的に格納
   フラグレジスタ:演算結果の値である、正、0、負などを格納
などがありますが、アドレス修飾には関係が少ないので省略します。

アドレス指定方式

アドレス指定方式を体系的に示すと、次のようになります。
   即値アドレス指定:アドレス部にアドレスではなく、データの値そのものをもつ
   アドレス指定方式:アドレス部にアドレスをもつ
      直接(絶対)アドレス指定:アドレス部に有効アドレスをもつ
              特徴:アドレス部のビット数によりメモリ容量に限界
      間接アドレス指定:有効アドレスが入っているメモリのアドレスを指定
              特徴:メモリを2回アクセス
      修飾アドレス指定:有効アドレス=アドレス部の値+指定レジスタの値
         ベース(基底)アドレス指定:ベースレジスタの値を加算
              特徴:プログラムの再配置可能
         (自己)相対アドレス指定:プログラムカウンタの値を加算
              特徴:ベースアドレス指定とほぼ同じ
         インデックス(指標)アドレス指定:インデクスレジスタの値を加算
              特徴:連続データに同一命令を行うのに利用

即値アドレス指定
命令部のアドレスの値がアドレスとしてではなく、そのまま「演算データの値」として入っている方式です。
命令のアドレス部が処理対象データである。メモリを参照しないため演算処理は高速になりますが、このような方式にするには、サイズの大きいデータは扱えないなど、多様な限界があります。

   ┏━━┳━━━┓
   ┃命令┃777┃→データの値が777
   ┗━━┻━━━┛

直接(絶対)アドレス指定
アドレス部に入っている値がそのまま有効アドレスとなる形式です。
最も単純なアドレス指定方式ですが、
   アドレス部のビット数で、最大アドレスが決まってしまい、メモリの容量が制限される
     (26ビットの場合、64MBまで)
   プログラムをロードしたときの先頭番地が変わるとデータの番地も変わるので使えない
など、現実には使いにくい方式です。

      アドレス部
   ┏━━┳━━━┓
   ┃命令┃ 1000 ┃このビット数で最大アドレスが決まる
   ┗━━┻━━━┛     メモリ
        │     ┏━━━━━┓
        │    0┃     ┃
        │     ┣━━━━━┫
        │    1┃     ┃
        │     ┣━━━━━┫
        │     :     :
        │ 1000┣━━━━━┫
  有効アドレス└────→┃ データ ┃
              ┣━━━━━┫
              :     :

間接アドレス指定
アドレス部で指定したデータが、データそのものではなく、実際のデータが入っているアドレスが入っているという方式です。いいかえれば、アドレス部で指定したアドレス上のメモリにあるデータが間接的に有効アドレスとして利用されます。
ビット数が大きくとれるメモリでアドレスを指定するので、直接アドレス方式に比べて大容量メモリに対応できる利点がありますが、メモリを2回以上アクセスするため、実行速度が遅い欠点があります。

      アドレス部
   ┏━━┳━━━┓
   ┃命令┃ 1000 ┃
   ┗━━┻━━━┛     メモリ
        │     ┏━━━━━┓
        │    0┃     ┃
        │     ┣━━━━━┫
        │    1┃     ┃
        │     ┣━━━━━┫
        │     :     :
        │ 1000┣━━━━━┫
        └────→┃  1030  ┃─┐このビット数で最大アドレスが決まる
    アドレスが入っている┣━━━━━┫ │
              :     : │2回メモリにアクセスする
              ┣━━━━━┫ │
          1030┃ データ ┃←┘有効アドレス
              ┣━━━━━┫
              :     :

ベース(基底)アドレス指定
ベースレジスタの値とアドレス部の値を加算したものを有効アドレスとする方式です。
メモリにロードされたプログラムの先頭アドレスをベースレジスタに設定しておき、アドレス部には、プログラムの先頭を0番地としたときのデータのアドレス(相対位置、変位という)を入れておきます。そして、命令実行時に、ベースレジスタの値にアドレス部の値を加えた有効アドレスを用いて処理を行います。
この方式は、命令のアドレス部の値を直さずに、メモリのどこでもプログラムをロードして実行できる(再配置可能といいます)ため、マルチプログラミングを行うには必須な機能です。

     ベースアドレス指定のとき:ベースレジスタ
     相対アドレス指定のとき:プログラムカウンタ
         ┏━━━━━━┓
     ┌──→┃ 1000 ┃┐
     │   ┗━━━━━━┛│
     │           │
   ┏━━┳━━━┓      │
   ┃命令┃ 30 ┃─加算───┘
   ┗━━┻━━━┛ │
      アドレス部 │       メモリ
            │     ┏━━━━━┓
            │    0┃     ┃
            │     ┣━━━━━┫
            │    1┃     ┃
            │     ┣━━━━━┫
            │     :     :
            │     ┣━━━━━┫
            │ 1000┃     ┃
            │   ↑ ┣━━━━━┫
            │   │ :     :
            │  変位 :     :
            │   │ :     :
            │   ↓ :     :
            │ 1030┣━━━━━┫
     有効アドレス └────→┃ データ ┃
                  ┣━━━━━┫
                  :     :

相対アドレス指定
広義には、ベースアドレス指定も含みますが、狭義には自己相対アドレス指定方式のことを指します。
アドレス部の値にプログラムカウンタの内容を加えたものが、有効アドレスになる方式です。
プログラムカウンタの値を基準とし、その値からの変位で有効アドレスを指定します。
ベースレジスタや多くの汎用レジスタを持たないコンピュータが多く使っている方式です。
インデックス(指標)アドレス指定
アドレス部の値にインデックスレジスタの値を加えて有効アドレスとする方式です。
一般的には、インデックスレジスタとして汎用レジスタを用います。そして、汎用レジスタは複数のレジスタからなっており、レジスタ番号が付けられています。そのため、命令語は、命令部とアドレス部のほかにインデクス部からなり、インデクス部でレジスタ番号を指定します。
 この方式は、配列や構造体(レコード)など、メモリ上で連続しているデータに同一処理を、繰り返し実行する場合、インデックスレジスタの値あるいはアドレス部の値を増やすだけで処理できます。

        インデクスレジスタ
         ┏━━━━━┓
 レジスタ番号 0┃     ┃
        1┣━━━━━┫
     ┌──→┃  3  ┃┐
     │   ┣━━━━━┫│
     │  2┃     ┃│
     │   ┣━━━━━┫│
     │          │
     │ アドレス部    │
 ┏━━┳━┳━━━┓     │
 ┃命令┃1┃ 1000 ┃─加算──┘
 ┗━━┻━┻━━━┛ │
  インデックス部   │       メモリ
            │     ┏━━━━━┓
            │    0┃     ┃
            │     ┣━━━━━┫
            │    1┃     ┃
            │     ┣━━━━━┫
            │     :     :
            │     ┣━━━━━┫
            │ 1002┃     ┃
            │ 1003┣━━━━━┫
     有効アドレス └────→┃ データ ┃
                  ┣━━━━━┫
                  :     :