[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[b-free: 1093] Re: OSによる言語へのスタック機構のサポート



お久しぶりです。林 です。ちょっとだけ。

In message <199802251029.TAA06763@mb.rigy.co.jp>
   "[b-free: 1089] Re: OSによる言語へのスタック機構のサポート"
   "片桐 明 <killy@rigy.co.jp>" wrote:
killy>  曖昧ですみません。私の頭にあったのは、ちょうど、
killy> 
killy>   (C)
killy>           push(data)
killy>       ↓
killy>   (アセンブラ)
killy>           PUSH    rN,data
killy> 
killy>  みたいな機構でした。ダイレクトにマッピングしてもらえれば、いろいろ
killy> 細工ができるので有り難いと。当然ですが、ここで使うレジスタは、Cは他の
killy> 目的で使わないものとします。この機構があれば、FORTHエンジンをネイティ
killy> ブで実現できるなあと思うのです。
killy>  でも「じゃあ最初からアセンブラで書けば?」と言われそうですね(^^;。
killy>  
killy>  (これはOSじゃなくてやはりCの話になりますか‥)

 これは明らかにコンパイラの問題ですね。コンパイラ&CPU依存でよければ
内藤さんがおっしゃるようにインラインアセンブラで書いてしまうことが
できますけど、最近のコンパイラの性能(最適化技術)を考えると、半端な
やり方ではかえって効率を落とすだけでしょう。

killy>  で、もう一つの方法ですが、Cのほうはいじらないとすると次のような
killy> 感じになるかと思っています。(落合さんが示してくたれたソースが参考に
killy> なりました)。
killy> 
killy>   ・スタックポインタおよびIP(Instruction Pointer)(計3本)は
killy>       register変数を使う
killy>   ・スタックの実体は(Cの)スタックフレームかメモリ獲得で2個取る
killy>   ・この状態でディスパッチャをスタートさせる
killy>   ・ディスパッチャが呼ぶ下位ワードには必ず上記3本のポインタを
killy>       参照渡しする
killy> 
killy>  これなら、ポインタを局所域にとっても現行方式より速いかも知れません。
killy> 
killy> |うーん、OS 側でユーザプログラムのレジスタの使用を制限することはないの
killy> |で、レジスタはユーザプログラムで自由に使えます。
killy> 
killy>  了解です。
killy>  register指定がミソですね。これって「運が良ければ」という性質のもの
killy> と理解しているのですが、確実にレジスタに割り当てるという方策はあるの
killy> でしょうか。(Cの中身のことはよく知らないものですから)

 register指定は確かにコンパイラへのヒントに過ぎません。x86系のCPUは汎用レジスタ
が少ないので通常は2変数くらいしかレジスタに割り当てられないはずです。さらに
下手にレジスタ指定するとかえって遅くなるとか、賢いコンパイラは無視して自前で
フロー解析してレジスタ割り当てを決めるとか、そういうことも考えられます。

killy> |この辺の話は、Windows でも同じかと思っていたんですが、ひょっとして、
killy> |Windows ではレジスタの使いかたが違うんでしょうか?
killy> 
killy>  すみません、こちらも知識ありません(^^;。Pentiumでレジスタ数は多少
killy> 多くなっているんでしたっけ。

Windowsでも一緒ですね。レジスタ割り当てを意識してプログラムを書いたりしない
ので普段は気にかけませんけど。ちなみにx86系CPUのレジスタはi386でセグメント
レジスタが2つ増えて汎用レジスタが32ビットになってから変わってないはずです。
あとはi486でFPUを取り込んで浮動小数点レジスタが入ったくらいですか。
# MMXのレジスタは浮動小数点レジスタと重なっているし。


--
Takanori Hayashi
takanori@ohsaki.meidensha.co.jp