ベースレジスタとインデックスレジスタ
プログラムはなぜ動くのか を読んでいて、ベースレジスタとインデックスレジスタを使うことによって、配列を実現していると書いてあって「なるほど〜」となったため、メモしておく。
まずは、本に書いてあることを自分なりの言葉で書いてみる
まとめ
わかったことは、
ベースレジスタ + インデックスレジスタ = 実際に参照するアドレス
であるということ!
ベースレジスタとインデックスレジスタ
レジスタ名 | 説明 |
---|---|
ベースレジスタ | あるデータの先頭のアドレスを格納する |
インデックスレジスタ | ベースレジスタからの相対的なアドレスを格納する |
ベースレジスタとインデックスレジスタを活用することによって、配列を実現してるっぽい
以下のプログラムを実行すると、配列のアドレスが表示される
#include <stdio.h> int main(int argc, char *argv[]) { int n[] = {8, 3, 5}; int i; // アドレスを表示する printf("%p n\n", n); printf("%p &n[0] // 先頭から%luバイト\n", &n[0], (unsigned long)&n[0]-(unsigned long)n); printf("%p &n[1] // 先頭から%luバイト\n", &n[1], (unsigned long)&n[1]-(unsigned long)n); printf("%p &n[2] // 先頭から%luバイト\n", &n[2], (unsigned long)&n[2]-(unsigned long)n); }
実行結果
0x7ffeeda5f99c n 0x7ffeeda5f99c &n[0] // 先頭から0バイト 0x7ffeeda5f9a0 &n[1] // 先頭から4バイト 0x7ffeeda5f9a4 &n[2] // 先頭から8バイト
それぞれのアドレスが4ずつ離れていることになる
ポインタ同士の引き算はlongに変換してから行う
結果から、ベースレジスタとインデックスレジスタに格納されているアドレスはこんな感じなのかな?
ベースレジスタ
nのアドレス:0x7ffee336f99c
インデックスレジスタ
アクセス | nの先頭からの距離 |
---|---|
&n[0] | 0バイト |
&n[1] | 4バイト |
&n[2] | 8バイト |
各要素のアドレスはベースレジスタとインデックスレジスタのORした値になる
参考文献
プログラムはなぜ動くのか 第2版 知っておきたいプログラムの基礎知識
- 作者: 矢沢久雄
- 出版社/メーカー: 日経ソフトウエア
- 発売日: 2007/04
- メディア: 単行本(ソフトカバー)
- 購入: 45人 クリック: 646回
- この商品を含むブログ (73件) を見る