2016-06-15 4 views
0

私はARMとThumb2のコマンドに興味があります:特定のアドレスへの絶対的なジャンプのためのLDRとLDR.W、PC、= ADDR。ThumbとARM間のジャンプ

たとえば、ARMコードからARMにジャンプすると、コマンドLDR PC = ADDRが実行されます。 しかし、他のシナリオではどうなりますか? +1がアドレスに追加する必要がある場合に

をARMにThumb2からThumb2

へThumb2からARMからThumb2

?なぜ?

答えて

0

ルールは実際には非常に簡単である:

  • アドレスのビット0が0の場合、アドレスのビット1は、CPUをし、1であれば、CPUは、ARMコード
  • ようなコードを実行しますコードをThumbとして実行
  • もちろん、不一致がある場合、コードがARMかThumbかどうかをチェックする方法がないため、CPUは確実に(ランダムコード実行後に)フォールトを取得します。

これは+1について説明しています。

コンパイラによっては、使用するラベルによっては、アドレスのビット0がコンパイラによって自動的に設定されることがあります。

+0

これは、 '|コンパイラがすでにアドレスを調整している場合、 '1 'は' + 1'よりも良い接尾辞になりますか? –

+0

はい、ただし、コンパイラが既にそれを設定していて、ORが役に立たない場合があります。 – Dric512

+0

それでは、余計な「OR」、_assembly_timeでの処理、間違った種類のコードを実行することによる恐ろしいクラッシュなどがあります。 –

0

ドキュメントを読むだけで済みます。

The following instructions write a value to the PC, treating that value as an interworking address to branch 
to, with low-order bits that determine the new instruction set state: 
— BLX (register), BX , and BXJ 
— LDR instructions with <Rt> equal to the PC 
— POP and all forms of LDM except LDM (exception return), when the register list includes the PC 
— in ARM state only, ADC , ADD , ADR , AND , ASR (immediate), BIC , EOR , LSL (immediate), LSR (immediate), MOV , 
MVN , ORR , ROR (immediate), RRX , RSB , RSC , SBC , and SUB instructions with <Rd> equal to the PC and without 
flag-setting specified. 

あなたはthumb2がarmv6以上を表していると述べています。 (あなたはthumb2と総称的に親指を言ったのですか?)私は、上記のことがarmv6とarmv7に当てはまると教えていると思います。

ビットは命令によって消費され、pcはサムモードでセットlsbitを持ち歩くことはないことに注意してください。これは単に命令によってモード変更を示すために使用されます。

また、OR 1に関してはPLUS 1ではなく考える必要があります。コードを正しく記述すると、正しいアドレスが正しいlsbitで提供されます。そのアドレスに1を追加すると、あなたがパラノイドであるか、それを正しく行っていない場合は、アドレスに1つのアドレスを付けることができます。もしそれがすでに存在していれば、害はありません。親指モードに切り替えることに関しては、私は決してプラスを使用しません。

+0

はい、私はアーム文書の擬似コードが間違っていることに同意します。これらのビットに関しては、カットアンドペーストエラーが発生しています。彼らはほとんど常に持っている。 –

関連する問題