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

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

新規登録して質問してみよう
ただいま回答率
85.50%
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

Q&A

解決済

2回答

465閲覧

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

torimingo

総合スコア122

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

0グッド

0クリップ

投稿2019/05/05 11:42

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/05/05 13:30

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

2019/05/05 14:42 編集

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

回答2

0

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

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

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

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


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

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

投稿2019/05/05 15:16

編集2019/05/05 15:32
pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

torimingo

2019/05/05 22:31

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

2019/05/06 01:05

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

0

ベストアンサー

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

投稿2019/05/05 14:15

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

torimingo

2019/05/05 14:57 編集

割込み処理の前後で、スタックポインタの値はまったく変化しないのでしょうか? 割込みした処理を実行中に、スタックに何か積まれたら、スタックポインタは変化するような気がしてしまうのですが・・・。 割り込みした処理が終了すると、スタックポインタは割込み前の状態に戻るのでしょうか?戻るとしたらスタックポインタはどこに退避されているのでしょうか・・・?
y_waiwai

2019/05/05 15:01

割り込みがかかると、割り込み時点のPCの値、及び全レジスタがスタックにプッシュされ、割り込みルーチン終了時に、その全レジスタ及びPCの値がすべてスタックからポップされ、復元されます。 なので、スタックポインタの値は変わりません。スタックは消費しますが。
y_waiwai

2019/05/05 22:46

スタックという概念をまだよくわかっていないようですが、、 スタックのアクセスは、プッシュとポップがあり、(H8では)プッシュすると、スタックポインタは-2され、ポップすると+2されます 割り込み時、サブルーチンコールも同様ですが、プッシュした数と同じ数だけポップされます。 まあ、PCなりCCRなり他のレジスタなりを保存(プッシュ)して、復帰(ポップ)しているので、双方同数になるのは理解できると思います #これを同数にならないようにすることも(アセンブラでは)可能ですが、いっぺんやってみればどうなるかわかると思いますが
torimingo

2019/05/05 22:57

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

2019/05/06 00:42

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

2019/05/06 01:07

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問