0
コンパイルしてARM Cortex M4でうまく動作する小さなアプリケーションがあります。 (私はそこReset_Handlerを.WORDている)1バイト後のアームベクトルテーブル
00000000 <.data>:
0: 20020000 andcs r0, r2, r0
4: 080003b5 stmdaeq r0, {r0, r2, r4, r5, r7, r8, r9}
8: 08000345 stmdaeq r0, {r0, r2, r6, r8, r9}
c: 08000351 stmdaeq r0, {r0, r4, r6, r8, r9}
080003b5は、リセットハンドラのアドレスにする必要がありますが、ELFを分解すると、そのリセットハンドラを示しています。しかし、私はここに私のフラッシュが、どのように見えるか最初のバイトであることバイナリファイルを、逆アセンブルするとき
080003b4 <Reset_Handler>:
80003b4: 2100 movs r1, #0
80003b6: e003 b.n 80003c0 <InitData>
(それはTHUMBモードで実行している、私は2バイト命令を持つ):実際には前に1バイトである、080003b4に位置しています。私は、バイナリファイルを逆アセンブル場合
でも、それは080003b4にあります:
000003b4 <.data+0x3b4>:
3b4: 2100 movs r1, #0
3b6: e003 b.n 0x3c0
私の質問は、なぜそれが後に1つのバイトを指すんですか?このコードは驚くほど実際のボード上で動作します。逆アセンブルをしなくても、命令は2バイトで整列されるべきではありませんか?どのようにアドレス0x000003b5することができますか?
私はARMが命令のために整列したアドレスを必要とするので、確かに '080003b5'は間違っていると思います。しかし、最下位ビットはおそらくthumb/full32モードのマーキング(あなたのアドレスはおそらくリセットハンドラが「080003b4」の「親指」コードであることを意味します)、それが頭からどうなったかを思い出すことはできません。 CPUのドキュメントをチェックするので、取るのは間違っているかもしれない漠然としたヒントです。 – Ped7g
ここではさまざまな形で何度も尋ねられてきましたが、最も適切な複製物を自由に検索することができます(今は時間がありません)。つまり、インターワーキングに関してThumbシンボル/コードアドレスがどのように機能するかを読んでください。 – Notlikethat
ジャンプ命令Bを使用する場合、命令がThumb命令またはARM命令にジャンプしているかどうかを知る必要があります。奇数アドレスはThumbであることを知らせることです。ジャンプアドレスを取得すると、LSBitは無視されます。 –