- ベストアンサー
基本情報処理技術者試験 質問
プログラムを実行中に、スーパーバイザコールなどの割込みが入ったとき、「プログラムカウンタの値やレジスタの値が一時退避し、割り込みの処理が終わったらその値は戻ってくる」とテキストに書いてありました。 割り込み発生時のプログラムカウンタやレジスタの値の退避先ってどこになるんでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
失礼しました。 スタックポインタ(退避メモリの現在の位置アドレス) 0x1000~:AX,BX,CX,DX,BP,DI,SI(レジスタ各2バイト) 0xFF2:DS,ES(セグメントレジスタ各2バイト) 0xFEE:割り込み対処用フラグ退避(2バイト) 0xFEC:0x09(0x109の下位) 0xFEA:0x01(0x109の上位) 0xFE8:ここで割り込みルーチンに移った(0x200) 0xFEE:IRETにより、(0x109)の番地2バイトを復帰、フラグ(2バイト) を復帰し、プログラムカウンタレジスタに移し実行アドレスを 更新(0x109へ飛ぶ) 0xFF2~:元通りスタックメモリからレジスタへ復帰していく。 0x1000:元に戻る ですね…。
その他の回答 (2)
No1さんの通りですね。 例えば現在の実行中アドレスが、0x100 番地 スタックポインタ0x1000(LIFO方式のメモリ構造です)とすると…、 (8086系16ビットCPUとします) ---------------------------------------------------------------- 実行の流れ ---------------------------------------------------------------- 0x100:PUSHA(汎用レジスタ退避) 0x101:PUSH DS 0x103:PUSH ES 0x105:PUSHF(フラグ退避) 0x106:CALL 0x200(CALL命令1バイト、飛び先番地2バイト) 0x109:POP ES 0x10B:POP DS 0x10D:POPA 0x10E:... 0x200:IRET(割り込みから戻る) ---------------------------------------------------------------- スタックの流れ ---------------------------------------------------------------- 0x1000~:AX,BX,CX,DX,BP,DI,SI(レジスタ各2バイト) 0x9F2:DS,ES(セグメントレジスタ各2バイト) 0x9EE:割り込み対処用フラグ退避(2バイト) 0x9EC:0x09(0x109の下位) 0x9EA:0x01(0x109の上位) 0x9E8:ここで割り込みルーチンに移った(0x200) 0x9EE:IRETにより、(0x109)の番地2バイトを復帰、フラグ(2バイト) を復帰し、プログラムカウンタレジスタに移し実行アドレスを 更新(0x109へ飛ぶ) 0x9EE~:元通りスタックメモリからレジスタへ復帰していく。 0x1000:元に戻る 汚くてすみません…。
- ymmasayan
- ベストアンサー率30% (2593/8599)
「スタック(エリア)」です。メモリーの一部を割り当てその管理はSP(スタックポインタ)が受け持ちます。 機械語レベルで細かく言えば、(機械によって名前は違いますが) レジスターの値や引数は呼び出し側プログラムがPUSH命令で退避し プログラムカウンターの値はCALL命令がハード的に(内部的に)退避します。 RET又はRETURN命令でスタックの先頭をプログラムカウンターに入れることでもとのプログラムに戻ります。