プログラムカウンタからの相対位置で実効アドレスを求める方式
相対アドレス指定(相対アドレッシング)とは、プログラムカウンタ(PC)=次に実行する命令の場所を覚えているレジスタの値を起点に、命令のオペランド(変位)を足して実効アドレスを求める方式です。式で書くと 実効アドレス = PC + オペランド となります。
身近な例で言うと、「ここから3軒先の家」という言い方に似ています。番地(絶対アドレス)を覚えていなくても、「今いる場所から数えていくつ先か」さえ分かれば目的地にたどり着けます。変位はマイナスにもできるので、「2軒手前へ戻る」のように前方向の移動も表せます。
上のツールでPCと変位のスライダーを動かすと、現在地(青)から緑の矢印が分岐先へ伸びる様子が分かります。変位をマイナスにすると分岐先が上(手前)に移ることに注目してください。
相対アドレス指定の起点になるのがプログラムカウンタ(PC)です。PCは「今どこを実行しているか」を常に保持しており、相対指定ではこのPCを基準にして「そこから何個ずれるか」だけをオペランドに書きます。
実効アドレス = PC + オペランド
変位は符号付き(プラスにもマイナスにもなる)なのが重要です。
・変位がプラス:PCより後ろ(先)の命令へ進む(前進ジャンプ)
・変位がマイナス:PCより前(手前)の命令へ戻る(後退ジャンプ)
・変位が0:PCの位置そのもの(その場)
大きな利点:再配置がしやすい。絶対アドレスではなく「PCからのズレ」で書いてあるので、プログラム全体をメモリの別の場所に丸ごと移しても、相対関係は変わらず正しく動きます。これを位置独立(リロケータブル)と呼び、プログラムをどこに読み込んでも動かせる柔軟性を生みます。
相対アドレス指定が最もよく使われるのが分岐命令(=条件によって実行する場所を変えるジャンプ命令)です。if 文や for ループは、機械語ではこの分岐命令で実現されています。
典型的な使われ方は次の2つです。
・前方ジャンプ(変位プラス):条件を満たさないとき、処理ブロックを飛ばして先へ進む(if の不成立側)
・後方ジャンプ(変位マイナス):ループの先頭へ戻って繰り返す(for や while)
例) ループの後退ジャンプ
PC = 10(ループ末尾の分岐命令)
変位 = -6
─────────────
分岐先 = 10 + (-6) = 4(ループ先頭へ戻る)
分岐先の計算は「分岐命令のあるPCに変位を足す」のが基本です。実機では「次の命令を指したPC」を基準にする場合もありますが、まずは 分岐先 = PC + 変位 という関係を押さえておくとよいでしょう。直接アドレスが「行き先そのもの」を書くのに対し、相対アドレスは「現在地からのズレ」を書く点が最大の違いです。