2016-11-28 1 views
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することができますか?

+1

私はARMが命令のために整列したアドレスを必要とするので、確かに '080003b5'は間違っていると思います。しかし、最下位ビットはおそらくthumb/full32モードのマーキング(あなたのアドレスはおそらくリセットハンドラが「080003b4」の「親指」コードであることを意味します)、それが頭からどうなったかを思い出すことはできません。 CPUのドキュメントをチェックするので、取るのは間違っているかもしれない漠然としたヒントです。 – Ped7g

+1

ここではさまざまな形で何度も尋ねられてきましたが、最も適切な複製物を自由に検索することができます(今は時間がありません)。つまり、インターワーキングに関してThumbシンボル/コードアドレスがどのように機能するかを読んでください。 – Notlikethat

+1

ジャンプ命令Bを使用する場合、命令がThumb命令またはARM命令にジャンプしているかどうかを知る必要があります。奇数アドレスはThumbであることを知らせることです。ジャンプアドレスを取得すると、LSBitは無視されます。 –

答えて

0

回答:ARMはTHUMBモードに切り替えるときにARMを使用します。

関連する問題