アドレッシングモードとは
アドレッシングモードは、
CPUが命令を実行する際に、演算対象となるデータ(オペランド)の場所を指定する方法を指します。命令は、オペランドとその結果を格納する場所を必要としますが、アドレッシングモードは、この場所の指定方法を効率化し、命令の柔軟性を高めるために重要な役割を果たします。
一般的に、アドレッシングモードは、メモリ内の特定の場所を指定するだけでなく、レジスタや命令内に直接記述された値(即値)も扱うことができます。プログラミングの観点からは、
コンパイラの開発や
アセンブリ言語でのプログラミングにおいて、アドレッシングモードの理解が不可欠です。
アドレッシングモードの複雑さ
アドレッシングモードの種類と複雑さは、コンピュータのアーキテクチャによって大きく異なります。複雑なアドレッシングモードは、命令数を削減し、レジスタの使用を効率化できる利点がありますが、
CPUの
命令パイプライン設計を複雑にする可能性があります。一方、単純なアドレッシングモードは、
CPU設計を容易にする反面、より多くの命令が必要になる場合があります。
RISC(Reduced Instruction Set Computer)アーキテクチャでは、一般的にアドレッシングモードが少なく単純ですが、CISC(Complex Instruction Set Computer)アーキテクチャでは、多数の複雑なアドレッシングモードを備えていることがあります。例えば、DECの
VAXのようなCISCは、多様なアドレッシングモードをサポートしています。
アドレッシングモードが少ないアーキテクチャでは、命令コードにオペランドの意味が規定されることが多いですが、豊富なアドレッシングモードを持つアーキテクチャでは、命令コードとは別にアドレッシングモードを指定するフィールドが存在します。このように、アドレッシングモードを命令コードから分離することで、命令セットの直交性を高めることができます。
アドレッシングモードの構成要素
アドレッシングモードは、以下のような要素を組み合わせて構成されます。
レジスタ: 命令のオペランドとして、レジスタそのものを指定したり、レジスタの内容をメモリアドレスの指定に使用したりします。アドレッシングモードで使用される主なレジスタには、ベースポインタ(BP)、インデックスレジスタ(IX)、プログラムカウンタ(PC)などがあります。
ベースポインタ: アクセスする
メモリアドレスの基準となるアドレスを格納します。構造体などのメモリブロックの先頭アドレスを保持し、ディスプレースメント(オフセット)を使用してブロック内の任意のアドレスを指定する際に利用されます。
インデックスレジスタ: 配列のインデックスに対応する値を保持します。ディスプレースメントの変数化と見なすことができます。
プログラムカウンタ: 次に実行する命令のアドレスを保持します。分岐命令などで使用される特殊なベースポインタです。
イミディエイト(即値): 命令内に直接記述された値を指します。演算命令のオペランドとして直接使用されます。
直接アドレス:
メモリアドレスを命令内で直接指定します。大域変数やライブラリ関数のアドレス指定によく使われます。
ディスプレースメント(オフセット): ベースアドレスからの相対的な位置を示す値です。
命令用のアドレッシングモード
絶対: オペランドで指定されたアドレスをそのまま実効アドレスとして使用します。
PC相対: プログラムカウンタ(PC)の値に、オペランドとして指定されたオフセット値を加算したものを実効アドレスとします。分岐命令でよく使われます。
レジスタ間接: オペランドとして指定されたレジスタの内容を実効アドレスとして使用します。
逐次的実行: PCをインクリメントし、メモリ上の次の命令を順に実行します。通常、アドレッシングモードとは見なされません。
条件付き実行: 分岐命令以外にも条件付きの命令を備え、分岐を避けることでパイプラインの乱れを防ぎます。
スキップ: 比較結果に応じて次の命令をスキップします。
データ用のアドレッシングモード
レジスタ: オペランドとしてレジスタのみを指定します。
ベース+オフセット: ベースレジスタの内容にオフセット値を加算したものを実効アドレスとします。
イミディエート/リテラル: 定数を直接オペランドとして指定します。
暗黙のアドレッシングモード: 命令がアクセスするリソースが固定されているため、アドレスを明示せずに暗黙的にアクセスします。
その他のアドレッシングモード
絶対/直接: 命令内で直接アドレスを指定します。
インデックス付き絶対: 絶対アドレスにインデックスレジスタの内容を加算したものを実効アドレスとします。
ベース+インデックス: ベースレジスタとインデックスレジスタの内容を加算したものを実効アドレスとします。
ベース+インデックス+オフセット: ベースレジスタ、インデックスレジスタの内容、およびオフセット値を加算したものを実効アドレスとします。
自動インクリメント付きレジスタ間接: レジスタの内容を実効アドレスとし、アクセス後にレジスタをインクリメントします。
自動デクリメント付きレジスタ間接: レジスタの内容を実効アドレスとし、アクセス前にレジスタをデクリメントします。
メモリ間接: 実効アドレスで示されるメモリ位置に、真の実効アドレスが格納されているアドレッシングモードです。
PC相対: プログラムカウンタをベースレジスタとしてオフセット値を加算して実効アドレスを得る方法です。
CISCとRISCのアドレッシングモードの例
CISC(x86アーキテクチャ)
CISCアーキテクチャでは、メモリアクセスを伴う命令が多く、複雑なアドレッシングモードが利用可能です。x86アーキテクチャでは、以下のようなアドレッシングモードが利用できます。
レジスタ間接
ベース+インデックス
ベース+オフセット
ベース+インデックス+オフセット
直接(絶対)アドレス
RISC(PowerPCアーキテクチャ)
RISCアーキテクチャでは、メモリアクセスをロード/ストア命令に限定し、アドレッシングモードを単純化する傾向があります。
PowerPCアーキテクチャでは、以下のようなアドレッシングモードが利用できます。
PC相対ディスプレースメント付き
直接アドレス
レジスタ間接
レジスタ間接を基本としたディスプレースメントやインデックスレジスタによる修飾
歴史的に使われたアドレッシングモード
過去には、以下のようなアドレッシングモードが使われていました。
多重メモリ間接: メモリ間接を複数回繰り返すことで、より複雑なアドレス指定を実現しました。
メモリマップド・レジスタ: レジスタをメモリ空間の一部として扱い、メモリ操作でレジスタを操作できるようにしました。
自動インクリメント付きメモリ間接: メモリ間接アクセス後に、メモリの内容を自動的にインクリメントしました。
ゼロページとダイレクトページ: メモリの特定領域を短縮したアドレスでアクセス可能にするアドレッシングモードです。
*
ワードを任意サイズのバイトで分けて指定: ワードを任意サイズのバイト単位で指定できる特殊なアドレッシングモードです。
まとめ
アドレッシングモードは、
CPUの命令実行において、オペランドの場所を特定するための重要なメカニズムです。その種類や複雑さはアーキテクチャによって異なりますが、プログラムの効率や柔軟性に大きな影響を与えます。プログラマーや
コンパイラ開発者は、アドレッシングモードを理解し、適切に活用することが求められます。
この記事では、アドレッシングモードの基本的な概念から、具体的な構成要素、単純なモード、そして歴史的に使われてきた複雑なモードまでを詳細に解説しました。この知識が、より深いコンピュータアーキテクチャの理解につながることを願っています。