スタックポインタとローカル変数平成20年7月26日 スタックは内部高速RAM(0FB00Hから0FEFFH)に配置されます。 C言語で書いたローカル変数(関数の中で宣言した変数)はスタックに格納されますが、内部高速RAMは1kバイトしかないので、あまりたくさんの領域をとることができません。 トラ技BIOSが起動して、ユーザアプリケーションが動き出したときには、いったいどこを指しているのでしょうか。スタックに余りがいっぱいあれば、大きな配列(とはいっても500バイトくらいですが、このクラスのマイコンにとっては十分な大きさです)を動的に確保することができます。
スタックポインタの初期値スタックポインタの値を調べるには、アセンブラの命令を使う必要があります。 MOVW AX,SP という命令を実行すると、SPの値がAXに格納されます。 ただ、この後、AXをC言語の変数に入れる方法がわからない※1ので、メモリ上にAXレジスタの値を格納することにします。 ※関数呼び出し時の第一引数がAXに入るので、C言語の関数をCALL命令で呼んでやればよい気もする。
次のコードは、SPの値をF708番地に格納するコードです。アセンブラソースとして作成し、プロジェクトに追加します。 このコードはC言語のプログラムからcheck_sp()関数で呼び出せます。
実行前
実行後
スタックポインタはFE10を指しているようです。 しかし、動的に256バイトの配列を取ったらプログラムがうまく動作しませんでした。まだまだ謎が潜んでいるのかもしれません。 check_sp関数のプロジェクトを check_sp.lzh に置いておきます。ご自由にお使いください。
|
Copyright(C) 2008 NAITOU Ryuji. All rights reserved. 無断転載を禁ず