相対アドレス指定 (ソウタイアドレスシテイ) とは | 意味や読み方など丁寧でわかりやすい用語解説
相対アドレス指定 (ソウタイアドレスシテイ) の読み方
日本語表記
相対アドレス指定 (ソウタイアドレスシテイ)
英語表記
Relative addressing (レラティブアドレッシング)
相対アドレス指定 (ソウタイアドレスシテイ) の意味や用語解説
相対アドレス指定は、コンピュータのCPUがメモリ上のデータや命令の位置を特定するために用いるアドレス指定方式の一つである。これは、特定の基準となるアドレスからの相対的な距離、すなわち差分(オフセット)を用いて、目的のメモリアドレスを算出する手法を指す。絶対的な番地を直接指定するのではなく、現在位置からの相対的な位置関係でアクセス先を表現する点が最大の特徴となる。この方式は、特にプログラムの実行フローを制御するジャンプ命令や分岐命令で広く利用されており、現代のソフトウェアの柔軟性と効率性を支える基本的な技術である。 相対アドレス指定の仕組みを理解するためには、まず基準となるアドレスが何かを把握する必要がある。最も一般的に基準として用いられるのは、CPU内部に存在するプログラムカウンタ(PC)、またはインストラクションポインタ(IP)と呼ばれる特殊なレジスタの値である。プログラムカウンタは、CPUが次に実行すべき命令が格納されているメモリアドレスを常に保持している。相対アドレス指定を用いる命令の中には、このプログラムカウンタの値に加算、あるいは減算するためのオフセット値(変位やディスプレースメントとも呼ばれる)が含まれている。CPUがこの命令を解釈する際、「実効アドレス = 現在のプログラムカウンタの値 + オフセット値」という計算を実行する。この計算によって得られた実効アドレスが、実際にアクセス対象となるメモリ上のアドレスとなる。オフセット値は通常、符号付きの整数として扱われるため、正の値であればプログラムカウンタが指す位置よりも後方のメモリアドレスを、負の値であれば前方のメモリアドレスを指し示すことが可能である。 相対アドレス指定がもたらす最大の利点は、プログラムの再配置可能性を高めることにある。プログラムは、実行時にオペレーティングシステムによってメモリ上の空いている任意の位置に読み込まれる(ロードされる)のが一般的である。もし、プログラム内のジャンプ命令などが、メモリ上の固定番地を直接指定する絶対アドレス指定で記述されていた場合、プログラムがロードされる開始アドレスが変わるたびに、コード内のすべてのアドレス情報を修正しなければならなくなる。これは非常に非効率であり、柔軟性に欠ける。しかし、相対アドレス指定を用いれば、プログラムがメモリ上のどこに配置されたとしても、命令と命令の間の相対的な位置関係は常に一定であるため、コードを一切変更することなく正しく実行できる。このように、メモリ上の配置場所に依存しない性質を持つコードは位置独立コード(Position-Independent Code, PIC)と呼ばれる。この性質は、複数の異なるプロセスから同時にメモリ上にロードされて利用される共有ライブラリやダイナミックリンクライブラリ(DLL)を実装する上で不可欠な要素となっている。 もう一つの重要な利点として、命令長の短縮化に寄与する点が挙げられる。32ビットや64ビットのシステムでは、メモリ空間全体のアドレスを表現するためにそれぞれ32ビット、64ビットのデータが必要となる。これを命令内にそのまま埋め込むと、命令のサイズが大きくなってしまう。しかし、プログラムにおける分岐やジャンプの移動先は、多くの場合、現在の実行位置から比較的近い範囲に収まる。そのため、全アドレスを格納する代わりに、より少ないビット数で表現できる短いオフセット値を命令に含めることで、命令全体のサイズを小さく抑えることが可能になる。命令サイズが小さくなれば、プログラム全体のメモリ使用量が削減されるだけでなく、CPUの命令キャッシュにより多くの命令を格納できるようになり、結果としてプログラムの実行速度の向上にもつながる。 以上の特性から、相対アドレス指定は、プログラミング言語におけるif文などの条件分岐や、for文、while文といったループ処理を実現するためのジャンプ命令で頻繁に用いられる。例えば、ループの終端から先頭に戻る処理は、現在の位置から特定の命令数だけ前に戻るジャンプとして、負のオフセット値を用いた相対アドレス指定で効率的に実装される。 対照的な方式である絶対アドレス指定は、メモリ上の特定のアドレスを直接指定する方法であり、ハードウェアのレジスタや、OSが管理する固定アドレスのデータ構造など、アクセス先の位置が不変である場合に有効である。しかし、汎用的なアプリケーションプログラムにおいては、再配置の柔軟性を持つ相対アドレス指定が主流となっている。総じて、相対アドレス指定は、プログラムカウンタを基準としたオフセット計算によりメモリアドレスを決定する方式であり、プログラムの位置独立性を確保し、命令効率を高めることで、現代のコンピュータシステムを支える極めて重要な役割を担っている。