2011-06-29 2 views
-2

ここで私は混乱した心に戻ってきました! :)ARMバイナリのアライメントに関する質問

Iは、armccをすることにより、データの通常の配置を理解していたとしては、(ARM部位から採取された)次のようになり ARM Compiler toolchain Using the Compiler: Types of data alignment

しかし、私のバイナリIは0x205B387

に常駐print_quality {}構造のインスタンスを参照

[D:0x205B387] print_quality =((0x44の、0x72、の0x61、は0x66、0x74、0x0の、0x0の、0x0の、0

ここではsizeof(print_quality)= 0x1Eを

構造体 char print_quality [] [10] = { "ドラフト"、 "ノーマル"、 "ハイ" };

以降、私はクラッシュを取得していますフローの

LDRHのR2を実行している間、[R1]。ここでは、r1 = 02064769

だから私は誤って整列されたアドレスからの読み取りのためにクラッシュすると思います!

何が問題になりますか。 :( 任意の考えは歓迎されている。..

BR、

/MS私の経験から

+0

もう少しコンテキストを追加できますか?ここでの形成は、あなたの質問に答えるには十分ではありません。例えば、あなたの 'print_quality'構造体はどのように定義されていますか?あなたが言及した 'ldrh'命令にコンパイルされているCコードは何ですか? –

+0

申し訳ありませんクラッシュは別の理由で発生する可能性があります。しかし、私が困惑しているのは、サイズが30バイトであるにもかかわらず、奇妙なアドレスに存在するprint_qualityです。 –

+0

okマーティンは構造を追加し、答えも得ました。奇妙なアドレスに住んでいることを正当化することができます! :)私たちはldrhでクラッシュを無視することができます。私はそれが配列境界を越えるポインタだと思う。 c線は、(; * p!= 0; ++ p) の場合、\t \tです。 –

答えて

2

、これは通常ので、例えば(一つのことから別のものにキャストバイト整列配列を使用しての起こり実際にあなたのコードを表示せずに決定的な答えを得ることができるかどうかは確かではありませんが、実行パスのどこかにvoid*があるか、memcpyそれは犯人になるでしょう。

+0

はい合意。今日は私の悪い..私はあまりにも多くのものが適切ではありません..すべてのあなたの入力をありがとう:) –