.bssと.sbss/.dataと.sdataの違い
Posted at March 13,2018 12:03 AM
Tag:[]
Tag:[]
.bssと.sbss/.dataと.sdataの違いについて調べてみました。
1.問題点
C++で、やや規模の大きなプログラムを作り、ビルドしたところ、リンクマップには
.data
.bss
以外に
.sdata
.sbss
というセクションができました。
.dataは初期値ありのデータ、.bssは初期値なしのデータを配置するセクションですが、.sdata/.sbssとの違いが分かりません。
ということで、.bssと.sbss/.dataと.sdataの違いについて調べてみました。
2..bssと.sbss/.dataと.sdataの違い
通常、プログラムが変数の値を読み書きするには、
- 変数のアドレスをレジスタに代入
- レジスタの指す先のメモリを読み書き
という、2つの手順が必要です。
.bssセクションや.dataセクションのデータはこの手順で読み書きします。
つまり、変数のアドレスを直接指定したメモリ読み書きは行なえません。
ただ、すべての変数でこれを行うのはコストがかかります。
そこで、データ領域を常に指すレジスタをひとつ設けておき、そのレジスタ値にインデックスを加えた位置(=変数)を読み書きすることで、アドレスをレジスタに設定するコストを削減するという方法があります。
このためのレジスタを「グローバルポインタ(またはベースレジスタ)」と呼びます.
これによりアセンブラは、通常2ワードで参照を行うところ、 1ワードのメモリ参照命令が生成可能となります。
グローバル・ポインタを利用してアクセスする変数を .sbssまたは.sdataというセクションに集めます。
.sbss/.sdataにサイズの小さい変数が多いのは、たくさんの変数を格納できた方がグローバル・ポインタを効率的に利用できるためです。
Posted by yujiro このページの先頭に戻る
トラックバックURL
コメントする
greeting