CPUが命令を実行するには、命令の対象となるデータをメモリから演算装置へもってくる必要があります。それには、メモリ上でのデータの格納場所(アドレス)を指定する必要がありますが、ここではその方式について学習します。
CPU、レジスタ、アドレス指定方式、直接アドレス指定、間接アドレス指定、ベースアドレス指定、インデックスアドレス指定、再配置可能
CPU命令(機械語)は、命令部とアドレス部から構成されます。
アドレス部は命令の対象となるデータが存在する主記憶(メモリ)の存在場所(アドレス)を示しています。
アドレス部のアドレスが直接にメモリアドレスを示していることもありますが、CPU内部にある各種のレジスタおよび主記憶上のアドレスを関連づけて、データのアドレスを指定する(アドレス修飾という)場合が多いのです。この場合、データが存在する実際のメモリアドレスを有効アドレスあるいは実効番地といいます。
アドレス指定方式とは、有効アドレスを指定する方式のことです。
アドレス指定方式には、各種のレジスタおよび主記憶上のアドレスの関連で、多様な方法があります。実際には、CPUによりどの方式が利用可能かが異なります。また、複数の方式を組み合わせることもあります。
なお、機械語やアセンブラでプログラミングする場合は、プログラマがアドレス指定を記述する必要がありますが、高級言語によるプログラミングでは、プログラマがそれを意識することはありません。
アドレス指定方式を体系的に示すと、次のようになります。
即値アドレス指定:アドレス部にアドレスではなく、データの値そのものをもつ
アドレス指定方式:アドレス部にアドレスをもつ
直接(絶対)アドレス指定:アドレス部に有効アドレスをもつ
特徴:アドレス部のビット数によりメモリ容量に限界
間接アドレス指定:有効アドレスが入っているメモリのアドレスを指定
特徴:メモリを2回アクセス
修飾アドレス指定:有効アドレス=アドレス部の値+指定レジスタの値
ベース(基底)アドレス指定:ベースレジスタの値を加算
特徴:プログラムの再配置可能
(自己)相対アドレス指定:プログラムカウンタの値を加算
特徴:ベースアドレス指定とほぼ同じ
インデックス(指標)アドレス指定:インデクスレジスタの値を加算
特徴:連続データに同一命令を行うのに利用
┏━━┳━━━┓
┃命令┃777┃→データの値が777
┗━━┻━━━┛
アドレス部
┏━━┳━━━┓
┃命令┃ 1000 ┃このビット数で最大アドレスが決まる
┗━━┻━━━┛ メモリ
│ ┏━━━━━┓
│ 0┃ ┃
│ ┣━━━━━┫
│ 1┃ ┃
│ ┣━━━━━┫
│ : :
│ 1000┣━━━━━┫
有効アドレス└────→┃ データ ┃
┣━━━━━┫
: :
アドレス部
┏━━┳━━━┓
┃命令┃ 1000 ┃
┗━━┻━━━┛ メモリ
│ ┏━━━━━┓
│ 0┃ ┃
│ ┣━━━━━┫
│ 1┃ ┃
│ ┣━━━━━┫
│ : :
│ 1000┣━━━━━┫
└────→┃ 1030 ┃─┐このビット数で最大アドレスが決まる
アドレスが入っている┣━━━━━┫ │
: : │2回メモリにアクセスする
┣━━━━━┫ │
1030┃ データ ┃←┘有効アドレス
┣━━━━━┫
: :
ベースアドレス指定のとき:ベースレジスタ
相対アドレス指定のとき:プログラムカウンタ
┏━━━━━━┓
┌──→┃ 1000 ┃┐
│ ┗━━━━━━┛│
│ │
┏━━┳━━━┓ │
┃命令┃ 30 ┃─加算───┘
┗━━┻━━━┛ │
アドレス部 │ メモリ
│ ┏━━━━━┓
│ 0┃ ┃
│ ┣━━━━━┫
│ 1┃ ┃
│ ┣━━━━━┫
│ : :
│ ┣━━━━━┫
│ 1000┃ ┃
│ ↑ ┣━━━━━┫
│ │ : :
│ 変位 : :
│ │ : :
│ ↓ : :
│ 1030┣━━━━━┫
有効アドレス └────→┃ データ ┃
┣━━━━━┫
: :
インデクスレジスタ
┏━━━━━┓
レジスタ番号 0┃ ┃
1┣━━━━━┫
┌──→┃ 3 ┃┐
│ ┣━━━━━┫│
│ 2┃ ┃│
│ ┣━━━━━┫│
│ │
│ アドレス部 │
┏━━┳━┳━━━┓ │
┃命令┃1┃ 1000 ┃─加算──┘
┗━━┻━┻━━━┛ │
インデックス部 │ メモリ
│ ┏━━━━━┓
│ 0┃ ┃
│ ┣━━━━━┫
│ 1┃ ┃
│ ┣━━━━━┫
│ : :
│ ┣━━━━━┫
│ 1002┃ ┃
│ 1003┣━━━━━┫
有効アドレス └────→┃ データ ┃
┣━━━━━┫
: :