• ベストアンサー

アセンブラ言語  「インデックスレジスタ」

指標レジスタ: 有効アドレスを求めるときに基準となる値を記憶するレジスタです。 これは噛み砕いて言うとどういうことでしょう?インデックスレジスタにGR0を含まないのはなにか理由があるのですか?

質問者が選んだベストアンサー

  • ベストアンサー
  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.1

> 噛み砕いて言うとどういうことでしょう? 配列要素を指す添字のような働きだということです。次のリンク先を参照。 http://www.jjon.com/jitec/casl/CASL-A5.pdf > インデックスレジスタにGR0を含まないのはなにか理由があるのですか? 指標修飾しない場合をidx=0で表していたからだと思います。

msnaruo
質問者

お礼

回答ありがとうございました!

関連するQ&A

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

    アドレス指定方式(アドレシング)についての質問です。 タイトルの通り、インデックスアドレス指定方式とベースアドレス指定方式の違いを教えていただきたいです。 参考書などでは、 ●インデックスアドレス指定方式 ・命令の番地部とインデックスレジスタの値を加算した値を有効アドレスとする ・インデックスレジスタの内容を変えるだけで別なアドレスの内容が参照できる ●ベースアドレス指定方式 ・命令の番地部が指定するアドレスに、ベースレジスタの内容を加算した値を有効アドレスとする ・ベースレジスタの値を変えるだけでプログラムが主記憶装置のどこからでも実行できる(再配置可能) となっています。 有効アドレス=番地部のアドレス+レジスタの値 となるのが同じで、基準となる値がインデックスアドレス指定方式のほうでは命令の番地部であり、ベースアドレス指定方式のほうはベースレジスタの値、ということまではわかったのですが、この「基準」が違うことでどういう違いがあるのか、具体的にどういう場合にどちらの方式が使われるのかがわかりません。 ベースアドレス指定方式の「再配置可能」という部分もどういう仕組みなのか、よくわからないです。 ご回答、よろしくお願いいたします。

  • アセンブラの読み方

    お世話になります。 アセンブラを勉強しています。 下記について教えていただけないでしょうか。 よろしくお願いいたします。 1 .file 2 .data 3 var: .long 0x1234 4.text 5 .global main 6 main: 7 movb $1, %al // 値1をレジスタalに代入 8 push %eax // レジスタeaxの内容をスタックに格納 9 call IncReg // 関数呼び出し 10 pop %eax // スタックからレジスタeaxに引き出し 11 push var // 変数varの内容をスタックに格納 12 call IncReg // 関数呼び出し 13 pop %ecx // スタックからレジスタecxに引き出し 14 ret // リターン 15 IncReg: 16 movl %esp, %ebp // pushによって動いたスタックの先頭アドレスをレジスタ ebp に代入 17 movl 4(%ebp), %edx // mainから渡された eax(var) の値をレジスタ edx に代入 18 incw %edx // レジスタ edx の値を2増やす 19 movl %edx, 4(%ebp) // 2増やしたものを引数のあるスタックの場所に代入 20 ret // リターン (質問) 7 でレジスタ al に 1 を代入したのは何か意味があるのでしょうか。 17 の4(%ebp)はスタックポインタの1つ下、つまりmainから渡された引数でよろしいでしょうか。 18 の incw %edx はレジスタ edx の値を 2 増やすという意味でよろしいでしょうか。 13 でレジスタ ecx の値は 1236 になるので正しいでしょうか。

  • アドレス指定方式での、命令語が参照する番地

    16進数で”C13B0206”という32ビットの命令語があります。 <命令語の仕様> 0~7ビット:命令指示部 8~10ビット:レジスタ 11~15ビット:アドレス修飾部 16~31ビット:番地 <アドレス修飾と参照番地の関係> 00 0固定 直接アドレス (11,12の値が00、13~15の値が0固定のとき、直接アドレス。) 01 0固定 間接アドレス 10 インデックスレジスタ インデックスレジスタ+番地の値 11 インデックスレジスタ インデックスレジスタ+番地が示す内容の値 <主記憶、レジスタの状態> ●主記憶に格納されている値(16進数) 番地(16進数)が  202,203,204,205,206,208,209,20A...の順に、それぞれの格納値は、 203,204,205,206,208,209,20A,20B...。 ●インデックスレジスタに格納されている値(16進数) インデックスレジスタ番号(16進数)が1,2,3,4,5… の順に、それぞれの格納値は、 0,1,2,3,4…。 (1) アドレス修飾部のインデックスレジスタ番号。 命令語の”C13B0206”で、アドレス修飾部にあたるのが”3B”。00111011(2進数)。8~10ビットの001がレジスタになるから、3。 (2)命令の番地部の番地の値(16進数) 命令の番地部の番地の値。命令部では、”0206”。ちょうど16進数なので、206。 (3) 命令が最終的に参照する番地。 上の、<主記憶、レジスタの状態>より、11~15ビットが”1011”。 インデックス番号が11(2進数)なので、3(16進数)。インデックスレジスタ番号が3のとき、格納されているのは2。番地の値である206と3を合わせ、209。 最終的に参照される番地は209。 (1)(2)(3)、自分の解き方が正しいのかどうか自信がありません。どなたか補足、訂正などありましたら、よろしくお願いいたします。

  • アドレスレジスタは物理的に存在しますか?

    情報系の勉強している、初心者です。 アドレス修飾というところを今勉強中です。 命令が読み出しから実行終了までのステップを    段階      関係するレジスタ等 1. 命令の取り出し:命令アドレスレジスタ,命令レジスタ 2. 命令の解読:デコーダ,演算装置(演算命令の場合) 3. 有効アドレス計算:アドレスレジスタ,主記憶装置 4. データの取り出し5. 命令の実行:演算装置(演算命令の場合) 6. 演算結果格納:主記憶装置 ・・と説明しています。(一部省略している部分があります。)  そこで、この流れが意味することがいまいちつかめないし、覚えられないので パソコンの中をみて確かめようと思いました。 使っているノートパソコンのメモリーは取り出せました。が、一番知りたかったCPUはどこにあるのか分からなかったので、インターネットでアドレスレジスタや命令レジスタを視覚的にとらえられないかといろいろ調べましたが・・イメージ図は出てくるのですが写真は見つけられませんでした。 アドレスレジスタ・デコーダ等が実際に存在するのか、アドバイスお願いします。

  • 換気レジスターについて

    換気レジスターについて教えて下さい。 マンションの部屋とかについている自然換気用レジスターですが 取り付け位置等 基準とかあれば教えて下さい。

  • アセンブラで質問があります。

    Aレジスタの値が0(ゼロ)BHのとき、0(ゼロ)AHを実行すると、Zフラグはどのように変化しますか? また、Aレジスタの値が0(ゼロAHのとき、CP 0(ゼロ)AHを実行すると、Zフラグはどう変化しますか?

  • 汎用レジスタのワーキングビットテスト

    アセンブラ初心者です。 汎用レジスタR0からR15をワーキングビットテストするアセンブラソースを書いているのですが実行すると暴走します。 汎用レジスタR0からR15をワーキングビットテストする場合、レジスタデータを一旦どこかに保存してから行うものなのでしょうか? また、R0がインデックスレジスタ(意味が良く分かってません)、R15がスタックポインタが格納されていますがこれらのレジスタも値を一旦どこかに退避しておけばテストを行ってもよいものなのでしょうか?

  • 「レジスタ」の由来は?「オペランド」とどう違うの?

    CPUが計算する時に記憶しておく装置「レジスタ」というのがありますが、そもそも「レジスタ」の名前の由来は何なんでしょうか? 「レジスタ」(register)を日本語に訳すると「登録」という意味になりますが、この「登録」の意味と記憶装置(レジスタ)はどう関係あるのでしょうか? さらに「レジスタ」と「オペランド」と「データ」は意味としては似ていると思いますが、どう違うのでしょうか? わかりやすく教えてください。 よろしくお願いいたします。

  • SIPのREGISTER

    SIPでユーザがREGISTERメッセージを送りSIPサーバに ユーザのトランスポートアドレスを登録しますが、 REGISTERメッセージにトランスポートアドレスを 乗せて登録されるのですか? 詳しい方教えてください。

  • registerと配列

    ある本に以下のような書き出しでプログラムが載っています。 >register付きで宣言された配列の先頭要素の値を表示(動作しない)< #include<stdio.h> int main(void) { register int x[5]; printf("x[0]の値は%dです。\n",x[0]); return 0; } 配列はコンパイルする段階で*(a+0)とポインタに変換されるとは理解しているのですが、私の環境(Red Hat Linux)では動作してしまいます。 さすがに、 printf("&x[0]の値は%pです。\n",&x[0]);とすると>registerにかかわらずポインタの値を求めています<という警告がでますが、 本では>動作しない<と書かれていますが、きちんとコンパイルも行われ>動作します< これはどの様に考えたらよいのでしょうか?宜しく願います。