アドレス指定方式は、CPUの命令が処理するオペランド(演算対象)をどう指定するかという仕組みです。値そのもの、レジスタ、メモリアドレスなど、命令中の情報の意味を区別しましょう。
値とアドレスを分ける
命令は、実行する操作を示す部分と、対象を指定する情報などで構成されます。実際の命令形式はCPUによって異なります。メモリから対象データを読む方式では、最終的な参照先を実効アドレスと呼びます。
以下は仕組みを学ぶための単純化したモデルです。命令のアドレス部の値をA、メモリのアドレスxにある内容をM[x]と書きます。
基本方式の比較
| 方式 | 対象の指定方法 | 読み方 |
|---|---|---|
| 即値 | 命令に対象の値そのものを含める | Aをデータとして使う |
| レジスタ | 指定したレジスタの内容を使う | レジスタ内のデータを使う |
| 直接 | 命令のアドレス部が参照先 | 実効アドレス=A、データ=M[A] |
| メモリ間接 | 命令が指した場所に参照先アドレスがある | 実効アドレス=M[A]、データ=M[M[A]] |
| 指標(インデックス) | アドレス部の値に指標レジスタ内容を加える | 実効アドレス=A+指標値 |
| 基底(ベース) | 基底レジスタ内容に変位を加える | 実効アドレス=基底値+変位 |
| 相対 | プログラムカウンタを基準に変位を加える | 実効アドレス=基準となるPC値+変位 |
間接指定にはレジスタ間接などもあります。ここでは表の「メモリ間接」の前提で考えます。指標・基底の役割、スケール係数、変位の符号や単位、PCの基準位置などは問題や命令セットで確認してください。
同じアドレス部でも結果が変わる例
A=1000、M[1000]=1003、M[1003]=42とします。
| 方式 | 使うデータ | 理由 |
|---|---|---|
| 即値 | 1000 | 命令中の値そのものを使う |
| 直接 | 1003 | メモリの1000番地を読む |
| メモリ間接 | 42 | 1000番地で得た1003をアドレスとして、さらに読む |
この説明で数えるのはオペランド取得のための参照です。即値に対象データを読むメモリアクセスが不要でも、命令フェッチまで不要という意味ではありません。
加算型の方式は「何を足すか」を見る
- 指標指定:A=980、指標レジスタ内容=22なら実効アドレスは1002。レジスタ番号22という意味ではありません。
- 基底指定:基底値=1000、変位=24なら1024。基準位置を変えれば、同じ変位で対応する位置を参照できます。
- 相対指定:問題で指定されたPCの基準値=2000、変位=-8なら1992。CPUによって基準位置や変位の単位が異なるため条件を優先します。
基底値がいつもプログラム先頭とは限りません。配列の先頭やデータ領域の基準など、用途に応じて設定します。指標指定は連続する要素の参照、相対指定は分岐先などの指定で考えると役割をつかみやすくなります。
確認問題
メモリ間接指定でA=1000、M[1000]=1003、M[1003]=42のとき、実効アドレスとデータは何ですか?
解答・解説を見る
実効アドレスは1003、データは42です。アドレスとして使う値と、その先に格納されたデータを区別します。
noteでCPU・メモリの計算を復習する
命令と参照先の関係が分かったら、CPU・メモリ計算の教材でクロック周波数・CPI・MIPSなどを学びましょう。リンク先は性能計算の教材で、個別の命令セットのアドレス指定を網羅するものではありません。

コメント