アプリ版:「スタンプのみでお礼する」機能のリリースについて

プログラムを実行中に、スーパーバイザコールなどの割込みが入ったとき、「プログラムカウンタの値やレジスタの値が一時退避し、割り込みの処理が終わったらその値は戻ってくる」とテキストに書いてありました。
割り込み発生時のプログラムカウンタやレジスタの値の退避先ってどこになるんでしょうか?

A 回答 (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:元に戻る

ですね…。
    • good
    • 0

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:元に戻る

汚くてすみません…。
    • good
    • 0

「スタック(エリア)」です。

メモリーの一部を割り当てその管理はSP(スタックポインタ)が受け持ちます。
機械語レベルで細かく言えば、(機械によって名前は違いますが)
レジスターの値や引数は呼び出し側プログラムがPUSH命令で退避し
プログラムカウンターの値はCALL命令がハード的に(内部的に)退避します。

RET又はRETURN命令でスタックの先頭をプログラムカウンターに入れることでもとのプログラムに戻ります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!