割込み後に元の場所から再開するためにプロセッサが保存するレジスタ
基本情報技術者試験 平成30年度秋期 午前 問10 / コンピュータ構成要素 › プロセッサ
過去問にチャレンジ
割込み処理の終了後に割込みによって中断された処理を割り込まれた場所から再開するために,割込み発生時にプロセッサが保存するものはどれか。
- ア
インデックスレジスタ
- イ
データレジスタ
- ウ
プログラムカウンター
- エ
命令レジスタ
会話形式の解説
講師今回は割込みの問題です。割込み処理が終わったら、中断された処理を割り込まれた場所から続けなければなりません。そのために何を残しておけばよいかがポイントです。
受験者割り込まれた場所から再開するということは、どこまで実行したかの情報が必要だと思います。ただ、命令レジスタとプログラムカウンタのどちらなのかで迷いました。
講師迷いやすいところです。まず、再開するには「次にどの命令を実行するはずだったか」が分かればよい、という点を押さえましょう。では、次に実行する命令の位置を持っているレジスタはどれだと思いますか。
受験者プログラムカウンタでしょうか。次に実行する命令のアドレスを指していると覚えています。
講師そのとおりです。プログラムカウンタは、次に実行する命令が主記憶のどこにあるか、つまりアドレスを持っています。割込みが起きたときにこの値をスタック(一時的にデータを積んでおく記憶領域)へ退避し、割込み処理の終了時に元へ戻せば、中断直後の命令から実行を続けられます。
受験者命令レジスタも命令に関係するので、こちらでも再開できそうな気がしてしまいます。
講師命令レジスタは、主記憶から取り出して、これから解読・実行する命令の中身そのものを入れておくレジスタです。持っているのは命令の内容で、その命令がどこにあるかではありません。中身だけが分かっても、プログラムのどこへ戻ればよいかは決められないのです。
受験者中身と位置の違いなのですね。インデックスレジスタはアドレスに関係すると聞いたことがありますが、これは違うのですか。
講師インデックスレジスタが持つのは、配列の添字やオフセットのような、アドレス修飾に使う値です。命令のオペランド、つまり計算の対象となるデータのアドレスを求めるときに使います。命令の位置ではないので、保存しても再開位置は分かりません。
受験者データレジスタは、演算の対象や途中結果を置いておくものなので、実行の流れとは関係なさそうです。
講師その理解で大丈夫です。データレジスタの中身は計算に使う数値データで、どの命令から続けるかを決める情報ではありません。
受験者整理すると、再開位置を決めるのは次に実行する命令のアドレスで、それを持っているのがプログラムカウンタということですね。
講師はい。補足すると、プログラムカウンタは命令アドレスレジスタとも呼ばれます。また、実際のプロセッサではステータスレジスタや汎用レジスタも一緒に保存することがよくあります。ただ、この問題が問うているのは再開位置を決める情報なので、答えはプログラムカウンタです。命令レジスタは中身、プログラムカウンタは位置、という対比で覚えておくと引っかけを避けやすくなります。
まとめ
割込み処理のあと中断した処理を同じ場所から再開するには、次に実行するはずだった命令の位置が分かっている必要があります。その位置(主記憶上のアドレス)を持つのがプログラムカウンタで、割込み発生時にスタックへ退避し、割込み処理の終了時に戻します。命令レジスタは命令の中身を持つだけで位置は持たないため、正解にはなりません。インデックスレジスタはアドレス修飾に使う値、データレジスタは演算に使うデータを持つレジスタです。
解答・解説
正解はウです
この問題のテーマ
割込み処理が終わったあと、中断した処理を同じ場所から続けるために、プロセッサが割込みの発生時に必ず残しておく情報は何かを問う問題です。
解き方の考え方
中断した場所から再開するには、「次にどの命令を実行するはずだったか」が分かっている必要があります。そこで、各レジスタが何を保持しているかを確認し、次に実行する命令の位置を持つレジスタを選びます。このレジスタは割込み発生時にスタックへ退避され、割込み処理の終了時に元へ戻されます。そのため、プロセッサは中断前と同じ命令から実行を続けられます。
選択肢ごとの解説
- ×ア インデックスレジスタインデックスレジスタは、配列の添字やオフセットのように、アドレス修飾に使う値を持つレジスタです。命令のオペランドのアドレスを計算するときに使われますが、次に実行する命令の位置は持っていません。そのため、これを保存しても再開位置は分かりません。
- ×イ データレジスタデータレジスタは、演算の対象や途中結果などの数値データを一時的に置いておくレジスタです。中身は計算に使うデータであり、命令のアドレスのような実行の流れを決める情報ではありません。したがって、再開位置を保存する役割には当たりません。
- ○ウ プログラムカウンタープログラムカウンタは、次に実行する命令の主記憶上のアドレスを保持しています。割込みが起きたときにこの値を退避し、割込み処理の終了時に元に戻せば、中断された直後の命令から実行を続けられます。したがって、問題の目的にそのまま合うのはプログラムカウンタです。
- ×エ 命令レジスタ命令レジスタは、主記憶から取り出して、これから解読・実行する命令そのものを入れておくレジスタです。保持しているのは命令の内容であり、その命令がどこにあるか(アドレス)ではありません。そのため、戻り先を特定する情報にはなりません。
補足
実際のプロセッサでは、プログラムカウンタのほかにステータスレジスタや汎用レジスタも保存することがよくあります。ただし、この問題が問うているのは再開位置を決める情報なので、答えはプログラムカウンタになります。
POINT
- プログラムカウンタは次に実行する命令のアドレスを保持するレジスタで、命令アドレスレジスタとも呼ばれます。
- 割込み発生時にはプログラムカウンタの値をスタックへ退避し、割込み処理の終了時に戻して元の処理を再開します。
- 命令レジスタは命令の中身を持ち、プログラムカウンタは命令の位置を持つという違いを押さえておきましょう。
- インデックスレジスタはアドレス修飾に使う値を、データレジスタは演算に使うデータを持つレジスタです。
