[H8-ML(2261)] Re: 例外処理でのスタックポインタ
From: FUJIHARA Keiichi <keiichi@xxxxxxxxxxxxx>
Date: 2002年10月06日(日)11時21分23秒
藤原と申します、

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


スレッド概略
[2260(R)](起点)
 └[表示中]


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


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