←前ページへ :  INDEX :  次ページへ→


10-2.ソフトウェア割り込み

  ソフトウェア割り込みとは、プログラマーが故意もしくはミスにより発生させる割り込みである。ソフトウェア割り込みは以下の3種類に分類できる。
  • トラップ・・・
  • フォルト・・・
  • アボート・・・
プログラマーが故意に呼び出す割り込み(INTなど)
プロテクトモードでの保護違反など
0での除算など、処理を続行できないエラー


トラップ
  今まで何回も出てきた「INT」命令を用いてプログラムから強制的に割り込みを発生させることを言う。「INT 21h」のようにOSが供給しているサービスや、常駐プログラムが行うサービス、BIOSというハードウェアを操作するためのROMが供給するサービスなどを、あたかもサブルーチンのように呼び出すかのように使うことができる。

 

フォルト
  プロテクトモードでは、OSがプログラムに対して、使えるメモリー領域を制限する。この制限を越えてメモリーを使おうとするとエラーが出る。この制限を越えたメモリーを使用しようとした時にこのフォルトが起こり、処理がプログラムから強制的に「エラー表示をして、そのプログラムを終了させる」というOSの処理に移行する。

  下図のような画面を見たことがないだろうか?「ページ違反」と書いてあるということは許可されていないメモリーを読もうとした証拠である。

アボート
  「除算」のところで少しふれたが、0で割ったり、商が大きいと「例外」が発生すると書いた。それがこのアボートである。

  下図の画面では「除算オーバーフローエラー」と書いてある。Windowsから「コマンドプロンプト」を呼び出し、その中で0で割るプログラムを実行した場合の例である。本当のMS-DOSからこのプログラムを実行させると、MS-DOSに処理が移行し、何も続きができなくなり、リセットするしか方法がなくなる。

次ページのハードウェア割り込みも含めて、すべての割り込みというのは、何らかの理由により、現在行っている処理をやめ、ほかの処理を行うルーチンに飛ぶことである。どこに、どのように飛ぶのかは後述する。


 
インタラプト (割り込み) 【86】
【書式】
 INT  imm8
【フラグ】
OF DF IF TF SF ZF ?? AF ?? PF ?? CF
【動作】
割り込み処理ルーチンを呼び出します。
32ビット属性のセグメントではIPの代りにEIPがプッシュされます。
リアル モード
フラグ レジスタをプッシュし、IFとTFを0にします。 次に現在のCSとIPをプッシュして、imm8で示される割り込みベクタから新しいCSとIPを設定します。
プロテクト モード
IDTのインタラプト ゲート、トラップ ゲート、またはタスク ゲートのディスクリプタを使用して分岐します。
【備考】
  • imm8で指定される割り込みタイプ番号(0〜255)は、割り込みベクタ(1項目は4バイト)またはIDT(1項目は8バイト)のインデックスとなります。
  • 割り込みタイプ番号0〜32はシステムで予約されています。
  • imm8=3の場合、命令の長さは1バイトなので、プログラム デバッグでのブレーク ポイントの設定に使用されます。
 
割り込みと例外の一覧
ベクタ番号 記号 分類 意味
0
#DE フォールト 除算エラー
1
#DB フォールト/トラップ デバッガ割り込み
2
- 割り込み マスクできない割り込み
3
#BP トラップ ブレーク ポイント
4
#OF トラップ オーバーフローによる割り込み(INTO)
5
#BR フォールト 配列境界違反(BOUND)
6
#UD フォールト 無効命令
7
#NM フォールト コプロセッサ無効
8
#DF アボート ダブル フォールト
9
- アボート コプロセッサ セグメント オーバーラン (486以降廃止/予約)
10
#TS フォールト 無効TSS
11
#NP フォールト セグメント不在
12
#SS フォールト スタック例外
13
#GP フォールト 一般保護例外
14
#PF フォールト ページ例外
15
- リザーブ 予約
16
#MF フォールト コプロセッサ エラー
17
#AC フォールト アラインメント違反 【486】
18
#MC アボート マシン チェック 【586】
19
#XF フォールト ストリーミングSIMD命令例外 【P3/K7】
20〜 31
- リザーブ 予約
32〜255
- 割り込みかトラップ システム依存

 


←前ページへ :  INDEX :  次ページへ→