アドレス指定方法はなぜ必要?#
コンピュータの命令は「命令部」と「アドレス部(オペランド)」から構成されている。 このオペランドにおいて、処理対象データのメモリ上の位置が指定される このとき、各種レジスタ・主記憶装置のアドレスを関連付けて有効アドレスを指定する場合がある。 ※レジスタとは、少量で高速な内部記憶装置である。
アドレス指定方法#
1. 即値アドレス指定 (Immediate Addressing)#
アドレス部の値がメモリアドレスではなく、演算対象のデータそのものである方式です。メモリにアクセスする必要がないため、高速に処理できます。
命令
+------+------+
| 命令 | データ | ← このデータ(オペランド)を直接使う
+------+------+
特徴:
- メモリアクセスが不要で高速。
- 命令の中にデータを埋め込むため、表現できる値の範囲が制限される。
2. 直接アドレス指定 (Direct Addressing)#
命令のアドレス部に、有効アドレス(データが格納されているメモリアドレス)が直接書き込まれている方式です。
命令 主記憶
+------+---------+ +-------------+
| 命令 | アドレスA | ------------> | データ | ← 目的のデータ
+------+---------+ +-------------+
アドレスA
特徴:
- 構造がシンプルで分かりやすい。
- 指定できるメモリアドレスの範囲が、命令のアドレス部のビット数に依存する。
3. 間接アドレス指定 (Indirect Addressing)#
命令のアドレス部が指すメモリ番地に、有効アドレスが格納されている方式です。目的のデータにたどり着くまでに、2回メモリにアクセスする必要があります。
命令 主記憶
+------+---------+ +-------------+ +-------------+
| 命令 | アドレスA | ------------> | アドレスB | ------------> | データ | ← 目的のデータ
+------+---------+ +-------------+ +-------------+
アドレスA アドレスB
特徴:
- 直接アドレス指定よりも広いメモリ空間にアクセスできる。
- メモリアクセスが2回発生するため、処理速度が遅くなる。
4. 指標アドレス指定 (Indexed Addressing)#
命令のアドレス部の値と、インデックスレジスタ(指標レジスタ)の値を足し合わせて有効アドレスを求めます。配列など、連続したデータ領域へのアクセスに便利です。
命令
+------+---------+
| 命令 | アドレスA |
+------+---------+
|
+-----------------+
|
インデックスレジスタ ↓
+-------------+ +------+
| 値X | ------->| 加算 | ----> 有効アドレス (A+X)
+-------------+ +------+
特徴:
- インデックスレジスタの値を変更するだけで、アクセスするアドレスを効率的にずらせる。
- ループ処理などで配列の各要素にアクセスする場合に強力。
5. 基底アドレス指定 (Base Addressing)#
命令のアドレス部の値と、ベースレジスタ(基底レジスタ)の値を足し合わせて有効アドレスを求めます。プログラムの再配置(メモリ上のどこに置かれても動作すること)を容易にします。
命令
+------+---------+
| 命令 | アドレスA | (変位/オフセット)
+------+---------+
|
+-----------------+
|
ベースレジスタ ↓
+-------------+ +------+
| 値B | ------->| 加算 | ----> 有効アドレス (B+A)
+-------------+ +------+
(基準アドレス)
特徴:
- ベースレジスタにプログラムの先頭アドレスを入れておくことで、プログラム全体をメモリ上のどこに移動しても、命令を書き換える必要がない。
- 指標アドレス指定と仕組みは似ているが、ベースレジスタは基準アドレス、アドレス部はそこからの距離(変位)を示すという役割の違いがある。
6. 相対アドレス指定 (Relative Addressing)#
命令のアドレス部の値と、プログラムカウンタの値を足し合わせて有効アドレスを求めます。主に、分岐命令などで使われます。
命令
+------+---------+
| 命令 | アドレスA | (変位/オフセット)
+------+---------+
|
+-----------------+
|
プログラムカウンタ ↓
+-------------+ +------+
| 現在位置P | ------->| 加算 | ----> 有効アドレス (P+A)
+-------------+ +------+
特徴:
- 現在の命令位置からどれだけ離れた場所にジャンプするかを指定する。
- 基底アドレス指定と同様に、プログラムの再配置が容易になる。
レジスタアドレス指定 (Register Addressing)#
オペランド部でレジスタを指定し、そのレジスタの値を直接データとして使う方式
データがCPUの外部にある主記憶(メモリ)ではなく、CPU内部の高速な記憶領域である「レジスタ」に格納されています。 そのため、メモリアクセスが発生せず、即値アドレス指定と並んで非常に高速に処理を実行できます。
命令 CPU内部レジスタ群
+------+----------+
| 命令 | レジスタA | ------------> +-------------+
+------+----------+ | データ | ← 目的のデータ
+-------------+
| |
+-------------+
特徴:
- CPU内部で完結するため、極めて高速。
- レジスタの数は限られているため、扱えるデータの数も限定される。
レジスタ間接アドレス指定 (Register Indirect Addressing)#
オペランド部で指定したレジスタに、データが格納されているメモリアドレスが格納されている方式です。
これは「間接アドレス指定」のレジスタ版と言えます。主記憶上のアドレスを指すのではなく、レジスタが有効アドレスを保持しています。
命令 CPU内部レジスタ群 主記憶
+------+----------+
| 命令 | レジスタA | ------------> +-------------+ +-------------+
+------+----------+ | アドレスB | ------------> | データ | ← 目的のデータ
+-------------+ +-------------+
| | アドレスB
+-------------+
特徴:
- (主記憶)間接アドレス指定ではメモリアクセスが2回必要でしたが、レジスタ間接アドレス指定では1回で済みます。
- レジスタの値を変更するだけで参照先のアドレスを簡単に変えられるため、ポインタを利用した処理などで高い柔軟性を発揮します。