質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
基本情報技術者

基本情報技術者とは、経済産業省が行う国家資格「情報処理技術者試験」の区分の一つです。試験ではプログラマーやシステムエンジニアなどIT業界で働くために必要とされる基礎知識や情報処理において論理的な考え方ができるか等が問われ、企業から高い評価を獲ることができ、IT業界の入門的な資格として人気があります。

Q&A

解決済

2回答

14803閲覧

インデックスアドレス指定方式とベースアドレス指定方式

swordone

総合スコア20651

基本情報技術者

基本情報技術者とは、経済産業省が行う国家資格「情報処理技術者試験」の区分の一つです。試験ではプログラマーやシステムエンジニアなどIT業界で働くために必要とされる基礎知識や情報処理において論理的な考え方ができるか等が問われ、企業から高い評価を獲ることができ、IT業界の入門的な資格として人気があります。

0グッド

2クリップ

投稿2015/07/13 07:29

現在,基本情報技術者試験を受験しようと勉強しています.
その中で気になったことがあるので質問させて頂きます.
アドレス指定方式の中で,「インデックスアドレス指定方式」と「ベースアドレス指定方式」というものが登場します.
どちらも「番地部にレジスタの値を加えて実効アドレスにする」「レジスタの内容を変えることで違う場所にアクセスする」ような特徴があり,違いがよくわかりませんでした.
自分で調べて見たのですが,

  • インデックスアドレスは配列の様に連続的にアクセスするためにインデックスレジスタの値を変更する
  • ベースアドレスはアクセス対象そのものを移動できるようにするために,移動に連動してベースレジスタの値を変更する(「再配置可能」というワードからの推測)

というような認識になったのですが,正しいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

pikovoltさんの回答のコメント欄での議論を踏まえ、

どちらも「番地部にレジスタの値を加えて実効アドレスにする」「レジスタの内容を変えることで違う場所にアクセスする」ような特徴があり,違いがよくわかりませんでした.

という質問に即して、回答すると、

ベースアドレス指定方式で使うレジスタをベースレジスタ、インデックスアドレス指定方式で使うレジスタをインデックスレジスタと書くことにすると、

・ベースレジスタ・・・・サブルーチン呼び出しなどをしない限り原則として値は不変。その値と目的アドレスの差分を命令で指定する。サブルーチン呼び出しをすると設定し直される(ことが多い)
・インデックスレジスタ・・・・配列の添え字計算をした結果を格納する(注参照)。命令では配列の先頭アドレスを指定する

とかでしょうか。
同じ、「目的アドレス=レジスタの値+命令で指定した値」であってもこのように違います。
インデックスアドレス指定方式であってもベースアドレス指定方式と併用するCPUアーキテクチャが多いかと思います。つまり、配列要素へのアクセスは「目的アドレス=ベースレジスタの値+命令で指定した値(目的の配列の先頭とベースレジスタ値との差分)+インデックスレジスタの値」。

注:インデックスレジスタに入るのは添え字そのものじゃなくて、配列の添え字を計算した後、要素サイズを掛けて、配列先頭の添え字が0でない場合はその調整をした物が、インデックスレジスタに入って、命令で指定した値と足されます。概念の説明なので、コンパイラの最適化によって違う動きになるでしょう。例えば添え字が定数ならインデックスレジスタを使わずに、コンパイル時にアドレスを計算するでしょう。

投稿2015/07/14 16:38

otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

教科書にどんなふうに書かれているかよく知らないのですが、質問にある2つのレジスタには以下のような用途の違いがあります。
・プログラム実行位置を設定(ベースアドレス)
・配列等のデータ位置を設定(インデックスアドレス)

これらの機能は、x86系のCPUが有名ですね。
実際には実行される命令にもアドレス指定が含まれているので、レジスタと命令で指定されるアドレスを合わせて最終的な参照先が決定されます。

このページとか見るとイメージできますでしょうか。
ttp://www.kogures.com/hitoshi/webtext/hs-cpu-address/index.html

投稿2015/07/13 08:07

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2015/07/13 08:22

ベースレジスタは読み込んだプログラムのメモリ上の開始位置を持っていて, インデックスレジスタは順繰り操作する際のインデックスを持っている,ということでしょうか?
退会済みユーザー

退会済みユーザー

2015/07/13 08:26

そうですね。 少しでも勉強が捗るといいのですが、説明上手じゃなくてごめんなさい。
otn

2015/07/13 10:34 編集

> ベースレジスタは読み込んだプログラムのメモリ上の開始位置を持っていて, プログラムの開始位置じゃなくて、 ・データエリアの先頭 ・スタックエリアの途中 などを指します。 「プログラムの先頭アドレスを設定しておきます。」というのは、MSDOS時代の初期の64Kbyteの中にプログラムもデータも収まっていた時代の話ではないかと思います。現在ではプログラムとデータは全く異なるエリアに置かれます。
退会済みユーザー

退会済みユーザー

2015/07/13 15:16 編集

教科書にどのように説明されてるか次第なんですが、それを言い出すと混乱の元じゃないかと思うんです…。 順にCPUの進化を追えれば、理由も見えてくるとは思うんですけど。 ※"プロテクトモード"の話ですけど、自分最初あれ見た時は実際意味がよくわからなかったんです…。
otn

2015/07/13 16:56 編集

「MSDOS時代の~」というのは、そのサイトの文章を書いた人の意図が不明なので、推測してみた1つの仮説だったのですが、1980年代の文章がそのまま残っているとも考えづらいため、この仮説は多分違ってますね。 もう一度サイトを読み返すと、レジスタ間接で無いとジャンプが出来ないようなCPUアーキテクチャについて説明しているのではないかと思います。例えばIBM系メインフレームだと「レジスタの値+0~4095」番地にしか飛べないので、ジャンプのためには、プログラム先頭や途中を指すレジスタが必要です(最近は進歩して命令が拡張されているかもしれませんが)。 ただ、今となっては「特殊なCPUの話」になってしまうと思います。
退会済みユーザー

退会済みユーザー

2015/07/14 10:42

そもそもの話に戻すことになるのですが、アドレスを決定する仕組みの概念として引き合いにしていると思うので、事例が特殊かどうかはあまり関係ないように思います。 アーキテクチャ的にその理解ではおかしい、という以前の動作原理の話だと思うので。
otn

2015/07/14 12:10

1つの事例紹介として「プログラムの先頭を指すケースもある」であれば問題ない記述だと思います。おっしゃるとおり、紹介事例が特殊かどうかは関係ない。 サイトの記述通り「通常は、ベース値としてプログラムの先頭アドレスを設定しておきます。」と覚えてたりすると今後もしアセンブラプログラムを読み書きするようなことになると理解困難な局面に遭遇すると思いますので、あえて注意しました。
swordone

2015/07/14 12:21

様々なコメントありがとうございます. ちなみに今私が教科書として使っているのは,翔泳社の 「情報処理教科書 基本情報技術者 テキスト&問題集2015年版」です. これのP94に,「ベースアドレス指定方式は,命令の番地部が指定するアドレスに,基底アドレスレジスタ(ベースアドレスレジスタ)の内容を加算した値を有効アドレスとする方式です.」と説明されています. その横に「参考」として,「ベースアドレス指定方式では,ベースレジスタの値を変えるだけでプログラムを主記憶装置のどこに格納しても実行できる.このような構造を再配置可能という.」と記述されていました.
退会済みユーザー

退会済みユーザー

2015/07/14 12:51

swordoneさんには申し訳ない話なのですが、僕も勉強になりました。 もうちょっと押さえどころはしっかり押さえないと、説明も意味をなさなくなりますよね。 気をつけたいと思います、ありがとうございます。
otn

2015/07/14 16:13

教科書的にはそういう説明になってるんですね。x86でいうとセグメントまで含んだ概念ということでしょうね。基本情報の教科書がそういう内容であれば、基本情報勉強サイトではああいう説明でもいいかと思います。
swordone

2015/07/14 16:20

インデックスアドレス指定方式では先の説明の「基底アドレスレジスタ」の部分が「インデックスレジスタ」に変わっているだけでほぼ同じなんです. その後に続く説明で,「インデックスレジスタの内容を変えるだけで別のアドレスの内容を参照することができます」となっていて,似た仕組みで名前が違って「???」状態になってしまいました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問