7

スーパーバイザーモードに入ったときに保存されるユーザー R13 と R14 にアクセスするにはどうすればよいですか? ARM7TDMI を使用しています。

IE ユーザー モードへの戻りアドレスが含まれているスーパバイザ R14 にアクセスしたくありません。代わりに、ユーザー モードのリンク レジスタの値が必要です。これは私が書いているデバッガの一部です。

これらのレジスタに特別なエイリアスはありますか?

ありがとう

4

2 に答える 2

10

特定の質問に対する答えを説明しますが、同じアプローチが他のモードにも当てはまります。

CPSR のモード ビットをシステム モードに変更して、プロセッサ モードを変更する必要があります。これにより、ユーザーモードの SP/LR (R13 & R14) にアクセスできるようになります。システム モードは特権付きですが、その R13 と R14 はユーザー モードの R13 と R14 と同じであることに注意してください。

システム モードになったら、R13 と R14 を読み、必要な場所に配置します。次に、モードビットを以前のモードに戻すだけです(例ではスーパーバイザーモードだったと思います)。

スーパーバイザー モードからユーザー モードに切り替えていないことに注意してください。 スーパーバイザーからユーザーに切り替えた場合、スーパーバイザー モードに戻ることができませんでした。(そうしないと、ユーザー コードの昇格特権から保護されません)。そのため、システム モードを使用しました。システム モードは特権ですが、レジスタはユーザー モードと同じです。

CPSR のモード ビットを操作することで、任意の特権モードを自由に切り替えることができます。下位5ビットだと思いますか?私は移動中で、指先に情報がありません。そうでなければ、上記で説明したアセンブリ コードを提供したことになります。実際、胸に髪の毛を入れたい場合は、上で示したものを使用して実装し、テストして、ここに投稿してください。:-D

(「一般的なケース」(あなたのケースは非常に具体的です)に追加する必要があることの1つ-SPSRを調べて「どこから来たのか」を確認し、それを使用して、切り替える必要があるモードを決定します。)

ところで、私は最近、私の顧客の 1 人のためにこれを行いました....小さな世界だと思います。

于 2008-11-28T01:38:08.683 に答える
4

私はより良い方法を発見しました:-

STMを実行するときに、r15がオペランドの1つでない場合、^はユーザーモードレジスタへのアクセスを提供します。ただし、自動インクリメントは命令内で機能しないようです。レジスタバンクにアクセスする場合は、後でnopが必要です。

何かのようなもの

stmfd r13, {r13-r14}^ ;store r13 and r14 usermode
nop
sub r13, r13, #8      ;update stack pointer
于 2008-11-28T17:52:34.447 に答える