アドレッシング モード

フリー百科事典ウィキペディアより
ナビゲーションにジャンプ 検索にジャンプ

アドレッシング モードは、ほとんどの中央処理装置(CPU) 設計における命令セット アーキテクチャの 1 つの側面です。特定の命令セット アーキテクチャで定義されているさまざまなアドレッシング モードは、そのアーキテクチャの機械語命令が各命令のオペランドを識別する方法を定義します。アドレッシング モードは、マシン命令またはその他の場所に含まれるレジスタや定数に 保持されている情報を使用して、オペランドの実効メモリ アドレスを計算する方法を指定します。

コンピューター プログラミングでは、アドレッシング モードは主に、アセンブリ言語で書く人やコンパイラーライターにとって重要です。関連する概念については、任意のアドレス指定モードを使用する任意の命令の機能を扱う 直交命令セットを参照してください。

注意

さまざまなアドレッシング モードの名前を付ける一般的に受け入れられている方法はないことに注意してください。特に、作成者やコンピュータの製造元が異なれば、同じアドレッシング モードに異なる名前を付けたり、異なるアドレッシング モードに同じ名前を付けたりする場合があります。さらに、ある特定のアーキテクチャでは単一のアドレス指定モードとして扱われるアドレス指定モードは、別のアーキテクチャでは 2 つ以上のアドレス指定モードによってカバーされる機能を表す場合があります。たとえば、 Digital Equipment Corporation (DEC) VAXなどの一部の複合命令セット コンピュータ(CISC) アーキテクチャは、レジスタとリテラルまたは即値定数を単なる別のアドレッシング モードとして扱います。その他、IBM System/360とその後継機など、ほとんどの 縮小命令セット コンピューター(RISC) 設計では、この情報を命令内にエンコードします。したがって、後者のマシンには、あるレジスタを別のレジスタにコピーするため、リテラル定数をレジスタにコピーするため、およびメモリ位置の内容をレジスタにコピーするための 3 つの異なる命令コードがありますが、VAX には単一の「MOV」命令しかありません。

「アドレッシング モード」という用語自体は、「メモリ アドレス計算モード」または「オペランド アクセス モード」という異なる解釈の対象となります。最初の解釈では、メモリからの読み取りもメモリへの書き込みも行わない命令 (「レジスタへのリテラルの追加」など) は、「アドレッシング モード」を持たないと見なされます。2 番目の解釈は、オペランド モード ビットを使用してレジスタまたはリテラル オペランドを許可する VAX などのマシンを許可します。オペランド自体ではなく、オペランドのアドレスをロードする「実効アドレスのロード」などの命令には、最初の解釈のみが適用されます。

次に示すアドレッシング モードは、コード アドレッシングとデータ アドレッシングに分けられます。ほとんどのコンピュータ アーキテクチャはこの区別を維持していますが、(ほぼ) すべてのアドレッシング モードを任意のコンテキストで使用できるアーキテクチャがいくつかあります (または存在していました)。

以下に示す命令は、アドレッシング モードを説明するための純粋な代表的なものであり、特定のコンピュータで使用されるニーモニックを必ずしも反映するものではありません。

アドレッシングモードの数

ハードウェアで提供されるアドレッシング モードの数は、コンピュータ アーキテクチャによって大きく異なります。複雑なアドレッシング モードを排除し、1 つまたはいくつかの単純なアドレッシング モードのみを使用することには、いくつかの追加の命令とおそらく追加のレジスタが必要になる場合でも、いくつかの利点があります。[1] [2]単純なアドレッシング モードしか利用できない場合、 パイプライン化された CPU の設計がはるかに容易で あることが証明されています[3] [4] [5] 。

ほとんどの RISC アーキテクチャには約 5 つの単純なアドレッシング モードしかありませんが、DEC VAX などの CISC アーキテクチャには 10 を超えるアドレッシング モードがあり、そのうちのいくつかは非常に複雑です。IBM System/360アーキテクチャには 3 つのアドレッシング モードしかありませんでした。System/390用にさらにいくつか追加されました

アドレッシング モードが少数しかない場合、必要な特定のアドレッシング モードは通常、命令コード内にエンコードされます (例: IBM System/360 およびその後継、ほとんどの RISC)。ただし、多くのアドレッシング モードがある場合、アドレッシング モードを指定するために特定のフィールドが命令内に確保されることがよくあります。DEC VAX では、ほとんどすべての命令で複数のメモリ オペランドを使用できるため、各オペランド指定子の最初の数ビットを予約して、その特定のオペランドのアドレッシング モードを示しました。アドレッシング モード指定子ビットをオペコード操作ビットから分離しておくと、直交命令セットが生成されます。

多くのアドレッシング モードを備えたコンピュータでさえ、実際のプログラムの測定[6]は、以下に挙げる単純なアドレッシング モードが、使用されるすべてのアドレッシング モードの約 90% 以上を占めることを示しています。このような測定のほとんどは、コンパイラによって高級言語から生成されたコードに基づいているため、これは使用されているコンパイラの制限をある程度反映しています。[7] [6] [8]

便利な副作用

Intel x86、IBM/360、およびその後継など、一部の命令セット アーキテクチャには、有効なアドレスのロード命令があります。[9] [10]これは実効オペランド アドレスの計算を実行しますが、そのメモリ位置に作用する代わりに、アクセスされたであろうアドレスをレジスタにロードします。これは、配列要素のアドレスをサブルーチンに渡すときに役立ちます。また、1 つの命令で通常よりも多くの計算を行う賢い方法かもしれません。たとえば、このような命令をアドレッシング モード「base+index+offset」(詳細は後述) で使用すると、1 つの命令で 2 つのレジスタと定数を一緒に追加できます。

コードの単純なアドレス指定モード

コードのいくつかの簡単なアドレス指定モードを以下に示します。命名法は、プラットフォームによって異なる場合があります。

絶対または直接

   +----+----------------------------------+
   |ジャンプ| 住所 |
   +----+----------------------------------+

   (実効PCアドレス=アドレス)

絶対命令アドレスの実効アドレスは、変更されていないアドレス パラメータそのものです。

PC相対

   +----+----------------------------------+
   |ジャンプ| オフセット | 相対ジャンプ
   +----+----------------------------------+

   (実効PCアドレス=次の命令アドレス+オフセット、オフセットは負の場合もある)

PC相対命令アドレスの実効アドレスは、次の命令のアドレスに追加されるオフセット パラメータです。このオフセットは通常、命令の前後のコードを参照できるように署名されています。[11]

これは、通常のジャンプは近くの命令へのジャンプであるため、ジャンプに関連して特に役立ちます (高級言語ではほとんどのifまたはwhileステートメントはかなり短いです)。実際のプログラムの測定では、8 ビットまたは 10 ビットのオフセットは、条件付きジャンプの約 90% (約 ±128 または ±512 バイト) に対して十分な大きさであることが示唆されています。[12]

PC 相対アドレッシングのもう 1 つの利点は、コードが位置に依存しないことです。つまり、アドレスを調整する必要なく、メモリ内のどこにでもロードできます。

このアドレッシング モードのバージョンによっては、条件付きで 2 つのレジスタ (「reg1=reg2 の場合ジャンプ」)、1 つのレジスタ (「reg1=0 でない限りジャンプ」) を参照するか、ステータス レジスタ内の以前に設定されたビットを暗示的に参照するレジスタがない場合があります。 . 以下の条件付き実行も参照してください

間接登録

   +------+-----+
   |ジャンプビア| 登録 |
   +------+-----+

   (実効PCアドレス=レジスタregの内容)

レジスタ間接命令の実効アドレスは、指定されたレジスタ内のアドレスです。たとえば、(A7) アドレス レジスタ A7 の内容にアクセスします。

その効果は、アドレスが指定されたレジスターにある命令に制御を移すことです。

多くの RISC マシン、および CISC IBM System/360およびその後継機には、戻りアドレスをアドレス レジスタに配置するサブルーチン呼び出し命令があります。サブルーチン呼び出しから戻るには、レジスタ間接アドレッシング モードが使用されます。

シーケンシャル アドレッシング モード

順次実行

   +--------+
   | | いや | 次の命令を実行します
   +--------+

   (実効PCアドレス=次命令アドレス)

CPU は、シーケンシャルな命令を実行した後、すぐに次の命令を実行します。

一部のコンピューターでは、順次実行はアドレッシング モードとは見なされません。

ほとんどの CPU アーキテクチャのほとんどの命令は順次命令です。ほとんどの命令はシーケンシャル命令であるため、CPU 設計者は、これらのシーケンシャル命令をより高速に実行するために、他の命令 (分岐命令) のパフォーマンスを意図的に犠牲にする機能を追加することがよくあります。

条件付き分岐は、条件に応じて 2 つの可能な結果のいずれかで PC をロードします。ほとんどの CPU アーキテクチャは、「実行された」分岐には他のアドレッシング モードを使用し、「実行されなかった」分岐には順次実行を使用します。

最新の CPU の多くの機能 (命令のプリフェッチ、より複雑なパイプライン処理アウトオブオーダー実行など) は、内部で正確に起こるわけではありませんが、次の命令が始まる前に各命令が終了し、同じ最終結果が得られるという錯覚を維持します。 .

このような順次命令の各「基本ブロック」は、参照の時間的局所性と空間的局所性の両方を示します

順次実行を使用しない CPU

プログラム カウンターを使用した順次実行を使用しない CPU は非常にまれです。一部の CPU では、各命令は常に次の命令のアドレスを指定します。このような CPU には、指定されたアドレスを保持する命令ポインターがあります。インクリメントする機能がないため、プログラム カウンターではありません。このような CPU には、 IBM 650SECD マシンLibrascope LGP-30、RTX 32Pなどのドラム メモリコンピュータが含まれます。[13]

他のコンピューティング アーキテクチャはさらに進んで、プログラム カウンターのさまざまな代替手段を使用してフォン ノイマンのボトルネックを回避しようとします。

条件付き実行

一部のコンピューター アーキテクチャには、条件付き命令 ( ARMなど、64 ビット モードのすべての命令ではなくなりました) または条件付きロード命令 (x86 など) があり、場合によっては条件付き分岐が不要になり、命令パイプラインのフラッシュを回避できます。「比較」などの命令を使用して条件コードを設定し、後続の命令にはその条件コードに対するテストが含まれており、それに従っているか無視されているかを確認します。

スキップ

   +-----+-----+-----+
   |skipEQ| reg1| reg2| reg1=reg2 の場合、次の命令をスキップする
   +-----+-----+-----+

   (有効PCアドレス=次命令アドレス+1)

スキップ アドレッシングは、固定の「+1」オフセットを持つ特別な種類の PC 相対アドレッシング モードと見なすことができます。PC 相対アドレッシングと同様に、一部の CPU にはこのアドレッシング モードのバージョンがあり、1 つのレジスタのみを参照するか (「reg1=0 の場合はスキップ」)、またはレジスタを参照せず、ステータス レジスタ内の以前に設定されたビットを暗黙的に参照します他の CPU には、特定のバイトの特定のビットを選択してテストするバージョンがあります (「reg12 のビット 7 が 0 の場合はスキップ」)。

他のすべての条件付き分岐とは異なり、「スキップ」命令は命令パイプラインをフラッシュする必要はありませんが、次の命令を無視する必要がある場合があります。

データの単純なアドレス指定モード

データのいくつかの簡単なアドレッシング モードを以下に示します。命名法は、プラットフォームによって異なる場合があります。

登録 (または直接登録)

   +-----+-----+-----+-----+
   | | ムル | reg1| reg2| reg3| reg1 := reg2 * reg3;
   +-----+-----+-----+-----+

この「アドレッシング モード」には有効なアドレスがなく、一部のコンピュータではアドレッシング モードとは見なされません。

この例では、すべてのオペランドがレジスターにあり、結果がレジスターに配置されます。

ベースとオフセット、およびバリエーション

これは、「ベース プラス ディスプレイスメント」と呼ばれることもあります。

   +-----+-----+-----+----------------+
   | | 負荷 | 登録 | ベース| オフセット | reg := RAM[ベース + オフセット]
   +-----+-----+-----+----------------+

   (実効アドレス = オフセット + 指定ベースレジスタの内容)

オフセットは通常、符号付きの16 ビット値です (ただし、80386では 32 ビットに拡張されています)。

オフセットがゼロの場合、これはレジスタ間接アドレッシングの例になります。実効アドレスは、ベース レジスタの値だけです。

多くの RISC マシンでは、レジスタ 0 は値 0 に固定されています。レジスタ 0 をベース レジスタとして使用する場合、これは絶対アドレッシングの例になります。ただし、メモリーのごく一部しかアクセスできません (オフセットが 16 ビットの場合、 64キロバイト)。

16 ビット オフセットは、現在のコンピューター メモリのサイズに比べて非常に小さいように見える場合があります (これが、80386が 32 ビットに拡張された理由です)。さらに悪いことに、IBM System/360 メインフレームには符号なしの 12 ビット オフセットしかありません。ただし、参照の局所性の原則が適用されます。短期間に、プログラムがアクセスするほとんどのデータ項目は、互いに非常に近くにあります。

このアドレッシング モードは、インデックス付き絶対アドレッシング モードと密接に関連しています。

例 1 : サブルーチン内で、プログラマーは主にパラメータとローカル変数に関心がありますが、これらが 64 KBを超えることはめったになく、1 つのベース レジスタ (フレーム ポインタ) で十分です。このルーチンがオブジェクト指向言語のクラス メソッドである場合、現在のオブジェクトの属性 (高水準言語では thisまたはself ) を指す 2 番目のベース レジスタが必要です。

例 2 : ベース レジスタに複合型(レコードまたは構造) のアドレスが含まれている場合、オフセットを使用してそのレコードからフィールドを選択できます (ほとんどのレコード/構造のサイズは 32 kB 未満です)。

即時/リテラル

   +-----+-----+-----+----------------+
   | | 追加 | reg1| reg2| 定数 | reg1 := reg2 + 定数;
   +-----+-----+-----+----------------+

この「アドレッシング モード」には有効なアドレスがなく、一部のコンピュータではアドレッシング モードとは見なされません。

定数は、符号付きまたは符号なしの場合があります。たとえば、move.l #$FEEDABBA, D0「FEEDABBA」の 16 進値の即値をレジスタ D0 に移動するには、次のようにします。

メモリからオペランドを使用する代わりに、オペランドの値は命令自体に保持されます。DEC VAX マシンでは、リテラル オペランドのサイズは 6、8、16、または 32 ビット長でした。

Andrew Tanenbaumは、プログラム内のすべての定数の 98% が 13 ビットに収まることを示しました (「RISC 設計哲学」を参照)。

暗黙的

   +-----------------+
   | | キャリービットをクリア |
   +-----------------+

   +---------------------+
   | | アキュムレータをクリア |
   +---------------------+

暗黙のアドレス指定モード ( x86 アセンブリ言語) とも呼ばれる暗黙のアドレス指定モードでは、ソースまたは宛先 (場合によっては両方) の実効アドレスを明示的に指定しません。

送信元 (存在する場合) または送信先の実効アドレス (または場合によっては両方) のいずれかがオペコードによって暗示されます。

古いコンピューター (1970 年代半ばまで) では、暗黙のアドレス指定は非常に一般的でした。このようなコンピューターには通常、演算を実行できるレジスタが 1 つしかありませんでした。これはアキュムレータです。このようなアキュムレータ マシンは、ほぼすべての命令でそのアキュムレータを暗黙的に参照します。たとえば、操作 < a := b + c; > シーケンス < load b; を使用して実行できます。c; を追加します。保存します。> -- 宛先 (アキュムレータ) は、すべての「ロード」および「追加」命令で暗示されます。ソース (アキュムレータ) は、すべての「ストア」命令で暗示されます。

後のコンピューターには、一般に、算術のソースまたは宛先、またはその両方になる可能性のある 複数の汎用レジスタまたは RAM の場所がありました。

x86 命令の中には、オペランドまたは結果 (乗算、除算、条件付きジャンプのカウント) の 1 つに暗黙的なレジスタを使用するものがあります。

多くのコンピューター (x86 や AVR など) には、スタック ポインターと呼ばれる 1 つの専用レジスタがあり、スタックからデータをプッシュまたはポップするときに暗黙的にインクリメントまたはデクリメントされます。ソースまたは宛先の実効アドレスは、(暗黙的に) その中に格納されているアドレスです。スタック ポインタ。

多くの 32 ビット コンピュータ (68000、ARM、PowerPC など) には、スタック ポインタとして使用できる複数のレジスタがあります。スタックからのデータのプッシュまたはポップ。

一部の現在のコンピュータ アーキテクチャ (IBM/390 や Intel Pentium など) には、以前の設計との下位互換性を維持するために、暗黙のオペランドを持つ命令が含まれています。

多くのコンピューターでは、ユーザー/システム モード ビット、割り込み有効ビットなどを反転する命令は、それらのビットを保持する特殊レジスタを暗黙的に指定します。これにより、 Popek および Goldberg の仮想化要件を満たすためにこれらの命令をトラップするために必要なハードウェアが簡素化されます。このようなシステムでは、トラップ ロジックはオペランド (または最終実効アドレス) を調べる必要はなく、オペコードのみを調べます。 .

すべての命令ですべてのオペランドが常に暗黙的に指定されるように設計された少数の CPU、つまりゼロオペランドCPU。

コードまたはデータのその他のアドレッシング モード

絶対/直接

   +--------+-----+------------------------------------ --+
   | | 負荷 | 登録 | 住所 |
   +--------+-----+------------------------------------ --+

   (実効アドレス=命令で与えられたアドレス)

これには、非常に大きなアドレスの命令にスペースが必要です。多くの場合、 x86などの可変長命令を持つ CISC マシンで使用できます

一部の RISC マシンには、レジスタの上半分に 16 ビットまたは 20 ビットの定数を配置する特別なLoad Upper Literal命令があります。これは、下位 16 ビットまたは 12 ビットを供給するベース プラス オフセット アドレッシング モードでベース レジスタとして使用できます。この組み合わせにより、完全な 32 ビット アドレスが可能になります。

インデックス付き絶対

   +-----+-----+-----+---------------------------------- --+
   | | 負荷 | reg |インデックス| 住所 |
   +-----+-----+-----+---------------------------------- --+

   (実効アドレス=アドレス+指定インデックスレジスタの内容)

これには、非常に大きなアドレス用の命令内のスペースも必要です。アドレスは配列またはベクトルの開始である可能性があり、インデックスは必要な特定の配列要素を選択する可能性があります。プロセッサは、インデックス レジスタをスケーリングして、各配列要素のサイズを考慮に入れることができます。

これは、この場合のオフセットが任意のメモリ位置をアドレス指定するのに十分な大きさであることを除いて、ベース プラス オフセット アドレッシング モードとほぼ同じであることに注意してください。

例 1 : サブルーチン内で、プログラマーは文字列をローカル定数または静的変数として定義できます。文字列のアドレスは、命令のリテラル アドレスに格納されます。オフセット (ループのこの繰り返しで使用する文字列の文字) は、インデックス レジスタに格納されます。

例 2 : プログラマは、いくつかの大きな配列をグローバル変数またはクラス変数として定義する場合があります。配列の先頭は、それを参照する命令のリテラル アドレス (おそらく、再配置ローダーによってプログラムのロード時に変更される) に格納されます。オフセット (ループのこの反復で使用する配列の項目) は、インデックス レジスタに格納されます。多くの場合、ループ内の命令は、ループ カウンターと複数の配列のオフセットに同じレジスタを再利用します。

ベース プラス インデックス

   +-----+-----+-----+-----+
   | | 負荷 | 登録 | ベース|インデックス|
   +-----+-----+-----+-----+

   (実効アドレス = 指定ベースレジスタの内容 + 指定インデックスレジスタの内容)

ベース レジスタには配列またはベクトルの開始アドレスを含めることができ、インデックスは必要な特定の配列要素を選択することができます。プロセッサは、インデックス レジスタをスケーリングして、各配列要素のサイズを考慮に入れることができますこれは、パラメーターとして渡された配列の要素にアクセスするために使用できます。

ベース プラス インデックス プラス オフセット

   +-----+-----+-----+-----+----------------+
   | | 負荷 | 登録 | ベース|インデックス| オフセット |
   +-----+-----+-----+-----+----------------+

   (実効アドレス = オフセット + 指定ベースレジスタの内容 + 指定インデックスレジスタの内容)

ベース レジスタにはレコードの配列またはベクトルの開始アドレスを含めることができ、インデックスは必要な特定のレコードを選択でき、オフセットはそのレコード内のフィールドを選択できます。プロセッサは、インデックス レジスタをスケーリングして、各配列要素のサイズを考慮に入れることができます。

スケーリング

   +-----+-----+-----+-----+
   | | 負荷 | 登録 | ベース|インデックス|
   +-----+-----+-----+-----+

   (実効アドレス = 指定されたベースレジスタの内容 + 指定されたインデックスレジスタのスケーリングされた内容)

ベース レジスタには、配列またはベクトル データ構造の開始アドレスを含めることができ、インデックスには、必要な 1 つの特定の配列要素のオフセットを含めることができます。

このアドレッシング モードは、インデックス レジスタの値を動的にスケーリングして、各配列要素のサイズを考慮します。たとえば、配列要素がそれぞれ 8 バイトを占有する倍精度浮動小数点数の場合、インデックス レジスタの値は 8 倍されてから、実効アドレスの計算に使用されます。通常、倍率は 2のべき乗に制限されているため、乗算ではなく シフトを使用できます。

間接登録

   +-----+------+-----+
   | | 負荷 | reg1 | ベース|
   +-----+------+-----+
 
   (実効アドレス=ベースレジスタの内容)

いくつかのコンピュータは、これを個別のアドレッシング モードとして備えています。多くのコンピューターは、オフセット値 0 のbase と offsetを使用するだけです。たとえば、(A7)

自動インクリメント間接登録

   +------+-----+-------+
   | | 負荷 | 登録 | ベース |
   +------+-----+-------+

   (実効アドレス=ベースレジスタの内容)

実効アドレスが決定された後、アクセスされるデータ項目のサイズだけベース レジスタの値がインクリメントされます。たとえば、(A7)+ はアドレス レジスタ A7 の内容にアクセスし、A7 のアドレス ポインタを 1 (通常は 1 ワード) 増やします。ループ内では、このアドレッシング モードを使用して、配列またはベクトルのすべての要素をステップ実行できます。

高水準言語では、結果を返す関数に副作用があってはならないというのは良い考えであると考えられることがよくあります(副作用がないことで、プログラムの理解と検証がはるかに容易になります)。このアドレッシング モードには、ベース レジスタが変更されるという副作用があります。後続のメモリ アクセスでエラー (ページ フォールト、バス エラー、アドレス エラーなど) が発生して割り込みが発生した場合、1 つまたは複数のレジスタを以前の状態に戻す必要があるため、命令の再起動がさらに問題になります。命令は最初に開始されました。

このアドレス指定モードが使用されている場合、割り込みからの回復に関して実装上の問題があったコンピューター アーキテクチャが少なくとも 2 つあります。

  • Motorola 68000 (アドレスは 24 ビットで表されます)。1 つまたは 2 つの自動インクリメント レジスタ オペランドを持つことができます。68010 + では、プロセッサの内部状態をバスまたはアドレス エラーで保存することで問題を解決しました。
  • DEC VAX。最大 6 つの自動インクリメント レジスタ オペランドを持つことができます。各オペランド アクセスにより、2 つのページ フォールトが発生する可能性があります(オペランドがたまたまページ境界にまたがった場合)。もちろん、命令自体は 50 バイトを超える可能性があり、ページ境界をまたぐ可能性もあります!

自動減分間接を登録する

   +-----+-----+-----+
   | | 負荷 | 登録 | ベース|
   +-----+-----+-----+

   (実効アドレス=ベースレジスタの新しい内容)

実効アドレスを決定する前に、アクセスするデータ項目のサイズだけベース レジスタの値を減らします。

ループ内で、このアドレス指定モードを使用して、配列またはベクトルのすべての要素を逆方向にステップ実行できます。このモードを前のアドレッシング モード (オートインクリメント) と組み合わせて使用​​することにより、スタックを実装できます。

自動インクリメント アドレッシング モードでの副作用の説明を参照してください

メモリ間接

この記事で言及されているアドレッシング モードのいずれにも、間接アドレッシングを示す余分なビットがあります。つまり、あるモードを使用して計算されたアドレスは、実際には実際の実効アドレスを含む ロケーション (通常は完全なワード) のアドレスです。

間接アドレッシングは、コードまたはデータに使用できます。これにより、ポインター参照、またはハンドルの実装がはるかに簡単になり、他の方法ではアドレス指定できないサブルーチンを簡単に呼び出すこともできます。間接アドレス指定では、余分なメモリ アクセスが必要になるため、パフォーマンスが低下します。

一部の初期のミニコンピュータ (たとえば DEC PDP-8Data General Novaなど) には少数のレジスタしかなく、限られた直接アドレス指定範囲 (8 ビット) しかありませんでした。したがって、メモリ間接アドレッシングの使用は、大量のメモリを参照するほとんど唯一の方法でした。

PC相対

   +-----+------+---------+----------------+
   | | 負荷 | reg1 | ベース=PC | オフセット |
   +-----+------+---------+----------------+

   reg1 := RAM[PC + オフセット]
   (実効アドレス=PC+オフセット)

PC 相対アドレッシング モードを使用すると、現在の命令から少し離れた場所にあるプログラム メモリに格納されている値をレジスタにロードできます。これは、プログラム カウンタ (PC) を「ベース レジスタ」として選択する「ベース プラス オフセット」アドレッシング モードの特殊なケースと見なすことができます。

PC 相対データ参照をサポートする CPU がいくつかあります。このような CPU には次のものがあります。

MOS 6502とその派生製品は、すべての分岐命令に相対アドレス指定を使用していました。これらの命令のみがこのモードを使用し、ジャンプは他のさまざまなアドレッシング モードを使用しました。

x86-64アーキテクチャと 64 ビットARMv8-Aアーキテクチャ[14]には、PC 相対アドレッシング モードがあり、x86-64 では「RIP 相対」、ARMv8-A では「リテラル」と呼ばれます。Motorola 6809、PC 相対アドレッシング モードもサポートしています。

PDP-11アーキテクチャ、VAXアーキテクチャ、および 32 ビットARM アーキテクチャは、PC をレジスタ ファイルに含めることにより、PC 相対アドレッシングをサポートします。

IBM z/Architectureには、General-Instructions-Extension Facility がアクティブな場合、PC 相対アドレッシングを使用する特定の命令 (Load Relative Long など) が含まれています

このアドレッシング モードが使用される場合、コンパイラは通常、定数を使用するサブルーチンの直前または直後に 定数をリテラル プールに配置して、それらの定数が誤って命令として実行されるのを防ぎます。

このアドレッシング モードは、常にメモリからデータをフェッチするか、データをメモリに格納してから、次の命令を実行するために順次フォールスルーします (実効アドレスはデータを指します)。データをフェッチしない「PC 相対分岐」と混同しないでください。データをメモリから、またはメモリに保存しますが、代わりに、指定されたオフセットで他の命令に分岐します (実効アドレスは実行可能な命令を指します)。

廃止されたアドレッシング モード

ここにリストされているアドレッシング モードは 1950 ~ 1980 年の期間に使用されていましたが、現在のほとんどのコンピューターでは使用できなくなりました。このリストは決して完全ではありません。他にも多くの興味深い独特のアドレッシング モードが時々使用されてきました。たとえば、2 つまたは 3 つのインデックス レジスタの絶対マイナス論理和などです。[15] [16]

多段メモ​​リ間接

ワード サイズがアドレスよりも大きい場合、メモリ間接アドレッシングで参照されるワード自体に、別のメモリ間接サイクルを示す間接フラグが設定されている可能性があります。このフラグは間接ビットと呼ばれ、結果のポインターはタグ付きポインターであり、直接ポインターか間接ポインターかをタグ付けする間接ビットです。間接アドレスのチェーンがそれ自体を参照しないように注意する必要があります。その場合、アドレスを解決しようとしているときに 無限ループが発生する可能性があります。

IBM 1620Data General NovaHP 2100シリーズ、およびNAR 2はそれぞれ、このようなマルチレベル メモリ間接を備えており、このような無限のアドレス計算ループに入る可能性があります。Nova のメモリ間接アドレッシング モードは、間接スレッド コードの発明に影響を与えました。

18 ビットアドレスと36 ビットワードを使用するDEC PDP-10コンピュータでは、各段階でインデックス レジスタを使用する可能性があるマルチレベルの間接アドレス指定も可能でした。優先割り込みシステムは、すべてのアドレス ワードをデコードする前に照会されました。[17]したがって、間接アドレス ループは、プリエンプティブ マルチタスクスケジューラのタイム スライス期限切れハンドラ を含む、デバイス サービス ルーチンの実行を妨げません。ループ命令は、他のコンピューティング バウンド ジョブと同様に扱われます。

メモリ マップド レジスタ

一部のコンピュータでは、プライマリ ストレージではなくレジスタを参照するアドレス、またはそれらのレジスタを実装するために使用されるプライマリ メモリを参照するアドレスがありました。IBM 650 [18] [a]IBM 7070 [19] [c]のように、一部の初期のコンピュータではアドレス範囲の上限にレジスタ アドレスがありましたが、傾向としては下位のレジスタ アドレスのみを使用するようになっています。最後に、メモリの最初の 8 または 16 ワードのみを使用します (たとえば、 ICL 1900、DEC PDP-10)。これは、別の「レジスタにレジスタを追加」命令が不要であることを意味し、「レジスタにメモリを追加」命令を使用するだけで済みました。

キャッシュ メモリを持たない PDP-10 の初期モデルの場合、メモリの最初の数ワード (インストールされていれば高速レジスタがアドレス指定可能) にロードされたタイトな内部ループは、以前のモデルよりもはるかに高速に実行されました。磁気コアメモリ。

DEC PDP-11シリーズの後のモデルでは、レジスタが入出力領域のアドレスにマップされましたが、これは主にリモート診断を可能にすることを目的としていました。紛らわしいことに、16 ビット レジスタは連続した 8 ビット バイト アドレスにマッピングされていました。

メモリ間接および自動インクリメント

DEC PDP-8ミニコンピュータには、8 つの特別な場所 (アドレス 8 から 15) がありました。メモリ間接アドレッシングを介してアクセスすると、これらの位置は使用前に自動的にインクリメントされます。[20]これにより、アキュムレータを使用してアドレスをインクリメントする必要なく、ループでメモリをステップスルーすることが容易になりました。

Data General Novaミニコンピュータには、アドレス 16 から 31 に 16 の特別なメモリ ロケーションがありました。

ゼロページ

Data General NovaMotorola 6800ファミリ、およびMOS Technology 6502ファミリのプロセッサには、内部レジスタがほとんどありませんでした。算術および論理命令は、ほとんどの場合、内部レジスタではなく、メモリ内の値に対して実行されました。その結果、多くの命令はメモリに 2 バイト (16 ビット) の場所を必要としました。これらのプロセッサのオペコードの長さが 1 バイト (8 ビット) しかなかったことを考えると、メモリ アドレスがコード サイズのかなりの部分を占める可能性があります。

これらのプロセッサの設計者は、「ゼロ ページ」アドレッシングとして知られる部分的な改善策を取り入れました。メモリの最初の 256 バイト ($0000 – $00FF; 別名、ページ "0") には、1 バイトの絶対またはインデックス付きメモリ アドレスを使用してアクセスできます。これにより、命令の実行時間が 1 クロック サイクル短縮され、命令の長さが 1 バイト短縮されました。頻繁に使用するデータをこの領域に格納することで、プログラムをより小さく、より高速にすることができます。

その結果、ゼロページはレジスタファイルと同様に使用されました。しかし、多くのシステムでは、これにより、オペレーティング システムとユーザー プログラムによるゼロ ページ メモリ領域の使用率が高くなり、空き領域が限られているため、その使用が制限されていました。

ダイレクトページ

ゼロ ページ アドレス モードは、 WDC 65816CSG 65CE02 、Motorola 6809など、いくつかの最新モデルの 8 ビット プロセッサで強化されました「ダイレクト ページ」アドレッシングと呼ばれる新しいモードでは、256 バイトのゼロ ページ メモリ ウィンドウをメモリの先頭 (オフセット アドレス $0000) からメモリの最初の 64 KB 内の新しい場所に移動する機能が追加されました。

CSG 65CE02 では、新しいベース ページ (B) レジスタに 8 ビットのオフセット値を格納することにより、ダイレクト ページをメモリの最初の 64 KB 内の任意の 256 バイト境界に移動できました。Motorola 6809 は、ダイレクト ページ (DP) レジスタで同じことを行うことができます。WDC 65816 はさらに一歩進んで、新しいダイレクト (D) レジスタに 16 ビットのオフセット値を格納することで、メモリの最初の 64 KB 内の任意の場所にダイレクト ページを移動できるようにしました。

その結果、より多くのプログラムが、ゼロ ページ アドレッシング モードのみを含むレガシー プロセッサと比較して、拡張ダイレクト ページ アドレッシング モードを利用することができました。

境界チェック付きのスケーリングされたインデックス

これは、命令に 2 つの余分なオペランド (通常は定数) があり、インデックス値がこれらの境界の間にあることをハードウェアがチェックすることを除いて、スケーリングされたインデックス アドレッシングに似ています。

別のバリエーションでは、ベクトル記述子を使用して境界を保持します。これにより、動的に割り当てられた配列を簡単に実装し、完全な境界チェックを行うことができます。

ワード内のビットフィールドへの間接

一部のコンピューターには、単語内のサブフィールド用の特別な間接アドレス指定モードがありました。

GE/Honeywell 600 シリーズキャラクタ アドレス指定間接語は、36 ビットワード内で 6 ビットまたは 9 ビットの文字フィールドを指定していました。

同じく 36 ビットの DEC PDP-10には、メモリを一連の固定サイズのビット フィールドまたは 1 ビットから 36 ビットまでの任意のサイズのバイトとして処理できる特別な命令がありました。「バイト ポインター」と呼ばれるメモリ内の 1 ワード シーケンス記述子は、シーケンス内の現在のワード アドレス、ワード内のビット位置、および各バイトのサイズを保持していました。

この記述子を介してバイトをロードおよび格納し、次のバイトを指すように記述子をインクリメントする命令が存在しました (バイトはワード境界を越えて分割されませんでした)。多くの DEC ソフトウェアは、1 ワードあたり 5 つの 7 ビット バイト (プレーン ASCII 文字) を使用し、1 ワードあたり 1 ビットは未使用でした。Cの実装では、1 ワードあたり 4 つの 9 ビット バイトを使用する必要がありました。これは、C の「malloc」関数がintのサイズがcharのサイズの倍数であると想定しているためです。[22]実際の倍数は、システム依存のコンパイル時の演算子sizeofによって決定されます。

次の命令のインデックス

エリオット 503[23]エリオット 803[23] [24]およびアポロ ガイダンス コンピューターは、絶対アドレス指定のみを使用し、インデックス レジスタはありませんでした。したがって、間接ジャンプ、またはレジスターを介したジャンプは、命令セットではサポートされていませんでした。代わりに、現在のメモリ ワードの内容を次の命令に追加するように指示できます。たとえば、実行される次の命令に小さな値を追加すると、 aJUMP 0が a に変更されJUMP 20、インデックス付きジャンプの効果が作成されます。命令はオンザフライで変更され、変更されずにメモリに残ります。つまり、自己変更コードではないことに注意してください。. 次の命令に追加される値が十分に大きい場合、アドレスの代わりに、またはその命令のオペコードを変更できます。

用語集

間接的
ポインタまたはアドレスを介して参照されるデータ
即時
命令またはコマンド リストに直接埋め込まれたデータ。
索引
動的オフセット。通常はインデックス レジスタに保持され、オブジェクト サイズによってスケーリングされる可能性があります。
オフセット
アドレスに追加される即値。たとえば、C プログラミング言語の構造体フィールド アクセスに相当します。
相対的
別のアドレスに関連して形成されるアドレス。
ポストインクリメント
スタック ポップ操作に使用されるC プログラミング言語*p++と同様に、使用されるデータを過ぎたアドレスのステッピング。
前デクリメント
使用前にアドレスをデクリメントすること。C プログラミング言語*--pと同様に、スタック プッシュ操作に使用されます。

も参照

注意事項

  1. ^ 650のコンデンサー収納ユニット:
    8000台のコンソール スイッチ
    8001ディストリビューター
    8002 下部アキュムレータ
    8003 上部アキュムレータ
  2. ^ a b コンソールからのみ有効
  3. ^ 5K または 10K の場合 7070
    00xx インデックスレジスタ xx
    9991 アキュムレータ 1
    9992 アキュムレータ 2
    9993 アキュムレータ 3
    9995 プログラムレジスタ[b]
    9999 命令カウンタ[b]

参考文献

  1. ^ F.チョウ; S.コレル; M.ヒメルスタイン; E.キリアン; L. ウェーバー (1987)。「いくつのアドレッシングモードで十分ですか?」. ACM Sigarch コンピューター アーキテクチャ ニュース15 (5): 117–121. ドイ: 10.1145/36177.36193 .
  2. ^ ジョン・L・ヘネシーマーク A. ホロウィッツ(1986)。「MIPS-X-MP プロジェクトの概要」(PDF) . ... MIPS-X は単一のアドレッシング モードを使用します: ベース レジスタとオフセット。この単純なアドレス指定モードにより、実効アドレスの計算を非常に早く開始できます...
  3. ^ ジョン・スクワイア博士. 「講義 19、データ転送のパイプライン化」 . CS411 選択された講義ノート.
  4. ^ 「ハイ パフォーマンス コンピューティング、クラス 11 のメモ (2000 年 9 月 15 日および 20 日) - パイプライン処理」 . 2013-12-27にオリジナルからアーカイブ2014 年2 月 8 日閲覧
  5. ^ ジョン・ポール・シェン、ミッコ・H・リパスティ (2004). 最新のプロセッサ設計マグロウヒル プロフェッショナルISBN 9780070570641.
  6. ^ a b ジョン L. ヘネシー。David A. Patterson (2002-05-29)。コンピューター アーキテクチャ: 定量的アプローチp。104.ISBN _ 9780080502526. C54x には 17 のデータ アドレス指定モードがあり、レジスタ アクセスはカウントされませんが、MIPS にある 4 つのモードがモードの 70% を占めています。一部の RISC アーキテクチャに見られる自動インクリメントと自動デクリメントは、使用量のさらに 25% を占めています。このデータは、アセンブリ言語でコーディングされた 54 の DSP ルーチンの C 呼び出し可能ライブラリの静的命令の測定から収集されました。
  7. ^ ソフィーヌ・タハール博士. 「命令セットの原則:アドレッシングモードの使い方(まとめ)」(PDF) . 2011-09-30のオリジナル(PDF)からのアーカイブ。すべてのアドレス モード (VAX) のマシンで測定された 3 つのプログラム ... 75% の変位と即時
  8. ^ Ali-Reza Adl-Tabatabai; ジェフ・ラングデール。スティーブン・ルッコ; ロバート・ワーベ (1995)。「効率的で言語に依存しないモバイル プログラム」 . プログラミング言語の設計と実装に関する ACM SIGPLAN 1996 会議の議事録 - PLDI '96pp.127–136。ドイ: 10.1145/231379.231402ISBN 0897917952. S2CID  2534344 . 実行されたすべての命令の 79% は、RISC 命令に置き換えるか、基本的なブロック命令の組み合わせのみを使用して RISC 命令に合成できます。
  9. ^ IBM System/360 の運用原則(PDF) . IBM。1968 年 9 月。135. A22-6821-7 . 2019年7月12日閲覧
  10. ^ z/Architecture Principles of Operation (PDF) . IBM。2017 年 9 月。pp. 7–266。SA22-7832-11 . 2019年7月12日閲覧
  11. ^ マックス・マックスフィールド. 「4 ビット コンピュータの構築: アセンブリ言語とアセンブラ」 . セクション「アドレッシング モード」。2019年。
  12. ^ コング、シン; パターソン、デビッド(1995)。「命令セットの設計」 . スライド 27。
  13. ^ コープマン、フィリップ (1989). 「RTX 32P のアーキテクチャ」 . スタック コンピューター
  14. ^ 「ARMv8 64 ビット アーキテクチャの概要」 . UICアカデミーquequero.org。2014 年 4 月 9 日。
  15. ^ 704 Electronic Data-Processing Machine Manual of Operation (PDF) . IBM1955. pp. 10–11.
  16. ^ リファレンス マニュアル IBM 7090 データ処理システム(PDF) . IBM。1962. pp. 9–10.
  17. ^ DEC-10-HMAA-D: PDP-10 KA10 中央処理装置保守マニュアル(PDF) (第 1 刷版)。マサチューセッツ州メイナードDigital Equipment Corporation1968 年 12 月。2-11 2021年5月15日閲覧図 2-9: 有効アドレスの計算: テスト "PI RQ ?"
  18. ^ 「収納」(PDF) . 650 磁気ドラムデータ処理機 - 操作マニュアル(PDF) . 1955 年 6 月。 9 . 22-6060-2 . 20223 月 14 日閲覧
  19. ^ 「コア ストレージとレジスタ アドレス」(PDF) . リファレンス マニュアル - IBM 7070 データ処理システム(PDF)1960 年 1 月。252. A22-7003-0 . 20223 月 14 日閲覧
  20. ^ Jones, Douglas, Reference Instructions on the PDP-8 , 2013 年7 月 1 日検索
  21. ^ Friend, Carl, Data General NOVA Instruction Set Summary 、 2013 年7 月 1 日取得
  22. ^ 「C リファレンス: 関数 malloc()」
  23. ^ a b デイブ・ブルックス. 「いくつかの古いコンピューター」 .
  24. ^ ビル・パーヴィス. 「Elliott 803B ハードウェアの詳細」

外部リンク