こんにちは、神戸の澤です。 Sawaguchi Yujiさんが04.4.9 2:00に書きました: >>でもまさか実際にstaticとは..... >ちょっと Cygwin の gcc でアセンブラソースを吐かせてみました >ら、スタックには確保してます。でも、初期値として 0 を代入し >ていました。 >で、明示的に static と宣言してやると・・・やっぱりスタックに >確保して 0 を代入してました。なんじゃぁ? >ちなみに、普通の関数内で宣言した static 変数は別セグメントに >確保され、static でなければスタック上に確保されて自動的には >0 で初期化されません。 通常、その別セグメントをリセット直後のコードで初期化するようにしている んですよね。 しかし、これに関してはコンパイラ自身(リンカorライブラリ?)が初期化し てるってことですよねぇ。うーむ。 >>なるほどなるほど。でも、そういうCPUの場合の自動変数っていったいどうや >>って確保してたんでしょうね....。 >>いや、その方法ってH8の時にもなんらかの参考(例えばメモリ確保に関しての >>ノウハウとか)にならないかなぁと思ったものですから(^_^;)。 >その場合は、データ領域にポインタ変数をとるか、汎用レジスタを >一つ専用に使ってこれをスタックポインタ代わりにします。 >要するに、データを格納してポインタをデクリメント(PUSH) >と、データを取り出してインクリメント(POP)動作をさせれば >よいわけです。PUSH、POP命令が使えないのでニモニック数が増えま >すが。 >普通のCPUはスタックポインタが1つしかありませんので、複数の >スタックポインタを使う言語、例えば Forth などではこういうテク >ニックを使います。 あ、なるほど。コンパイラ自身がスタックを管理するワケですね。C言語側に はその影響が出ないようにしてるっと。 -- ## from Kazutaka 'Zak' Sawa (ZakLab) ## ## e-Mail: mailto:zak.k.sawa@xxxxxxxxx ## ## http://homepage1.nifty.com/~zaklab/ ## ## ## ## すべてのメールはバカ者によって盗聴されている可能性があります ##