割り込みとは、実行中のプログラムを中断もしくは停止して、別のプログラムが割り込むことです。
以下は、実行中のプログラムを中断する割り込みが発生して、割り込み処理が実行される様子です。
赤色で示した動きは、メインメモリ上のプログラムAの機械語の命令がプログラムカウンタに従って順に実行される様子です。
緑色で示した動きは、割り込み処理がプログラムカウンタに従って順に実行される様子です。
割り込みが発生すると、プログラムカウンタの値が対応する割り込み処理が格納されたメモリアドレスに変わります。そして、割り込み処理が終了すると、プログラムカウンタの値が割り込み前の値に戻ります。
以下は、実行中のプログラムを停止する割り込みが発生して、割り込み処理が実行される様子です。
この場合は、プログラムAは、割り込みが発生した以降の処理は行われません。
実行中のプログラムを中断する割り込みは、単純化すると、以下の流れで実現できます。
1. プログラムAの実行中に割り込みAが発生する。
2. 命令レジスタに、プログラムカウンタの値をプロセッサのスタックにPushするPUSH命令を書き込み、実行する。(つまり、割り込み処理が終了した後に再開させたいプログラムカウンタの値をPushしておく)
3. プログラムカウンタに割り込み処理Aの先頭の命令が格納されたメモリアドレスを書き込む。
4. 割り込み処理が開始される。
5. 汎用レジスタなど、任意のプログラムが使い得るすべてのプロセッサレジスタ(以降、レジスタ)の値をPUSH命令でPushして、中断時のプログラムAの状態を保存しておく。(プログラムAに対するコンテキストスイッチ)
6. 割り込み処理Aの任意の処理が実行される。
7. 手順5でPushした値をPOP命令で読み出し、それぞれのレジスタの値を中断時のプログラムAの状態に戻す。(プログラムAに対するコンテキストスイッチ)
8. 手順2でPushした値をPOP命令で読み出し、その値を無条件分岐命令でプログラムカウンタに書き込む。(割り込み処理終了)
9. 割り込みで中断されたプログラムAが再開される。
実行中のプログラムを停止する割り込みは、単純化すると、以下の流れで実現できます。
1. プログラムAの実行中に割り込みAが発生する。
2. プログラムカウンタに割り込み処理Aの先頭の命令が格納されたメモリアドレスを書き込む。
3. 割り込み処理が開始される。