FE EXAM

相対アドレス指定(Relative Addressing)

プログラムカウンタからの相対位置で実効アドレスを求める方式

INTERACTIVE VISUALIZATION
PC(現在地)
分岐先
PC(現在地)
5
変位
+3
分岐先(実効アドレス)
8
PC(プログラムカウンタ)5
015
変位(オペランド)+3
-8+8
※マイナスなら前方(手前)へ分岐
プリセット
実効アドレス = PC + オペランド現在のPC 5 に変位 +3 を足して、分岐先 85 + 3 = 8)。アドレス 8 の命令へジャンプします。
分岐命令JUMP +3PC=5変位+35 + 3 =8PROGRAM[0]命令0[1]命令1[2]命令2[3]命令3[4]命令4[5]命令5PC[6]命令6[7]命令7[8]命令8分岐先[9]命令9[10]命令10[11]命令11[12]命令12[13]命令13[14]命令14[15]命令15
解説

📌
相対アドレス指定とは

PC(現在地)5+変位+3=分岐先8今いる場所から「いくつ先か」で指す

相対アドレス指定(相対アドレッシング)とは、プログラムカウンタ(PC)=次に実行する命令の場所を覚えているレジスタの値を起点に、命令のオペランド(変位)を足して実効アドレスを求める方式です。式で書くと 実効アドレス = PC + オペランド となります。

身近な例で言うと、「ここから3軒先の家」という言い方に似ています。番地(絶対アドレス)を覚えていなくても、「今いる場所から数えていくつ先か」さえ分かれば目的地にたどり着けます。変位はマイナスにもできるので、「2軒手前へ戻る」のように前方向の移動も表せます。

上のツールでPCと変位のスライダーを動かすと、現在地(青)から緑の矢印が分岐先へ伸びる様子が分かります。変位をマイナスにすると分岐先が上(手前)に移ることに注目してください。

📐
PCからの相対指定

相対アドレス指定の起点になるのがプログラムカウンタ(PC)です。PCは「今どこを実行しているか」を常に保持しており、相対指定ではこのPCを基準にして「そこから何個ずれるか」だけをオペランドに書きます。

実効アドレス = PC + オペランド

変位は符号付き(プラスにもマイナスにもなる)なのが重要です。
変位がプラス:PCより後ろ(先)の命令へ進む(前進ジャンプ)
変位がマイナス:PCより前(手前)の命令へ戻る(後退ジャンプ)
変位が0:PCの位置そのもの(その場)

大きな利点:再配置がしやすい。絶対アドレスではなく「PCからのズレ」で書いてあるので、プログラム全体をメモリの別の場所に丸ごと移しても、相対関係は変わらず正しく動きます。これを位置独立(リロケータブル)と呼び、プログラムをどこに読み込んでも動かせる柔軟性を生みます。

⚖️
分岐命令での活用

相対アドレス指定が最もよく使われるのが分岐命令(=条件によって実行する場所を変えるジャンプ命令)です。if 文や for ループは、機械語ではこの分岐命令で実現されています。

典型的な使われ方は次の2つです。
前方ジャンプ(変位プラス):条件を満たさないとき、処理ブロックを飛ばして先へ進む(if の不成立側)
後方ジャンプ(変位マイナス):ループの先頭へ戻って繰り返す(forwhile

例) ループの後退ジャンプ
PC = 10(ループ末尾の分岐命令)
変位 = -6
─────────────
分岐先 = 10 + (-6) = 4(ループ先頭へ戻る)

分岐先の計算は「分岐命令のあるPCに変位を足す」のが基本です。実機では「次の命令を指したPC」を基準にする場合もありますが、まずは 分岐先 = PC + 変位 という関係を押さえておくとよいでしょう。直接アドレスが「行き先そのもの」を書くのに対し、相対アドレスは「現在地からのズレ」を書く点が最大の違いです。

関連コンテンツ