質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.80%

割込み前後のスタックポインタの値

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,185

torimingo

score 78

アセンブリ言語の勉強中です。
割込み前後で、スタックポインタの値というのは、同じ値になっているのでしょうか?
割込み前に、プログラムカウンタや汎用レジスタの保存をして、割込み処理(func())を行い、その後、汎用レジスタとプログラムカウンタの復旧をすると思うのですが、スタックポインタが割込み処理(func())をしている間に書き換わってしまうと、割込み処理後に、汎用レジスタやプログラムカウンタの復旧ができなくなってしまうのではないでしょうか・・?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • maisumakun

    2019/05/05 22:30

    処理するCPUやモードは何でしょうか?それによって大きく違ってきます。

    キャンセル

  • torimingo

    2019/05/05 23:41 編集

    CPUは「H8」というものです。
    マイコンボート名は「H8/3069F」です。(ネットで購入済みですが、届いていないので手元にはありません)
    すみません、モードとは、なんのことでしょうか?

    キャンセル

回答 2

+3

同じです、、と言うより、割り込み処理は、そのように作成しないといけません。

H8がどうなっていたかは、覚えていないですが、
現在のアドレス(とCCR)をスタックに Pushするようです。
それ以外は、自前ですべてする必要があったと思います。

普通はアセンブラで記述するのですが、ライブラリでまとめて行うものがあったかも。(割込みの先頭で、自前のスタックに切り替え、終了時にスタックを戻すとか)

正確なところは、H8 のアセンブラマニュアルを参照しましょう。


ちょっと検索したところ ハードウェアマニュアルがありました。
PC と CCR のみ スタックにpush されるようですね。(「2.CPU632.8.4 例外処理の動作」)
後は、割込み処理側の責任。

昔、使ったと思ったら、マニュアルの発行が 2001年 初版 で、新規採用は"止めましょう" みたいですね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/06 07:31

    割込み時にPCとCCRがスタックにpushされ、割込みからの復帰時にPCとCCRがスタックからpopされるようなのですが、これは、「割込み前後でスタックポインタが同じ値になることが保証されている」という意味ではないですよね・・・?
    「アセンブラでのプログラミングをミスすれば、割込み前後でスタックポインタが異なってしまう」ということになるでしょうか?
    割込み処理から戻るときの、復帰命令rteというのがよくわからなくて・・・。復帰命令を実行するとスタックに積まれたPCとCCRがレジスタに戻るという認識なのですが、スタックポインタにどんな値が入っていても、復帰命令を実行すればPCとCCRは割込み前の状態に戻るのでしょうか・・・?

    キャンセル

  • 2019/05/06 10:05

    > 「アセンブラでのプログラミングをミスすれば、割込み前後でスタックポインタが異なってしまう」
    Yes です。正確には、割込み処理のプログラムをミスすればです。
    > 復帰命令rte
    スタックの位置は、割込みの最初と同じになっている事が前提。割込み内で、スタックを変更する事もあるでしょうから。少なくとも、H8には、割込み位置を覚えるレジスタはなさそうです。
    あと、割込みの種類は一種類では無いので注意を。動作モードによっても挙動が違うのがあったりもします。(正確にはマニュアルを)

    キャンセル

checkベストアンサー

+1

同じ値になってます
そりゃ割り込みかかってスタックポインタが変わってしまったら、おっしゃるように破綻しますわな

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/06 07:57

    スタックの理解が不足していたようです、ご回答ありがとうございましたm( _ _ )m

    キャンセル

  • 2019/05/06 09:42

    割り込み処理の中でスタック操作をした場合、元に戻す処理が必要です。
    (n個積んだらn個戻す)
    そうしないと破綻します。

    キャンセル

  • 2019/05/06 10:07

    H8では、全レジスタのpush は無いようです。その辺は、割込み処理の責任。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る