藤原と申します、 This message is reply to DION vega - san (Subject was : [H8-ML(2260)] 例外処理でのスタックポインタ) Message-ID: <000901c26cd9$7017b4a0$0101a8c0@dellal12> in Sun, 6 Oct 2002 10:39:30 +0900 ... > ハードマニュアルのp98に例外処理でのスタックポインタは、 > > 偶数にしないとCCRが正しく復旧しないとあります。 > > 偶数にするには具体的にどうしたら良いのでしょうか? > > 最初偶数にしても途中で、奇数になることはないのでしょうか? 基本的には、最初偶数に設定すると、奇数になることはありません。 PUSH/POP では、必ず2バイト単位でオペレーションされますし、 JSR/RTS でも割り込みでも2バイト単位ですので問題ありません。 ただ、多重割り込みを行う場合、別の目的でスタックポインタを 明示的に変更する場合があります。 これは、リエントラント(再入可能)という概念が関連するのですが、 サブルーチンは、通常、JSR で呼ばれるのと逆順で復帰しますから、 サブルーチンの処理の途中で同じサブルーチンが呼ばれることはありま せん。 しかし、割り込み処理が関わってくると、あるサブルーチン(特に 汎用的なもの)の処理の途中で割り込みが発生し、割り込みの中で、 同じサブルーチンが呼ばれる可能性があります。 この場合、サブルーチンの中の変数を性的に確保していると、2度目 にサブルーチンが呼ばれたときに、最初の(処理途中の)変数が破壊さ れることになります。 これをさけるために、割り込み処理中に呼ばれる可能性のあるサブ ルーチンは、リエントラント(再入可能)になるように設計します。 この時の基本的なテクニックとして、変数はすべてスタック上に確 するというのがあります。 そうすれば、最初のサブルーチンと割り込み中に呼ばれたサブルー チンでは独立した変数が確保できて副作用が無くなるわけです。 このときに、基本的には「サブルーチンで使う変数の大きさ」だけ スタックポインタから引き算して、そこに変数を確保します。 この、「サブルーチンで使う変数の大きさ」がたとえ奇数であって も、偶数を引かなければなりません。 そのあたりを注意すれば問題ないと思います。 -- _/ -- Last 16263 hours until ATHENS 2004 Olympic Games (06 Oct @133) - _/ FUJIHARA Keiichi _/ E-Mail : keiichi@xxxxxxxxxxxxx <or> nagi@xxxxxxxxxxxxxxx _/ URL : http://www.keiichi.fujihara.name/ --------------------------------------------+----- Luna Phase 29.11 -- PGP FingerPrint = 7CC3 4F95 8CC7 87D3 7178 C348 CD65 7F08 D68F 69F6