プログラムの実行において、正常な実行過程に含まれない事象のこと。
Cなどでは、バッファオーバーフローが発生しても例外を発生させず、強制終了もしない。これが数々のセキュリティホールを生んだ。
80x86シリーズでの例外は後述する。
例外は、それまでの処理の続行が不可能になった条件でのみ発生する。
そのため、例外が発生した場合は何らかの後始末が必要になる。この後始末のことを例外処理と呼ぶ。
軽微な例外であればプログラムやオペレーティングシステム(OS)が例外処理でその例外をリカバリすることも可能だが、致命的な例外の場合はプロセス、OS、ハードウェアを停止させる必要が出てくることもある。
80x86シリーズで発生する例外は、次の通りである。
なお、例外の後の二桁の数値は16進数であり、また名称はMicrosoft Windowsで使用されているものである。
プロセッサで0除算例外が発生した場合に、この例外が返される。
例えば0除算が試みられた場合、演算結果が出力オペランドに適合しない場合、などがある。
ブレークポイントやタスク切り替えトラップ等を検知した場合に返される。
ハードウェアのマスク不可割り込み(NMI)で使用される。
デバッガが設定したブレークポイントによって発生する。
EFLAGSのOF(オーバーフローフラグ)が1の時にINTO命令が実行された場合に発生する。
BOUND命令のインデックスが範囲外の場合に発生する。
無効な命令を実行しようとした時に発生する。
数値演算コプロセッサが搭載されていないにも関わらず、浮動少数点型命令が実行された場合に発生する。
例外エラー例外処理中に、別の例外が発生すると、この例外が発生する。
浮動小数点命令で、セグメントの終了位置を超えてメモリアクセスが発生すると、この例外が発生する。
逆に浮動小数点オペランドの開始アドレスがセグメント外の場合は、一般保護違反になる。
タスクステートセグメント(TSS)内の何らかのディスクリプタ情報が無効であると、この例外が発生する。
オペレーティングシステムで仮想記憶機能を使用時、「不在」とマークされたセグメントに対しアクセスされた場合に、この例外が発生する。
命令が、スタックセグメントの制限を超えるメモリを参照すると、この例外が発生する。
他の例外に該当しない状態となると、この例外が発生する。
通常、そのプログラムは強制終了させられる。
「不在」に設定されたページにアクセスが発生したときに、この例外が発生する。
将来用の予約。
浮動小数点演算コプロセッサにアクセスできない場合に、この例外が発生する。
i486以降のプロテクトモードで、アライメントが必要な命令でアライメントされていな場合に、この例外が発生する。