32 ビット保護モード (明らかに x86) で PIT IRQ ハンドラーからの戻り値を確認するにはどうすればよいですか? 私はそれができると思いますが、完全にはわかりません。
pop eax ; pop last thing from stack
mov dword return_address,eax
push eax
iret
これにより、スタックから適切なアイテムが読み取られますが、このようにすると、が破損しeax
ます。
適切なISRは、実行が終了するまでに、使用されているすべてのレジスタをISRの開始時の状態に復元する必要があります。
注意すべきもう1つのことreturn_address
は、セグメントレジスタ(ここでは)を介して(暗黙的に)参照されることds
です。ds
ISRとISRが割り込むコードで常に同じであれば、これは問題ありません。ただし、中断されたコードが変更された場合ds
、ISRはds
最初に保存し、適切なセレクター値に設定して使用し、復元する必要があります。これを行わないと、そのmov
命令によってメモリが破損したり、例外が発生したりする可能性があります。
もっと似たようなもの
push eax
push ds
mov eax,cs:saved_ds
mov ds,eax
mov eax,[esp+8]
mov return_address,eax
pop ds
pop eax
iret
eaxを保持し、任意のセグメント値を処理できます。saved_ds
上記のISRを実行する前に、「ds」セグメントレジスタを保存する必要があります。レジスターを使用しcs
てアクセスします。ほとんどの(すべて?)プラットフォームは、csのベースがdsのベースと等しく、csが読み取り可能です。
通常、ISRはIRQを確認する必要があります(コードはソフトウェア割り込みフックですか?)。あなたのコードはそれを示していないので、質問のあなたのコードフラグメントは実際のコードの単純化されたバージョンであると私は考えました。