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


10-5.割り込み処理の作り方

  では、実際に割り込み処理を作ってみる。その前に作るためにはどうすればよいのかを説明する。

割り込み処理内
  • 「CLI」命令を用いて割り込み許可フラグを0にする
  • 処理をする
  • 割り込みコントローラーに割り込み処理を終えたことを通知する
  • 「STI」命令を用いて割り込み許可フラグを1にする
  • IRETで戻る
  • もし、もとの処理も実行したい場合は、割り込みコントローラーに割り込み処理を終えたことを通知する前に、もと処理へfar jumpする
割り込み処理を設定する場合
  • MS-DOSのシステムコールに割り込みベクターを設定する方法があるのでそれを使用する。ただし、もとのアドレスを保管するのを忘れずに
  • MS-DOS以外のOSでは、自分で割り込みベクターを書き換えなくてはならない。
    • 「CLI」命令を用いて割り込み許可フラグを0にする(割り込みベクターを書き換えている途中にその割り込みが入ると、予期せぬところに処理が行ってしまうから)
    • 割り込みベクターの位置を計算し、現在のアドレスを保管する。
    • 新しい処理のアドレスを書き込む
    • 「STI」命令を用いて割り込み許可フラグを1にする

割り込みはいつ、いかなる状態で呼ばれるかわからないので、以下に注意する必要がある
  • レジスタの値はわからない(セグメントを含め)
  • レジスタを破壊してはいけない(元に戻ったときに処理を続行できない)
  • あまりPUSH,POPなどを多用しない(スタック領域の大きさがわからないので)
  • 処理はできるだけ速く終わらせる。(もとの処理が何の処理かわからないので速くその処理に戻さなくてはいけない)
  • 割り込み内容にもよるが、OSのサービス(システムコール)を利用できない (キーボードからの入力をしようと思っても、キーボードの割り込みが起こらない)

・割り込みベクターの設定

     AH=25h
     AL=割り込み番号
     DS=新しい割り込み処理のセグメント
     DX=新しい割り込み処理のオフセット
     をセットし、「INT 21h」を実行する
・割り込みベクターの取得
 
     AH=35h
     AL=割り込み番号
     をセットし、「INT 21h」を実行する
     ES=現在の割り込み処理のセグメント
     BX=現在の割り込み処理のオフセット

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