腕。スーパーバイザーモードからユーザーR13およびR14にアクセスする

StackOverflow https://stackoverflow.com/questions/324704

  •  11-07-2019
  •  | 
  •  

質問

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

I.E。ユーザーモードへの戻りアドレスを含むスーパーバイザー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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top