はじめに
未経験からIT企業に転職して3か月目のIT初心者です。
今回は基本情報技術者試験の疑問点をかみ砕いて、この記事にアウトプットしたいと思います。
勉強中ですので間違い等ありましたら、ご指摘いただけますと幸いです。
疑問点 なにがちがう??
早速ですが、基本情報技術者試験の勉強をしていると以下のような疑問にぶつかりました。
相対アドレス指定方式
命令のアドレス部 + プログラムカウンタ = 実効アドレス
基底アドレス指定方式
命令のアドレス部 + 基底レジスタ = 実効アドレス
参考書には図などを用いて上記のような記載がありましたが
私はここで「和で求めるのか~」と、この式をなんとなくスルーしてしまっていました...
しかし過去問を解けば解くほど、
2つは違うんだろうけど、何がどのように違うのかピンと来ない!
という状況に...
そこで、今回は二つの方式について自分なりに調べてみました!
プログラムカウンタと基底レジスタ
おさらいです。
相対アドレス指定方式
命令のアドレス部 + プログラムカウンタ = 実効アドレス
相対アドレス指定方式は、上記のように実効アドレスを求めてデータを参照しに行く方法です。
Q.そもそもプログラムカウンタとは?
A.これから実行する命令が格納されているアドレスを保持するレジスタ
つまり、次の命令の住所を持っている、いわばアドレス帳のような場所 と解釈しました。
基底アドレス指定方式
命令のアドレス部 + 基底レジスタ = 実効アドレス
基底アドレス指定方式も相対アドレス指定方式と実効アドレスの算出方法的に違いはそこまでありません。
Q.基底レジスタとは?
A.プログラムの先頭のアドレスが保持されるレジスタ
先頭のアドレス...?
アドレスの一番最初の文字?それとも「1」ってこと?
無知な私は、恥ずかしながら初歩的な勘違いをしてしまいました。
先頭のアドレスとは
皆様ご存知かと思いますが自分用に解説すると、何かしらのプログラム実行された結果、一番最初のデータに付与されたアドレス。
つまりは下図の赤枠の値ことでした。
これが基底レジスタに保持されるアドレスになります。
まとめると。。。
・プログラムカウンタ:次の命令がある場所のアドレスを保持
・基底レジスタ:先頭のアドレスを保持
両者はレジスタであり、保持する内容が異なる全く別物のレジスタでした。
再配置可能なアドレス指定方式
2つのアドレス指定方式を図に表すと下記の通りです。
両者はレジスタが違うだけで実効アドレスの算出方法は見た目上同じです。
そしてどちらも再配置可能という特徴を持つそうです!
再配置可能とは?
A.主記憶のどこにロードされても正しく実行できること
今回の場合、どちらの方式も、データをロードする際に何かしらの値(アドレス)がレジスタへ保持されます。
そのため実行されたプログラムのデータが主記憶上どの位置にロードされたとしても、命令のアドレス部を変更せずに同じデータが参照できます。
基底アドレス指定方式の場合だと(下図)…
①最初に実行したプログラムのデータが先頭アドレス「201」の位置にロードされた。
②2回目、同プログラムを実行したら、データが先頭アドレス「701」の位置にロードされた。
この場合、①②はそれぞれ異なる位置に配置されていますが、アドレス部が指定する「n番目」のデータは1回目実行時でも2回目実行時でも同じものを参照しています。
相対アドレス指定方式との違いは?
上の図のように、基底レジスタに保持される値は、プログラム実行中は比較的固定ですが、プログラムカウンタに保持される値は、プログラムが1つ実行されるたびに更新されます。
相対アドレス指定方式では、プログラムカウンタの値に命令中の変位を足してアドレスを計算するため、この変位は現在のプログラムカウンタからどれくらい離れた位置にデータが存在するかを表しています。
両者の違いを比較すると
・基底アドレス指定方式:基底レジスタの値を変更するとデータ全体も移動
・相対アドレス指定方式:各命令が個別に位置を計算して再配置
それぞれの特徴を活かした使いどころがあるみたいですが、スペック的に基底レジスタがないコンピュータ上で基底アドレス指定方式を行いたいときにも相対アドレス指定方式が使用されるそうです。
おわりに
今回まとめるにあたり様々な記事を拝見しましたが、掘れば掘るほど疑問が沸き出て大変でした…(笑)
具体的な実用例の原理を調べる域に踏み込んでしまいそうでしたが、本来の目的は基本情報技術者試験対策なので、その点に関して言えば十分かなと思っております!
ただ、無理矢理に納得させた部分もあるので何か間違い等ありましたら、ご指摘いただけると幸いです。
参考記事・文献
・令和07年 かやのき先生の基本情報技術者教室 著:栢木厚
・アドレス指定方式とは|分かりやすく図解で解説
・プログラムカウンタ(PC/命令ポインタ)とは
・CPUの全体構成:プログラムカウンター


