間接アドレッシング

間接アドレッシング

間接アドレッシング

英語表記: Indirect Addressing

概要

間接アドレッシング(Indirect Addressing)とは、CPUの命令セットアーキテクチャ(ISA)におけるアドレッシングモードの一つで、命令のオペランド部に、実際に処理対象となるデータが格納されている場所(メモリ番地)ではなく、そのアドレス情報が格納されている場所を指定する方式です。データにたどり着くために、メモリを二段階で参照する点が特徴的で、「間接的」という名前の由来となっています。

この方式は、特にプログラムの柔軟性を高めるために非常に重要です。私たちが現在学んでいる「CPUの仕組み(命令セット)」において、データ参照の仕組みを規定するアドレッシングモードは、ISAの性能を左右する基本的な要素の一つだと言えますね。

詳細解説

目的とISAにおける位置づけ

間接アドレッシングが命令セットアーキテクチャ(ISA)の中で採用される主な目的は、柔軟性と効率的なメモリ管理を実現することにあります。

もし命令が常に直接アドレッシング(データのアドレスを命令に直接書き込む方式)しか使えなかった場合、プログラム実行中に処理対象のアドレスを変更することが難しくなります。しかし、間接アドレッシングを使えば、命令自体は変えずに、参照先のメモリ(アドレス情報が格納されている場所)の内容を書き換えるだけで、参照するデータを動的に変更できます。これは、配列やリスト構造、またはプログラミングにおける「ポインタ」の概念を実現するために不可欠な機能なのです。

私見ですが、この機能のおかげで、私たちはC言語のような高級言語で複雑なデータ構造を扱えるようになっている、と言っても過言ではありません。

動作原理:二段階の参照

間接アドレッシングの動作は、必ず二段階のメモリアクセスを伴います。これが性能と柔軟性のトレードオフを生むポイントであり、理解の核心です。

  1. 命令の解釈(第1段階):
    CPUが命令をフェッチし、デコードする際、オペランド部に指定された値(仮にAとします)を読み取ります。このAは、目的のデータそのものではなく、データのアドレスが格納されているメモリ番地です。
  2. 実効アドレスの取得(第2段階):
    CPUは、A番地のメモリにアクセスし、そこに格納されている値(仮にBとします)を取得します。このBこそが、目的のデータが存在する実効アドレス(真のアドレス)です。
  3. データ取得:
    最後に、CPUはB番地のメモリにアクセスし、目的のデータそのものを取得します。

このように、データ取得までに最低2回のメモリ参照が必要となります。CPUの仕組みとして見ると、メモリへのアクセスは通常、非常に時間がかかる処理(CPUの動作速度に比べて遅い)であるため、間接アドレッシングは直接アドレッシングに比べて処理速度が低下する可能性がある、という点も理解しておく必要があります。しかし、その引き換えに得られるプログラミング上の柔軟性や、大きなメモリ空間を効率的に扱う能力は、現代のISA設計においては不可欠な要素なのです。

CPUの仕組みとアドレッシングモードの重要性

この間接アドレッシングを含む各種アドレッシングモードは、「CPUの仕組み(命令セット)」の中で、データ処理の効率化と柔軟性を担う重要な役割を果たしています。命令セットアーキテクチャ(ISA)が多様なアドレッシングモードを提供することで、コンパイラはより効率的でコンパクトな機械語コードを生成できるようになります。間接アドレッシングは、特に複雑なデータ構造へのアクセスを、短い命令で実現するための強力なツールなのです。

具体例・活用シーン

図書館のロッカーの鍵:間接アドレッシングのアナロジー

間接アドレッシングの概念は、初心者の方には少し難しく感じられるかもしれませんので、身近な例で考えてみましょう。

あなたが大きな図書館で、必要な資料(データ)を探していると想像してください。

  1. 直接アドレッシングの場合: 司書さんが「あなたの探している資料は、書架のA-10番にあります!」と教えてくれます。あなたは直接A-10番に行き、資料を手に取ることができます。これは速いですが、資料の場所が変わると、司書さんの指示(命令)を毎回変更しなくてはなりません。

  2. 間接アドレッシングの場合: 司書さんは「あなたの資料は、入口にあるロッカーの鍵を使わないと取り出せません。ロッカーの鍵は、受付の3番の引き出しに入っています!」と教えてくれます。

    • 命令のオペランド: 「受付の3番の引き出し」を指定しています(第1段階のアドレス)。
    • あなたはまず受付の3番の引き出しに行き、ロッカーの鍵(実効アドレス)を取り出します。
    • その鍵を使って、ロッカーを開け、中から目的の資料(データ)を取り出します。

ここで重要なのは、「受付の3番の引き出し」の中身(鍵)を変えるだけで、あなたが取り出す資料(データ)を簡単に変更できる点です。資料が書架のB-20番に移動しても、司書さんは「3番の引き出しの中の鍵」を新しい鍵に交換するだけで、あなたの命令(受付の3番の引き出しを見ろ、という指示)を変える必要はありません。

このように、間接アドレッシングは、参照先を柔軟に変更したい場面で力を発揮します。

実際の活用シーン(プログラミング)

  • ポインタの実装: C言語などで頻繁に使用されるポインタは、まさに間接アドレッシングの考え方そのものです。ポインタ変数にはデータのアドレスが格納されており、そのポインタを経由して実際のデータにアクセスします。
  • 配列処理: 大きな配列を扱う際、配列の基点アドレスをレジスタに格納し、そのレジスタを間接的に参照することで、効率的なループ処理を実現します。
  • サブルーチン(関数)からのリターン: サブルーチンから呼び出し元に戻る際のアドレスをスタックに格納し、間接的にそのアドレスを参照して制御を戻す、といった動きにもこの概念が使われています。

資格試験向けチェックポイント

間接アドレッシングは、基本情報技術者試験や応用情報技術者試験において、CPUの動作原理やメモリ管理の基礎知識を問う上で頻出するテーマです。特に「アドレッシングモード」の違いを理解することが重要になります。

  • 二段階参照の理解:
    • 重要ポイント: 命令のオペランドが示すのは「データのアドレス」ではなく、「データのアドレスが格納されている場所のアドレス」である、という点を確実に押さえましょう。
    • 出題形式: 間接アドレッシングを採用した場合、目的のデータを得るまでに最低何回のメモリ参照が必要か?(答え:2回)といった計算問題や概念問題がよく出ます。
  • 直接アドレッシングとの明確な区別:
    • 直接アドレッシング: オペランドに実効アドレスが直接記述されている方式。メモリ参照は1回で済むため高速だが、柔軟性に欠けます。
    • 間接アドレッシング: メモリ参照が2回必要だが、アドレスの動的な変更が可能で柔軟性が高い。
    • 試験対策: 速度(メモリ参照回数)と柔軟性のトレードオフを問う選択肢に注意が必要です。
  • ISAにおける役割:
    • 間接アドレッシングは、命令セットアーキテクチャ(ISA)が提供する機能の一つであり、これによってプログラミング言語のポインタや動的なメモリ割り当てが可能になっている、という文脈を理解しておきましょう。これは、応用情報技術者試験などで、ISAの設計思想を問う際に役立ちます。
  • 即値アドレッシングとの比較:
    • 即値アドレッシング(Immediate Addressing)は、オペランドにデータそのものが含まれている方式で、メモリ参照は0回です。間接アドレッシング(2回)と即値アドレッシング(0回)、直接アドレッシング(1回)のメモリ参照回数を比較する問題は、非常に典型的な出題パターンです。

関連用語

  • 情報不足: 現時点では、このエントリーを作成するための具体的な関連用語リストが提供されていません。

関連用語として学習するならば、以下の概念とセットで理解を深めることをお勧めします。

  • 直接アドレッシング (Direct Addressing): 間接アドレッシングの対義語として、最も比較対象となるアドレッシングモードです。
  • レジスタ間接アドレッシング (Register Indirect Addressing): 実効アドレスがメモリではなく、CPU内部のレジスタに格納されている形式です。基本的な概念は間接アドレッシングと同じですが、レジスタを参照するため高速化が図れます。
  • ポインタ (Pointer): プログラミング言語における概念で、間接アドレッシングによって実現される機能そのものです。
  • 命令セットアーキテクチャ (ISA): 間接アドレッシングを含む、CPUが解釈できるすべての命令の集合とその形式を定めた設計図です。

これらの用語を合わせて学ぶことで、「CPUの仕組み」における命令実行の全体像がより鮮明になるでしょう。特に、アドレッシングモードの種類を比較しながら理解することが、資格試験突破の鍵となります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

両親の影響を受け、幼少期からロボットやエンジニアリングに親しみ、国公立大学で電気系の修士号を取得。現在はITエンジニアとして、開発から設計まで幅広く活躍している。

目次