TIL

Today I Learned. 知ったこと、学んだことを書いていく

ベースレジスタとインデックスレジスタ

プログラムはなぜ動くのか を読んでいて、ベースレジスタとインデックスレジスタを使うことによって、配列を実現していると書いてあって「なるほど〜」となったため、メモしておく。

まずは、本に書いてあることを自分なりの言葉で書いてみる

まとめ

わかったことは、

ベースレジスタ + インデックスレジスタ = 実際に参照するアドレス

であるということ!

ベースレジスタとインデックスレジスタ

レジスタ 説明
ベースレジスタ あるデータの先頭のアドレスを格納する
インデックスレジスタ ベースレジスタからの相対的なアドレスを格納する

ベースレジスタとインデックスレジスタを活用することによって、配列を実現してるっぽい

以下のプログラムを実行すると、配列のアドレスが表示される

#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版 知っておきたいプログラムの基礎知識

プログラムはなぜ動くのか 第2版 知っておきたいプログラムの基礎知識