[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[pilot-tech-ml 92] Re: スタックの 拡張方法
後藤と申します
#Palm/Pilot用Progはいまだに作ったことはないのですが。。。
>>>>> From: "Shuji Fukumoto" <fukumoto@wakuwaku.ne.jp>
> そこで今回とった方法についてご意見を戴けたらと思います。その方法は、「新規
> にスタックスペースを確保して、すり替える」というものです。具体的には、
私はHackMasterの構造の理解もしてないので、その前提で、一般的な
話しをさせていただきますが、組み込みシステムなどの割り込み
ハンドラなどを作っていると上記方法はよくつかわれます。
> // A7がスタック?
> ULong saveStack, newStack, p;
> newStack = (ULong) MemPtrNew (dStackSize);
> if (newStack != 0)
> {
> p = newStack - dStackSize;
^^^^^^^^^^^^^^^^^^^^^^
誤pasteか? とも思いますが、ここは newStack + dStackSizeでは?
#スタックとはpushするとスタックポインタ値は減っていくものですので。
このままだと p はよからぬ場所をポイントしてしまいますよね。
そのままスタックが使われてしまうと、かなりヤバイです。
よからぬところを破壊して全体が動かなくなる可能性大。
> saveStack = __getA7 ();
> __setA7 (p);
> }
>
> outHandled = handleFieldDown (&event, FrmGetActiveForm (), inField);
>
> if (newStack)
> {
> __setA7 (saveStack);
> MemPtrFree ((Ptr) newStack);
> }
>
あとの部分は、コンパイラが関数エントリ時に link a5,0 などを使用して
a5レジスタ相対でローカル変数をアクセスしていることが確認できれば
きっと問題はないこととと思います。
アセンブラコードで確認すればよいと思います。
> アセンブラの知識はほとんど無いのですが、考え方は有っていますよね?
スタックをすり替えればよいという考え方はあっていると思います。
ただ、Hackのことも考慮するとちょっと事情は違うのかもしれませんし、
その弊害の可能性については、ちょっと想像がつきません。
--- Regards,
Shun-ichi Goto <gotoh@taiyo.co.jp>
R&D Group, TAIYO Corp., Tokyo, JAPAN