目次
アドレス指定方式とは
アドレス指定方式とは、CPUが命令を実行する際、対象となるデータの在りかを指定する方法のことです。
CPUが実行する命令は下記の図のように「命令部」と「オペランド部(アドレス部)」に分かれています。
※命令はコンピュータが理解できる機械語(0と1で構成された2進数の文字列)形式。
命令部にはコンピュータへの命令が入り、オペランド部には対象データの在りかを示す情報が入ります。
このオペランド部には様々な指定の仕方があります。例えば 直接 値を格納したり、メモリのアドレスを格納したりと様々です。
スポンサーリンク
アドレス指定方式の種類
即値アドレス指定方式
即値アドレス指定方式とは、オペランド部に対象となるデータそのものが入っている方式です。
オペランド部に対象データが格納されているため、メモリへの参照は行いません。対象データを取得する際に、メモリへのアクセスがないので高速に処理できます。途中で変更できない定数などで利用されている方式です。
直接アドレス指定方式
直接アドレス指定方式とは、オペランド部に実効アドレスが記載されている方式です。
上記図は、直接アドレス指摘方式の例です。オペランド部には「1000」という実効アドレスが格納されています。メモリからこの実効アドレスの場所を参照することで、値を取得できます。
間接アドレス指定方式
間接アドレス指定方式とは、オペランド部に対象データの場所を示すメモリのアドレスが記載されている方式です。
上記図は、間接アドレス指定方式の例です。オペランド部には「1000」というメモリのアドレスが入っています。そして、メモリの「1000」には実効アドレス「1003」が格納されており、「1003」のアドレスを参照することで、値を取得できます。
インデックスアドレス指定方式 (指標アドレス指定方式)
インデックスアドレス指定方式とは、オペランド部にインデックスレジスタが入り、インデックスレジスタの値を加算することで、実効アドレスを求める方式です。
上記図は、インデックスアドレス指定方式の例です。オペランド部には、インデックスレジスタ「1」と「980」が格納されています。
インデックスレジスタを参照するとアドレス「1」には「22」が格納されているので、この値を加算(980 + 22 = 1002)し、実効アドレスを求めます。
スポンサーリンク
その結果、実効アドレスが「1002」となり、メモリのアドレス「1002」を参照することで、値を取得できます。
インデックスレジスタの値を変更して繰り返し同じ命令を実行させます。
ベースアドレス指定方式 (基底アドレス指定)
ベースアドレス指定方式とは、オペランド部の値にベースレジスタの値を加算することで実効アドレスを求める方式です。
上記図は、ベースアドレス指定方式の例です。ベースレジスタの値「100」をオペランド部の値「900」に加算することで実効アドレスを求めることができます。
その結果、実効アドレスが「1000」となり、メモリのアドレス「1000」を参照することで、値を取得できます。
ベースレジスタには、プログラムをメモリ上にロードした時の先頭のアドレスが記憶されています。
例えば、以下の図のようにプログラムをメモリ上にロードした時、1001~2000のアドレスを使用。この時、ベースレジスタには先頭のアドレスである「1001」が記憶されます。
ベースアドレス指定方式では、プログラムがメモリ上のどの位置にロードされても、命令を変えることなく実行できるというメリットがあります。
例えば、オペランド部に「1」が設定されている場合、上記図の例ではベースレジスタ「1001」 + オペランド部「1」で「1002」のアドレスを参照することで、値を取得できます。
そして、下記の図で考えても ベースレジスタ「801」+ オペランド部「1」で「802」のアドレスを参照すればよいことが分かります。オペランド部に「1」が設定されているので、どちらも プログラムがロードされた位置の先頭から2番目であることがわかります。
このように直接アドレス指定方式などでは、プログラムがロードされた位置に応じて命令(オペランド部)を変える必要がありますが、ベースアドレス方式では、命令を変える必要がないのです。
相対アドレス指定方式(自己相対アドレス指定方式)
相対アドレス指定方式とは、オペランド部の値にプログラムカウンタの値を加算することで実効アドレスを求める方式です。
相対アドレス指定方式は、ベースアドレス指定方式とほぼ同じです。違いはベースレジスタの代わりにプログラムカウンタを使用している点です。
ベースレジスタを持たないが、ベースレジスタ指定方式と同じように扱いたい場合などに、利用されている方式です。