この例外を処理する方法は?
__asm
{
mov esp, 0
mov eax, 0
div eax
}
これはtry/except
またはでは処理されませんSetUnhandledExceptionFilter()
。
これがオペレーティング システムで実行されていると仮定すると、オペレーティング システムはゼロ除算をキャッチし、次に ATTEMPT を実行して、アプリケーション コードの例外/シグナル スタックフレームを形成します。ただし、ユーザー モード スタックは「不良」であるため、できません。
アプリケーションを強制終了する以外に、オペレーティング システムがこれに対処する方法は実際にはありません。[理論的には、動的に割り当てられたメモリから新しいスタックを作成できますが、アプリケーション自体が正常な状態に回復する (常に機能する) 方法がないため、かなり無意味です]。
スタック ポインターをスタック以外のものに設定しないでください。または、スタック ポインター レジスターに「ランダム」データを格納する場合は、例外を発生させません。「足を離したくなければ、銃を足に向けて引き金を引くな」と同じです。
編集:
コードが「ユーザーモード」ではなく「カーネルモード」で実行されている場合、「二重障害」になるため、さらに「ゲームオーバー」になります。プロセッサはゼロ除算の例外ハンドラにヒットし、スタックに書き込もうとします。 、そしてそうするとき、それは失敗します。これは現在、「フォールト ハンドラ内のフォールト」、別名「二重フォールト」です。二重障害ハンドラーの典型的なセットアップは、別のスタックを持ち、それが障害ハンドラーを回復することです。しかし、まだゲーム オーバーです。元の障害ハンドラーに戻る方法 [または元の障害ハンドラーが何であったかを調べる方法] はわかりません。
二重障害ハンドラーで「新しいスタック」がない場合、x86 プロセッサにトリプル フォールトが発生します。通常、トリプル フォールトにより、プロセッサが再起動されます [技術的には、アドレス バスで通知されるビットの特別な組み合わせでプロセッサを停止します。それが「トリプルフォールト」であることを示します。典型的な PC ノースブリッジは、トリプル フォールトが回復不能な状況であることを認識してプロセッサをリセットします。これが、低品質のドライバを使用しているときに PC が単に再起動することがあるのはこのためです]。
組み込みアセンブリから高水準言語の例外メカニズムとやり取りしようとするのは得策ではありません。コンパイラは、一致できない「魔法」を行うことができ、「このアセンブリコードは例外をスローする可能性がある」ことをコンパイラに伝える(移植可能な)方法はありません。