情報処理試験を勉強していると、「インデックスレジスタって結局何?ベースレジスタと何が違うの?」と混乱しがちです。
この記事では、インデックスレジスタの役割を日常の例え話で噛み砕き、他のレジスタとの違いや試験での出題パターンまで一気に整理します。
対象試験と出題頻度
インデックスレジスタは、基本情報技術者・応用情報技術者で出題されるテーマです。
CPU内部のレジスタの種類を比較する問題や、アドレス指定方式の計算問題で登場します。
詳細をクリックして確認
基本情報技術者
応用情報技術者
★★☆☆☆
ランクC(応用)余裕があれば覚える
用語の定義
インデックスレジスタ(Index Register/指標レジスタ)とは、一言で言うと
「アドレス修飾に用いるレジスタであり、命令のアドレス部を修飾するための増分値を保持する」
ものです。
イメージとしては、「本棚の “何冊目” を示す付箋」です。
本棚に並んだ辞書シリーズがあるとします。棚の左端(先頭アドレス)は決まっていて、「左端から3冊目」という付箋を貼っておけば、その付箋の数字を変えるだけで取り出す本を切り替えられます。
インデックスレジスタはまさにこの「何冊目か」を記録している付箋にあたります。
📊 インデックスレジスタの基本情報
| 項目 | 内容 |
|---|---|
| 英語名 | Index Register |
| 別名 | 指標レジスタ |
| 分類 | CPU内部のレジスタ(アドレス修飾用) |
| 主な用途 | 配列の連続アクセス、繰り返し処理でのアドレス変更 |
| 関連するアドレス指定方式 | 指標(インデックス)アドレス指定方式 |
解説
なぜインデックスレジスタが必要なのか
プログラムは、配列のように連続したメモリ領域に格納されたデータを順番に処理する場面が非常に多いです。
このとき、命令語のアドレス部に配列の先頭アドレスを書いておき、インデックスレジスタの値を1ずつ加算していけば、同じ命令を繰り返すだけで次々と異なる要素にアクセスできます。
もしこの仕組みがなければ、要素ごとに異なるアドレスを直接書いた命令を並べる必要があり、プログラムのサイズが膨大になります。
図解:指標アドレス指定方式の動き
実効アドレスの計算式は次の通りです。
指標(インデックス)アドレス指定方式
▲ アドレス部の値(100)+ インデックスレジスタの値(10)= 実効アドレス(110)
この計算式は FE H17秋 午前問18 でそのまま出題されています。
アドレス部=100、インデックスレジスタ=10 のとき実効アドレスは110、という極めてシンプルな加算です。
ベースレジスタとの違い
ここだけは確実に押さえてください。インデックスレジスタとベースレジスタはどちらもアドレス修飾に使うレジスタですが、保持する値の意味がまったく異なります。
| 比較項目 | インデックスレジスタ | ベースレジスタ |
|---|---|---|
| 保持する値 | 増分値(先頭から何番目か) | 基準アドレス(プログラムの先頭位置) |
| 値の変化 | 繰り返しのたびに変わる | プログラム実行中は原則固定 |
| 主な用途 | 配列の連続アクセス | プログラムの再配置(リロケーション) |
| 計算式 | アドレス部 + インデックスレジスタ値 | アドレス部 + ベースレジスタ値 |
計算式の見た目は同じ「加算」ですが、インデックスレジスタは「変化する差分」、ベースレジスタは「固定された起点」を保持している点が決定的に違います。
主要レジスタの一覧比較
試験では、レジスタの種類を混同させるひっかけ選択肢が定番です。以下の表で役割を整理しておきましょう。
| レジスタ名 | 役割 |
|---|---|
| インデックスレジスタ | アドレス修飾用。増分値を保持し、配列アクセスに利用 |
| ベースレジスタ | アドレス修飾用。基準アドレスを保持し、プログラム再配置に利用 |
| プログラムカウンタ | 次に実行する命令のアドレスを保持 |
| 命令レジスタ | 主記憶から取り出した命令を格納 |
| アキュムレータ | 演算結果を一時的に保持する専用レジスタ |
| 汎用レジスタ | 特定の機能を限定せず、多目的に使用される |
では、この用語が試験でどのように出題されるか見ていきましょう。
💡 インデックスレジスタの核心を3行で
・命令のアドレス部を修飾するための「増分値」を保持するレジスタ
・配列のように連続したデータへ繰り返しアクセスする際に値を変化させて使う
・ベースレジスタ(固定の基準アドレス)とは保持する値の意味が異なる
試験ではこう出る!
インデックスレジスタ自体を主題とする問題は頻度が低めですが、アドレス指定方式やレジスタ比較の選択肢として繰り返し登場します。
📊 過去問での出題実績
| 試験回 | 出題内容 | 問われたポイント |
|---|---|---|
| FE H11春 午前 問15 |
「インデックスレジスタの説明として適切なものはどれか」を選ぶ問題 | ・正解は「増分値を保持」 ・ベースレジスタ・命令レジスタ・汎用レジスタの説明がひっかけ |
| FE H17秋 午前 問18 |
インデックス修飾での実効アドレスを計算する問題 | ・アドレス部(100)+インデックスレジスタ(10)=110 ・単純な加算で求められる |
| FE H28秋 午前 問9 |
各種アドレス指定方式の説明を正しく対応させる問題 | ・指標アドレス指定=インデックスレジスタ値の加算 ・間接・基底・相対との区別が必要 |
| FE H30秋 午前 問10 |
割込み発生時にプロセッサが保存するものを選ぶ問題 | ・インデックスレジスタは不正解の選択肢 ・正解はプログラムカウンタ |
📝 IPA試験での出題パターン
パターン1:「レジスタの説明を選べ」
各レジスタの説明文が並び、インデックスレジスタに該当するものを選ぶ形式。ひっかけとして「基準アドレスを保持」(ベースレジスタ)、「命令を格納」(命令レジスタ)、「多目的に使用」(汎用レジスタ)が紛れ込む。キーワードは「増分値」「アドレス修飾」。
パターン2:「実効アドレスを計算せよ」
命令のアドレス部とインデックスレジスタの値が表で与えられ、加算結果を求める形式。計算自体は足し算だけなので、加算の方向さえ間違えなければ確実に得点できる。
試験ではここまででOKです。ハードウェア実装上の内部構造まで問われることはないので、深追いは不要です。
【確認テスト】理解度チェック
ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。
Q. インデックスレジスタの説明として、最も適切なものはどれでしょうか?
- A. アドレス修飾に用いるレジスタであり、命令のアドレス部を修飾するための増分値を保持する。
- B. アドレス修飾に用いるレジスタであり、命令のアドレス部の値に加えられる基準となるアドレス値を保持する。
- C. 特定の機能を限定せず、多目的に使用されるレジスタである。
正解と解説を見る
正解:A
解説:
インデックスレジスタは、命令のアドレス部の値に加算する「増分値(オフセット)」を保持するレジスタです。配列のように連続データを処理する際、この増分値を変えることで異なるアドレスへ順次アクセスできます。
選択肢Bはベースレジスタ(基底レジスタ)の説明です。ベースレジスタは「基準アドレス」を保持し、プログラムの再配置に使われます。「増分値」と「基準アドレス」の違いが判断ポイントです。選択肢Cは汎用レジスタの説明です。汎用レジスタは用途を限定しない万能型であり、アドレス修飾に特化した役割ではありません。
よくある質問(FAQ)
Q. インデックスレジスタと汎用レジスタは兼用できますか?
現代のCPUアーキテクチャでは、汎用レジスタがインデックスレジスタの役割を兼ねるのが一般的です。x86系CPUではESI・EDIなどが指標用に使われますが、これらも汎用レジスタの一種です。ただしIPA試験では「インデックスレジスタ=増分値を保持」「汎用レジスタ=多目的」として明確に区別されるため、試験上は別物として扱ってください。
Q. 相対アドレス指定方式とインデックスアドレス指定方式はどう違いますか?
どちらも「アドレス部の値に別の値を加算して実効アドレスを求める」方式ですが、加算する対象が異なります。相対アドレス指定はプログラムカウンタの値を加算し、指標アドレス指定はインデックスレジスタの値を加算します。相対アドレス指定は分岐命令で使われ、指標アドレス指定は配列の要素アクセスで使われるという目的の違いもあります。
Q. CASLⅡでインデックスレジスタはどう扱われますか?
IPA試験の擬似アセンブラ言語CASLⅡでは、汎用レジスタGR1〜GR7をインデックスレジスタとして指定できます。命令のオペランドで「adr,x」のようにxの位置にレジスタ番号を書くと、adrの値にそのレジスタの値を加算した実効アドレスが計算されます。GR0だけはインデックスレジスタとして使えない点が、過去のCASLⅡ問題でひっかけポイントになっています。
Q. 実務でインデックスレジスタを意識する場面はありますか?
高級言語(C言語やPythonなど)で開発しているぶんにはコンパイラが自動的にレジスタを割り当てるため、直接意識する場面はほぼありません。ただし、組み込み開発やデバイスドライバの開発でアセンブリ言語を扱う場合は、配列やバッファのアクセス最適化でインデックスレジスタの使い方が性能に直結します。