スーパーバイザーモードに入ったときに保存されるユーザー R13 と R14 にアクセスするにはどうすればよいですか? ARM7TDMI を使用しています。
IE ユーザー モードへの戻りアドレスが含まれているスーパバイザ R14 にアクセスしたくありません。代わりに、ユーザー モードのリンク レジスタの値が必要です。これは私が書いているデバッガの一部です。
これらのレジスタに特別なエイリアスはありますか?
ありがとう
スーパーバイザーモードに入ったときに保存されるユーザー R13 と R14 にアクセスするにはどうすればよいですか? ARM7TDMI を使用しています。
IE ユーザー モードへの戻りアドレスが含まれているスーパバイザ R14 にアクセスしたくありません。代わりに、ユーザー モードのリンク レジスタの値が必要です。これは私が書いているデバッガの一部です。
これらのレジスタに特別なエイリアスはありますか?
ありがとう
特定の質問に対する答えを説明しますが、同じアプローチが他のモードにも当てはまります。
CPSR のモード ビットをシステム モードに変更して、プロセッサ モードを変更する必要があります。これにより、ユーザーモードの SP/LR (R13 & R14) にアクセスできるようになります。システム モードは特権付きですが、その R13 と R14 はユーザー モードの R13 と R14 と同じであることに注意してください。
システム モードになったら、R13 と R14 を読み、必要な場所に配置します。次に、モードビットを以前のモードに戻すだけです(例ではスーパーバイザーモードだったと思います)。
スーパーバイザー モードからユーザー モードに切り替えていないことに注意してください。 スーパーバイザーからユーザーに切り替えた場合、スーパーバイザー モードに戻ることができませんでした。(そうしないと、ユーザー コードの昇格特権から保護されません)。そのため、システム モードを使用しました。システム モードは特権ですが、レジスタはユーザー モードと同じです。
CPSR のモード ビットを操作することで、任意の特権モードを自由に切り替えることができます。下位5ビットだと思いますか?私は移動中で、指先に情報がありません。そうでなければ、上記で説明したアセンブリ コードを提供したことになります。実際、胸に髪の毛を入れたい場合は、上で示したものを使用して実装し、テストして、ここに投稿してください。:-D
(「一般的なケース」(あなたのケースは非常に具体的です)に追加する必要があることの1つ-SPSRを調べて「どこから来たのか」を確認し、それを使用して、切り替える必要があるモードを決定します。)
ところで、私は最近、私の顧客の 1 人のためにこれを行いました....小さな世界だと思います。
私はより良い方法を発見しました:-
STMを実行するときに、r15がオペランドの1つでない場合、^はユーザーモードレジスタへのアクセスを提供します。ただし、自動インクリメントは命令内で機能しないようです。レジスタバンクにアクセスする場合は、後でnopが必要です。
何かのようなもの
stmfd r13, {r13-r14}^ ;store r13 and r14 usermode
nop
sub r13, r13, #8 ;update stack pointer