« モーター注文 | トップページ | モーター到着 »

2014年1月 5日 (日)

初期値格納アドレスずれ

ふとしたことで、dataセクション用の初期化データの開始アドレスが、4バイト分ずれる理由に思い当たった。
世間では常識なんだろうけど、今頃気付く...

たぶんGCC4あたりのどこからか...まあちゃんと調べればわかると思うけど。
変数の初期値のアライメントが、4バイト境界から、8バイト境界へ変更されているようだ。

いまどき初期化される変数には、long longや、doubleもあるから、8バイト境界にそろえるのは理にかなってる、ような気もする。

今のGCCでは、textセクションが8バイト境界で終わらなかった場合、次の8バイト境界までスキップされて、dataセクションの初期値が始まっている。

                0x0001388c                __text_end__ = .
.data           0x10000000      0x930 load address 0x00013890

コードをわずかずつ変えてコンパイルして、textセクションのサイズを変えてみても、
必ず8バイト境界に置かれるようだ。

------

今まで使っていたスタートアップの中では、textセクションの最終番地の次の4バイト境界を開始アドレスとして、初期値のコピーを実行していた。

運がいい(悪い?)と、正しく動くが....

アライメントの指定を、8バイト境界に変更する。
たぶんこれで直ったはず...

------

リンカスクリプトと、スタートアップは、GCC3あたりから基本部分を使いまわしている。
当初は、問題なく動いていたのだが。ちゃんとメンテナンスしないといかんなあ。

あらためて、リスティングファイルをみる。

Cortex-M3はthumb2を使っていて、16ビットコードなのだけれど、textセクションは4バイト境界で終わるように、適時NOPが挿入されている。
アセンブラが内部で使う定数は32ビットなので、これで十分なのか。うーむ。

分かってしまえば何てことは無いのは、いつものことなのだが。

|

« モーター注文 | トップページ | モーター到着 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: 初期値格納アドレスずれ:

« モーター注文 | トップページ | モーター到着 »