• ベストアンサー

割り込み処理(H14春22)

以下の基本情報処理問題の解答を見ても理解し切れません。 ご助言お願いします。 【問22】割込みが発生すると,あるアドレスが退避され,割込み処理が実行される。割込み処理が完了すると,退避されていたアドレスが復帰され,割込み直前に実行していたプログラムの実行が再開される。退避されていたアドレスはどれか。 ア 割込みが発生したときに実行していた命令のアドレス イ 割込みが発生したときに実行していた命令の次の命令のアドレス ウ 割込み処理の最後の命令のアドレス エ 割込み処理の先頭の命令のアドレス 【答】イ 割込みが発生すると実行されていたプログラムが中断され、割込み処理が実行される。 割込み処理が完了すると退避されていたアドレスが復帰され、割込み直前に実行していた元のプログラムの実行が再開される。 その場合、割込みが発生したときに実行していた命令の次の命令のアドレスが実行される。 【コメント】 下のような流れになると思っています。 なぜ「次の命令のアドレス」が出てくるのか、教えて頂けませんか。 (1)処理実行中 (2)割り込み発生 (3)(1)を中断し、どこかに退避 (4)(2)を実行 (5)(2)が完了したので、(1)を元に戻す (6)(1)を実行(割り込み前に戻る)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.6

「命令処理の中断」ではなく「(命令の塊としての)プログラムの処理がが中断」という意味なので合ってはいますけど,確かに分かりにくい表現でしょう。 CPUの動きを複数の人でやっている流れ作業みたいなのにたとえて考えると良いと思います。 流れ作業をしているときに「ちょっとこれをお願い!」と言われて,もし今やっている処理をいきなり中断させようとしたら,全員の「やりかけ」のものを退避するか,全部やりかけ前の状態に戻さなくてはなりません。 でも,全員のやりかけ状態を退避したり、「全員がやりかけ前に戻す」っていうのは非常に面倒くさいですよね? そこで流れ作業の先頭からプログラムの続きを読み込ませるのをやめて「今やってるのが終わったらこれをお願い!」とするわけです。これでCPU設計が格段に楽になります。 したがって流れ作業の先頭が今処理にかかった命令・・つまり今まさに実行しようとしている命令と次の命令の間に割込み処理が挟まるような動きになるわけですね。

noname#99096
質問者

お礼

遅くなりました、ご回答ありがとうございます。 まさに私が勘違いしていた部分です。 「命令の中断」ではなく、その命令を含んだ「プログラムの中断」なんですね。 >今まさに実行しようとしている命令と次の命令の間に割込み処理が挟まるような動き 「プログラムA→プログラム割→プログラムB」ではなく、 「命令1→命令2→命令3→「プログラム割」→命令4→命令5…」となるイメージですね。 イメージし易い例をありがとうございます。 ご回答締め切らせて頂きます。

その他の回答 (6)

  • pc_net_sp
  • ベストアンサー率46% (468/1003)
回答No.7

PICマイコンのプログラミングでも時々間違えるんですよね~ 割り込みをかける場所。 プログラム実行させて割り込みがかかった時だけ誤動作・フリーズが起こる。 まだまだ私もプログラミングは素人という事でしょうか・・・

  • ybnormal
  • ベストアンサー率50% (220/437)
回答No.5

>そうなると、解答にある >「割込みが発生すると実行されていたプログラムが『中断』され」と >「割込み『直前』に実行していた元のプログラムの実行が再開され >る」は誤った表現なんでしょうか 実行中の命令を中断ではなくプログラムを中断と書かれているので間違いではありません。 割り込み要求が来た場合、新たな命令の発行を止め、現在実行中の命令(パイプライン処理をしていれば、複数命令あるのが普通)を全て終了させてCPUを「静か」な状態にしてから、割り込みハンドラに飛びます。このときに退避されるPCは、次に発行される命令を指していますから、割り込みから戻ってプログラムを再開すると、割り込み発生時に実行中であった最後の命令の次の命令から実行が再開されます。

noname#99096
質問者

お礼

遅くなりました、ご回答ありがとうございます。 根本的に「命令」と「プログラム」を同じものだと読み違えていました。 的確なご指摘ありがとうございます。 割り込み発生時に実行していた命令は、「完全に終わらせる」事がポイントですね。

  • pc_net_sp
  • ベストアンサー率46% (468/1003)
回答No.4

自己訂正 誤 プログラム3実行中に割り込みが発生したとする。(割) 正 アドレス3実行中に割り込みが発生したとする。(割)

noname#99096
質問者

お礼

遅くなりました、ご回答ありがとうございます。 皆さんのご回答を何度読んでも、いまいちスッキリしなかったのですが、 自己訂正された事で、ようやく食い違いに気付けました。

  • pc_net_sp
  • ベストアンサー率46% (468/1003)
回答No.3

情報処理は分かりませんが、、、 >解説の表現が悪いのでしょうか。 表現に引っかけじみた事も書いてないです。 プログラム実行 12345678 プログラム3実行中に割り込みが発生したとする。(割) 123割45678 っとなる。 よって実行していたアドレス3で、 実行していた命令の次の命令のアドレス4ですから、 答えはイ            

noname#99096
質問者

お礼

遅くなりました、ご回答ありがとうございます。 自己訂正して頂いた事が理解につながりました。 プログラムA(12345678) プログラムB(一二三四五六七八) プログラムZ(壱弐参…) プログラムAの3で割り込み発生した場合 ・割込み発生時、『中断』されるのは「プログラムA」 ・退避されるのは、「プログラム単位」ではなく「命令4(のアドレス)」 ←勘違いポイント ・「割り込み直前に実行していた元のプログラム再開」は、「命令4」(広義でPGA)の実行を指している ・「プログラムA→割→B」ではなく、1→2→3→「プログラムZ」→4→5… となる 「プログラム」と、その中にある「命令」がごっちゃになってました。 ありがとうございました。

  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.2

普通のCPUは、割り込みの処理は、今実行している命令が終わってから実行されます。 なんで、割り込みから戻るときには、次のアドレスになります。

noname#99096
質問者

お礼

ご回答ありがとうございます。 No.1の方と同意見ですね、それがCPU割り込みの普通の流れなんですね。 そうなると、やっぱり解説の表現が悪いのでしょうか。 もしくは私の読解力がないのか…

回答No.1

退避していた時の命令は割込発生時点では終了しているので、退避していたアドレスに戻って、再度実行して今うと、2回実行してしまうからです。 たとえば、 CPUが 1 2 3 と実行したときに割込が発生し、一通り実行し終わって戻った時には、3からではなく、4から実行したいからです。

noname#99096
質問者

お礼

ご回答ありがとうございます。 なるほど、割り込み発生時に実行してる処理は完了させるのですね。 そうなると、解答にある 「割込みが発生すると実行されていたプログラムが『中断』され」と 「割込み『直前』に実行していた元のプログラムの実行が再開される」は誤った表現なんでしょうか 公式ではないサイトからの引用ですので

関連するQ&A