• ベストアンサー

基本情報処理技術者試験 質問

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

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

  • ベストアンサー
noname#50176
noname#50176
回答No.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)

noname#50176
noname#50176
回答No.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)
回答No.1

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

関連するQ&A

  • 割り込み処理(H14春22)

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

  • 情報処理概論

    今情報処理概論という勉強をしています。教科書をよんでもわからないので2つ質問です。 1.プログラムカウンタと命令レジスタ  例えばプログラムカウンタが”2256040”であるとき、次のフェッチサイクルではこの番地からはじまる命令が命令レジスタに移され移された命令が4バイト命令であれば、プログラムカウンタには4が加えられる。、と教科書に書いてあるのですがチンプンカンプンです。誰かわかりやすいように説明していただけますか? 2.演算装置について  例えば”01001010 11001101”と表記されている命令は、あるコンピュータでは”1010 11001101”にある16ビット符号付整数を演算装置のレジスタ(アキュムレーター)の内容に加え、その結果(和)をアキュムレーターにセットすることを意味する。、と教科書に書いてあります。まったく意味不明なので誰かわかりやすく説明できる人回答お願いします。 ながくなりましてすいません。よろしくお願いします。

  • PIC16F193X割り込み時の退避・復帰処理方法

    ICマイコンでの割り込み処理について、16F193Xの型番では割り込み発生時における退避・復帰が自動的に行われると認識しているのですが、下記型番では以前の様に wレジスタ、status,PCLATh等のレジスタを退避・復帰をプログラムで保存しておく必要がなくなったということでしょうか? 使う割り込みはタイマー割り込み(timer0)とし、割り込処理中の割り込みは禁止とした場合 因みに割り込みは以下の様に発生させ ////////////////////////// org   0 goto start org 4 goto INTLAP ////////////////////////// INTLAP BCF INTCON,2 INCF TES_CNT,1 RETFIE 割り込み処理中にTES_CONのレジスタ内容をPORTAの出力pinをオシロスコープで観察できる簡単なプログラムで走らせると動作していることが確認できましたが、退避・復帰が行われているかは不明です。 他に自動退避・復帰を確実に実行するためのプログラム等の操作を怠っていないでしょうか? 初心者で認識が誤っていないのか判断が出来ません。 対象型番 PIC16F1933 ? PIC16F1934? PIC16F1936 ? PIC16F1937? PIC16F1938 ? IC16F1939 PIC16F193X/LF193Xデータシート記述より(P71,72) 〇「このデータシートに記載されているデバイスRETFIE 命令では、割り込み前に実行していたアドレスをスタックから取得し、シャドウ レジスタから保存した内容を回復し、GIE ビットをセットすることによって、ISR から通常動作に復帰します。」 内容保存機能 〇「割り込み動作に遷移する際、復帰時の PC アドレス値がスタックに保存されます。また、次に示すレジスタ値も自動的にシャドウ レジスタに保存されます。 ・W レジスタ ・ ステータス レジスタ (TO および PD を除く) ・BSR レジスタ ・FSR レジスタ ・ PCLATH レジスタ 割り込みサービス ルーチンから通常動作に戻るとき、自動的にこれらのレジスタ値が回復されます。 とあります。

  • 割り込み処理

    こんにちは。 ただいま、MCAの試験勉強をしています。 書籍を2冊利用しているのですが、テキストの内容が違う箇所があってこまっています。 あるテキストは割り込み処理が発生すると、実行されていたスレッドは実行可能状態になり、割り込み処理を実行するとかいてあり、もう一つのテキストは割り込み処理が発生すると実行されていたスレッドは待機状態になり、割り込み処理を実行するとかかれています。 どちらが正しいのですか? どなたかよろしくお願いします。

  • データ処理実行中に処理件数を表示させたい

    こんばんは、ACCESS初心者です。 ACCESSのVBAで、あるデータ処理を行うプログラムを作成しました。 処理件数が多いため、現在処理中の件数をフォーム上に表示させてあげようと、 テキストボックスを配置し、そこへカウンタの値をセットしようと思います。 (カウントアップしているサマをユーザーに見せたい) しかし、ただセットするだけではダメのようで、 再表示的なこと?をしてあげないと表示されない感じなのですが、 処理中にテキストボックスの最新の値を常に表示させるには 何か方法があるのでしょうか? よろしくお願いします。

  • PWM制御のデューティ変更時におけるトラブル

    SH7211マイコンのPWM(モード1)を使用して、定電流制御をしています。 PWMの周期を10KHzとし、その割り込みの周期で電流値を増設のADコンバータで取得、PID演算の後にPWMのデューティを変更して電流を制御するフィードバック機構です。 この時、10KHzで割り込みをして電流を一定に保つようデューティを常に変更しているのですが、過度に電流を流さないようデューティの値を変更する時はデューティが50%以上にならないようにしています。 ですが、PWM出力をオシロで見ていると、例えば電流値を5Aから1Aへ変更しようとした時、変更するタイミングで何故かデューティが100%以上になってしまい、本来電流値が下がるべき所で一瞬だけ5A以上となる現象に悩まされています。 CPUのマニュアルに、「周期レジスタとデューティレジスタのコンペアマッチが同時に発生すると出力は変化しない」とあり、その時デューティが100%以上になってしまう動作例が載っているのですが、プログラム上でデューティは50%以上にならないようにしていますので、この箇所は問題ないかと思います。 今現在わかっている事ですが 1) 割り込みで常にデューティは書き換えているのですが、電流値を変化させた時、つまりデューティレジスタの値を急激に変化させた時に発生しているように見えます。2A→1A程度の変化では発生しません。 2) 5A→1Aと減らした時と、1A→5Aと増やした時両方で発生します。 3) デューティを変更する直前でブレークをかけて、適当なタイミングでブレーク解除した時、この現象が発生する時と発生しない時があります(デューティを変更するタイミングが問題?)。 4) デューティレジスタの値を0とした場合、上記に書きました「周期レジスタとデューティレジスタのコンペアマッチが同時に発生すると出力は変化しない」事に該当するかもしれないと考え、デューティレジスタの値が0の時は強制的に値を10としましたが、この現象が発生しました。 また、プログラムの中身ですが 1) 周期レジスタの値は3999、デューティレジスタの値は0~1999の値で変化。 2) 出力は初期出力がHi、コンペアマッチでLowというHi→Low出力。 3) 割り込み関数の中でADコンバータから値を取得→PID演算→デューティレジスタの値を変更という処理をしています。 4) 割り込みレベルを他の割り込みと比べて一番高くしているため、割り込み関数処理中に他の割り込みは発生しません。 長文申し訳ございませんが、何か同じような現象が起きた方、または何かしらの解決策をご存知の方、アドバイスを宜しくお願いします。

  • サービスルーチンの実行の流れ

    (c)ある処理を実行中に割込が発生してから、対応するサービスルーチンを実行し、元の処理に復帰するまでの一般的な処理の流れを説明せよ。 (1)プログラムの実行 (2)割り込み要求 (3)状態の退避 プロセッサは入出力装置の応答を待たずに実行中のプログラムをいったん停止して、他のプログラムを実行する。 (4)割り込み処理 元のプログラムに入出力動作が指定されると、OSに処理を依頼する。OSは入出力動作を起動し、他のプログラムに制御を渡す。 (5)状態の復元 入出力装置からの動作完了割り込みがあったとき状態を復元 (6)プログラムの再開 OSは入出力処理を実行後、元のプログラムの実行を再開する。 と6段階のフローにして考えてみました。合っていますでしょうか?

  • 組み込みソフトウェアの割り込みについて、

    今組み込みソフトウェアについて、勉強している物です。 割り込みについて、分からないため質問させていただきます。 割り込みをする際は、何らかの操作により、割り込みカウンタにビットが入り、 それにより、PCに割り込みアドレスを入れられ、割り込み処理が実行されるとの事ですが、 何らかの操作により、割り込みカウンタにビットが入り、それに検出がよくわからないです。 ポーリングで、カウンタの値を見ている訳ではないのに、どうやって検出するのでしょうか? 私の解釈、憶測では、カウンタをハードウェアでポーリングしており、そのためソフトウェアでは意識する必要がないのでは?と認識しております。

  • ハイパースレディングのレジスタについて

    ハイパースレディングのレジスタについて ハイパースレッデイングのCPUで2つのスレッドA,Bを動かすとする。 このときAの実行状態を示す汎用レジスタやプログラムカウンタと     Bの実行状態を示す汎用レジスタやプログラムカウンタの扱いはどうなのでしょうか。 次の2つの方法が考えられる。 (1) レジスタのロード、実行、レジスタのセーブを繰り返す方法。     CPU内に高速なメモリを持ち、実行前にレジスタに値をロードして、命令を実行して、レジスタの値を保存を繰り返して、A,Bのスレッドを実行する方法。 (2) A用のレジスタとB用のレジスタを2組用意して、相互に切り替えながら実行する方法。     Aを実行するときはA用のレジスタを使用して、Bを実行するときはB用のレジスタを使用する方法。 の2つが考えられるが、それとも他の方法があるのでしょうか。 それに関連して、1度に実行する機械語命令の個数はいくつなのでしょうか。 スレッドAの機械語命令を実行して、切り替えてBの機械語命令を実行するときに、 Aの1命令を実行してから、Bの1命令を実行する。1命令毎に切り替えるのでしょうか、 それともAの数個の命令を実行してから、Bの数個の命令を実行するのでしょうか。 このときスレッドを切り替える際に1度に実行する機械語命令の個数はいくつでしょうか。 ご存知の方がおりましたら、教えて下さい。

  • コンピュータを構成する基本的な装置について

    ・(A)装置が(B)装置からデータやプログラムを読み込むためには、(C)装置内にある特別なレジスタである(D)の値((E))が必要となる。 ・(F)装置から取り出されたデータやプログラムは、(G)を通って(H)装置へ運ばれる。このとき、処理の対象となるデータは(I)に一時記憶される。一方、処理の手順を示したプログラムの一部は(J)に送られる。 (A)~(J)に適切な語句を入れよ、という問題なのですが、答えがわかりません。 どなたか回答お願いいたします。 あと、 (A)制御 (B)主記憶 (F)主記憶 だと思うのですが、間違ってたら教えていただけると助かります。

専門家に質問してみよう