私はARMとThumb2のコマンドに興味があります:特定のアドレスへの絶対的なジャンプのためのLDRとLDR.W、PC、= ADDR。ThumbとARM間のジャンプ
たとえば、ARMコードからARMにジャンプすると、コマンドLDR PC = ADDRが実行されます。 しかし、他のシナリオではどうなりますか? +1がアドレスに追加する必要がある場合に
をARMにThumb2からThumb2
へThumb2からARMからThumb2
へ
?なぜ?
私はARMとThumb2のコマンドに興味があります:特定のアドレスへの絶対的なジャンプのためのLDRとLDR.W、PC、= ADDR。ThumbとARM間のジャンプ
たとえば、ARMコードからARMにジャンプすると、コマンドLDR PC = ADDRが実行されます。 しかし、他のシナリオではどうなりますか? +1がアドレスに追加する必要がある場合に
をARMにThumb2からThumb2
へThumb2からARMからThumb2
へ
?なぜ?
ルールは実際には非常に簡単である:
これは+1について説明しています。
コンパイラによっては、使用するラベルによっては、アドレスのビット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つのアドレスを付けることができます。もしそれがすでに存在していれば、害はありません。親指モードに切り替えることに関しては、私は決してプラスを使用しません。
はい、私はアーム文書の擬似コードが間違っていることに同意します。これらのビットに関しては、カットアンドペーストエラーが発生しています。彼らはほとんど常に持っている。 –
これは、 '|コンパイラがすでにアドレスを調整している場合、 '1 'は' + 1'よりも良い接尾辞になりますか? –
はい、ただし、コンパイラが既にそれを設定していて、ORが役に立たない場合があります。 – Dric512
それでは、余計な「OR」、_assembly_timeでの処理、間違った種類のコードを実行することによる恐ろしいクラッシュなどがあります。 –