メモリ参照命令
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/04/21 02:01 UTC 版)
「データゼネラルNova」の記事における「メモリ参照命令」の解説
Nova命令セットには、メモリの内容をアキュムレータに転送する命令とその逆の命令のペア、2つの制御転送命令、およびメモリ・ロケーションの内容をテストする2つの命令が含まれている。 すべてのメモリ参照命令には、8ビットのアドレス・フィールドと、メモリ・アドレッシングのモードを指定する2ビットのフィールドが含まれていた。 4つのモードは次のとおりである: Mode 0 - 絶対アドレッシング。 命令のアドレス・フィールドの内容は左側がゼロで埋められ、ターゲット・アドレスとして使用されます。 Mode 1 - 相対アドレッシング。 命令のアドレス・フィールドの内容は、左に符号拡張され、プログラムカウンタの現在値(命令が実行されるまでに次の命令を指します)に加算する。 その結果がターゲット・アドレスとして使用される。 Mode 2 - インデックス・アドレッシング。 命令のアドレス・フィールドの内容が、左に符号拡張され、アキュムレータ2の現在値に加算される。その結果がターゲット・アドレスとして使用される。 Mode 3 - インデックス・アドレッシング。 命令のアドレス・フィールドの内容が、左に符号拡張され、アキュムレータ3の現在値に加算される。 その結果がターゲット・アドレスとして使用される。 明らかに、Mode 0は、8ビットのアドレス・フィールドがあるため、最初の256メモリ語だけをアドレス指定できた。 メモリのこの部分は「ページ・ゼロ」と呼ばれていた。 ページ・ゼロのメモリ・ワードは、利用可能な数が少ないため、Novaのアセンブリ言語プログラマにとって貴重なものと考えられていた。ページ・ゼロの場所だけが、インデックスレジスタとして使用するためにアキュムレータ2や3を縛る必要のあるインデックスアドレスに頼ることなく、プログラムのどこからでもアドレスを指定することができた。アセンブリ言語では、".ZREL" ディレクティブにより、アセンブラはそれに続く命令とデータ語をページ・ゼロに配置し、".NREL" ディレクティブにより、それに続く命令とデータ語を「通常の」メモリに配置した。後のNovaモデルでは、アドレス・フィールドを拡張した命令が追加され、この問題を克服した(性能的にはペナルティがある)。 アセンブラは、Mode 1の相対オフセットを自動的に計算するが、ソースに明示的に書き込むことも可能であった。 メモリ参照命令が .NREL 空間のメモリアドレスを参照しているがモード指定子がない場合、Mode 1が想定され、アセンブラは現在の命令と参照されている位置との間のオフセットを計算し、これを命令のアドレス・フィールドに配置した(結果として得られる値が8ビットフィールドに収まる場合)。 2つのロードおよびストア命令は次のとおりである: LDA - メモリ位置の内容を指定されたアキュムレータにロードする STA - 指定されたアキュムレータの内容をメモリ位置に格納する これらの命令には両方とも「間接(indirect)」ビットが含まれていた。 このビットがセットされている場合(アセンブリ言語ではオペコードに '@'を追加することで行われる)、ターゲット・アドレスの内容はメモリ・アドレスそのものであると仮定され、ロードまたはストアを行うためにそのアドレスが参照される。 2つの制御転送命令は次のとおりである: JMP - 指定されたメモリ位置に制御を移す JSR("jump subroutine")- JMP命令と同じであるが、ジャンプする前にリターン・アドレス(JSR命令に続く命令)を追加でアキュムレータ3にロードする ロードおよびストア命令と同様に、ジャンプ命令には間接ビットが含まれており、同様にアセンブリでは '@' 文字で指定されている。 間接ジャンプの場合、プロセッサはジャンプ先の内容を取得し、その値をジャンプ先のメモリアドレスとして使用する。 ただし、ロードおよびストア命令とは異なり、間接アドレスに最上位ビットがセットされている場合は、さらに1サイクルの間接ジャンプが実行される。 Nova 3より前のNovaシリーズプロセッサでは、間接アドレスの回数に制限はなかった。自分自身を参照する間接アドレスは、命令が完了することなく、無限に間接アドレッシングループが発生する。 (この状態では、フロントパネルのSTOPスイッチを押しても何もしないので、ユーザにとっては不安になるかもしれなかった。ループを解除するには、機械をリセットする必要があった。) 2つのメモリテスト命令は次のとおりである: ISZ - メモリ位置をインクリメントし、結果がゼロの場合は次の命令をスキップする DSZ - メモリ位置をデクリメントし、結果がゼロの場合は次の命令をスキップする ロードおよびストア命令の場合と同様に、1レベルの間接アドレス指定を実行する間接ビットがあった。 これらの命令は、磁気コアメモリを搭載したNovaでは、メモリ基板自体の内で命令が実行されるという点で奇妙なものだった。 当時のメモリ基板には、磁気コアメモリに内在する破壊的な読み出し問題を解決するための「ライトバック」回路が搭載されていた。 しかし、ライトバック機構には、ミニ演算ユニットも含まれており、これはプロセッサがいくつかの目的で使用していた。 ISZ命令とDSZ命令では、読み取られたメモリ位置からライトバックが行われるまでの間にインクリメントまたはデクリメントが行われ、CPUは単に結果がゼロか非ゼロかの通知を待つだけであった。 これらの命令は、アキュムレータを拘束することなくメモリ位置をループカウンタとして使用できるため便利であったが、同等の算術命令よりも処理速度が遅くなった。 メモリ参照命令の例: LDA 1,COUNT COUNTというラベルのメモリ・ロケーションの内容をアキュムレータ1に転送する。 COUNTが .NREL 空間にあると仮定すると、この命令は次のようになる: LDA 1,1,(COUNT-(.+1)) ここで、'.' はLDA命令の位置を表す。 JSR@ 0,17 ページ・ゼロ空間のロケーション17の内容で指定されたメモリアドレスに間接的にジャンプし、リターンアドレスをアキュムレータ3に格納する。 これは、初期のNovaモデルでRDOSシステムコールを行うための標準的な方法で、アセンブリ言語のニーモニック ".SYSTM" はこれに変換される。 JMP 0,3 アキュムレータ3にアドレスが格納されているメモリ位置にジャンプする。 JSR命令はリターンアドレスをアキュムレーター3に残しているので、これは関数やサブルーチン呼び出しから戻るための一般的な方法であった。 STA 0,3,-1 アキュムレータ0の内容を、アキュムレータ3に含まれるアドレスより1つ少ない位置に格納する。 DSZ COUNT COUNTというラベルの場所の値をデクリメントし、結果がゼロの場合は次の命令をスキップする。上記の場合と同様に、COUNTが .NREL 空間にあると仮定すると以下のようになる: DSZ 1,(COUNT-(.+1))
※この「メモリ参照命令」の解説は、「データゼネラルNova」の解説の一部です。
「メモリ参照命令」を含む「データゼネラルNova」の記事については、「データゼネラルNova」の概要を参照ください。
- メモリ参照命令のページへのリンク