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


10-4.割り込みベクター

  では、割り込み番号からどのように割り込み処理のルーチンに飛ぶのだろうか?

  その前に、もう一度おさらいをする。ハードウェア割り込みの場合は割り込みが発生すると割り込みコントローラーから割り込み番号を受け取る。プログラマーが「INT」命令などで、行うトラップは、「INT 21h」などのように、割り込み番号はプログラムとして書かれている。除算エラーなどのアボートやフォルトの場合はROMに書かれている割り込み番号を受け取る。

  そしてその割り込み番号から実際の処理に移行するには「割り込みベクター」と呼ばれるメモリーを参照してそこにジャンプする。80186以下のCPUや80286以上のリアルモードでは、 00000h〜00400hに割り込みベクターがセットされている。CPUの決まりであり、OSの決まりではない。したがってMS-DOS、N88-BASIC、その他のOS(Windowsなんかはプロテクトモードなので、違う)でも同じ領域にセットされる。

  左図のように、割り込み番号0の処理は、アドレス00000hにそのオフセットアドレスが、00002hにセグメントアドレスが入っている。割り込み番号0の処理は、アドレス00004hにそのオフセットアドレスが、00006hにセグメントアドレスが入っている。これが256個分、格納されている。したがって例えば割り込み番号0が発生すると、CSに[00002h]が IPに[00000h]の内容が格納され、そのアドレスにジャンプする。

  次に、割り込み番号0が発生した際の処理の流れを、詳しく説明する。
  • 割り込みが発生する
  • トラップ(INT ??での呼び出し)以外の場合は、割り込み許可フラグ(IF)を0にし、他の割り込みを保留する
  • フラグレジスタ、CSレジスタ、IPレジスタをこの順番にプッシュする
  • 割り込みベクターを参照し、その処理ルーチンに移行する
  • その割り込み処理を実行する
  • その割り込み処理の最後には、割り込みコントローラーに対して、割り込み処理の終了を通知するプログラムがあるので、それを実行する(トラップ以外)
  • 割り込み処理ルーチンの終わりを告げる「IRET」が実行される
  • 「IRET」が実行されると先ほどプッシュしたCS、IP、フラグをポップする
  • CS、IPがポップされると言うことは、もとの処理に戻るという意味で、もとの処理を続行する

  このような流れで割り込み処理を実行する。


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