その他のアドレッシングモード
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/07/04 05:50 UTC 版)
「アドレッシングモード」の記事における「その他のアドレッシングモード」の解説
絶対/直接 命令内でアドレスをそのまま指定する。例えば、ロード命令で参照するメモリアドレスを直接指定する。この場合、命令がかなり長くなる。CISCでは命令が可変長なので、このようなアドレッシングモードを持つことが多い。x86にもある。RISCではアドレスの上位半分だけをレジスタに格納する命令を持つことがある。その命令に続いて、OR命令でアドレスの下位半分をイミディエート値で指定し、上位半分とOR演算で組合わせて、アドレスをレジスタに格納する。そうしてアドレス全体をレジスタに格納してから「レジスタ間接」または「ベース+オフセット」のアドレッシングモードでそのアドレスにアクセスする。 インデックス付き絶対 命令内でアドレスをそのまま指定し、さらにインデックスレジスタを指定する。実効アドレスは絶対アドレスにインデックスレジスタの内容を加算したものになる。これも命令がかなり長くなる。絶対アドレスは配列などの先頭を指し、インデックスレジスタでその配列の特定の要素を示す。加算する前にインデックスレジスタの内容をスケーリングし、配列の添え字の値そのものをインデックスレジスタに格納しておき、スケーリングでメモリ上のオフセットに変換するアーキテクチャもある。 例えば、大域変数または局所定数として文字列などを定義した場合、そのアドレスは絶対アドレスとして命令に書かれる。文字列上を走査する場合、ループ変数がインデックスレジスタに格納され、このアドレッシングモードが使われる。 ベース+インデックス ベースレジスタとインデックスレジスタを指定し、それぞれの内容を加算した値を実効アドレスとするアドレッシングモード。ベースレジスタは配列などの先頭アドレス、インデックスレジスタは特定の配列要素を指す。加算する前にインデックスレジスタの内容をスケーリングし、配列の添え字の値そのものをインデックスレジスタに格納しておき、スケーリングでメモリ上のオフセットに変換するアーキテクチャもある。 ベース+インデックス+オフセット ベースレジスタの内容とインデックスレジスタの内容とオフセット値を加算して実効アドレスを得るアドレッシングモード。構造体やレコードの配列などで特定の構造体(レコード)の特定のフィールドを指定するといった場合に使用する。 レジスタ間接 ベースレジスタの内容を実効アドレスとするアドレッシングモード。通常は「ベース+オフセット」でオフセット値がゼロの場合である。 自動インクリメント付きレジスタ間接 ベースレジスタの内容が実効アドレスだが、実効アドレスを求めた後、ベースレジスタをそのデータのサイズだけインクリメントする。例えば32ビットのロード命令なら、ベースレジスタに4を加える。アセンブリ言語では (A7)+ などと表記される。ループで配列の各要素を走査する場合などに使用する。 高水準言語では、関数は副作用がない方が理解しやすく好ましいとされることが多い。このアドレッシングモードはベースレジスタが更新されるという副作用がある。例えばこのアドレッシングモードを使った命令でページフォールトなどが発生した場合、ベースレジスタの内容が命令実行前に戻っていないと正しく復帰できない。MC68000にはそのような問題があり、MC68010で対処された。DEC VAX では最大6オペランドで自動インクリメントが可能で、命令自体が最大50バイトにもなるため、命令とデータの両方で同時にページフォールトとなる可能性があった。 自動デクリメント付きレジスタ間接 ベースレジスタの内容をデータのサイズだけデクリメントしてから、その内容を実効アドレスとする。ループで配列を後ろの方から走査する場合などに使用する。自動インクリメント付きレジスタ間接のアドレッシングモードと組合わせて、スタックを実装することもできる。 メモリ間接 本項で述べている各アドレッシングモードで、オプションのビットを設定することで間接アドレッシングとなるアーキテクチャもある。すなわち、それぞれの解説で実効アドレスとされているアドレス位置に真の実効アドレスが格納されているというアドレッシングモードである。間接アドレッシングは命令またはデータに使える。ポインタまたは参照の実装を容易にする効果がある。PDP-8などの初期のミニコンピュータでは、レジスタが少なくアドレス範囲も小さかった。そのため、大きなメモリを参照する唯一の手段がメモリ間接アドレッシングだった。 PC相対 プログラムカウンタをベースレジスタとして、オフセット値も加えてロード命令の実効アドレスとするアドレッシングモード。「ベース+オフセット」の特殊ケースである。x86-64は、位置独立コードのためにRIP(プログラムカウンタ)相対のアドレッシングをサポートしている。ARMアーキテクチャとVAXはどちらもPCが汎用レジスタファイルに含まれており、PC相対アドレッシングが可能である。これらは定数をリテラルプールと呼ばれるテキスト内の領域(サブルーチンの直前か直後)に配置し、PC相対でそれをロードするようなコードを生成する。PC相対の分岐命令はPC以外のレジスタは更新されないが、PC相対のロード命令ではデータレジスタにロード結果が格納される。
※この「その他のアドレッシングモード」の解説は、「アドレッシングモード」の解説の一部です。
「その他のアドレッシングモード」を含む「アドレッシングモード」の記事については、「アドレッシングモード」の概要を参照ください。
- その他のアドレッシングモードのページへのリンク