[H8-ML(2265)] Re: 例外処理でのスタックポインタ
From: 廣田 正孝 <mhirota@xxxxxxxxxxxxx>
Date: 2002年10月06日(日)18時16分38秒
 こんにちは、廣田です。
"K.miyamae" wrote:
> 
> 藤原さん
 :
> れるのでこのようなこのとは不要なのですよね。

 こちらは藤原さんにお任せしてっと。


> 
> >  MOV.L #(偶数):32,SP
> >です。この命令がリセット例外処理の最初の命令になります。

> 3、4回読み直して自分なりに納得したのですが
> 奇数の状態で割込みが発生したとき、CCRを破壊する前に
> スタックを変更しておくのですね。
> 最後はこれを元の戻すのが必要ですね。

 違います。スタックポインタは偶数しか設定してはいけません。割り込みを
禁止し、サブルーチンコールもしないなら、 スタックポインタを奇数値にし
ても問題ないかもしれませんが、そう言うプログラムを作ることは無いでしょう。
少なくても、私はスタックポインタ値が奇数になるのを許すプログラムを書き
ません。

 スタックポインタが奇数値になっていたら、その時点で発生した割り込みや
その他のスタックオペレーション命令を実行したとたんに、以後の動作は保証
できないのです。 スタックポインタが奇数になっているとき例外が発生して
しまったら、その後でどうあがいてもスタック上に積まれているはずの何らかの
データの一部は失われていて、復旧することはできません。
(推測ですが、おそらくスタックポインタが奇数になっていた場合、スタックポ
インタ-1のアドレスからデータが積まれているのかもしれませんが、これは
メーカーが保証している動作ではないので、あてにできません。)

 これはH8/300Hプロセッサが「ワード長」、「ロングワード長」のデータの移
動を行う場合、偶数アドレスから偶数アドレスへしか転送できない構造になって
いるからです。JSR,RTS,RTE,PUSH,POP,TRAPAなどのスタックオペレーション命令
はワード長以上のデータを転送しますから、スタックはいつも偶数アドレスを
示していなければなりません。

> >  MOV.L #(偶数):32,SP
> >です。この命令がリセット例外処理の最初の命令になります。

と書いたのはH8/300Hがリセット状態から復帰した最初の状態をを「リセット例外
処理」というのであって「リセットとその他の例外処理」という意味では有りません。
マニュアルの例外処理->リセット->リセット直後の割り込み 付近の説明をよく
読んでください。

 
> でも(バグ、意図的に変更される場合は除いて)スタックの偶数アドレスが保証
> されるなら(ここが気がかりですが)、不要ですね。

 スタックポインタ値を偶数に保証するのは、プログラマが行うのであって、CPUは
関知しません。 私は、先に書いたようにSP(ER7)が奇数になるのを許さないプログ
ラムを書きますので、例外処理の先頭でER7のビット0を確認して、奇数になってい
たら「何らかの異常(バグ)が有った」と判断して異常処理に分岐するように作って
います。

では。

-- 
/******************************************************************************
My mail is reproduced precisely by making a setup of a lapel of your mail 
software more than 80 characters.
Name: 廣田 正孝 "Masataka Hirota"
E-mail address:  mhirota@xxxxxxxxxxxxx
                 GCD03040@xxxxxxxxxxx
******************************************************************************/
スレッド概略
[2260(R)](起点)
 └[2263(U)]
   └[表示中]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]