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

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



 隆一さん、こんにちは。リギーコーポレーションの片桐です。

|>  具体的に言いますと、
|>  明に使えるスタックのPUSH/POPの機構だけでもいいからアセンブラ書かな
|> くても使えるといいのですが‥。できれば2本。(←おいおい)
|>  C風にかけば、push(data), data=pop() みたいなのが欲しいのです。
|> (バリエーションとしては、drop(), swap() とかもう少しありますが)
|
|えーと、これは OS にスタック操作用のシステムコールを追加するということ
|でしょうか?
|システムコールを介した場合、オーバーヘッドが、言語内でスタックをエミュ
|レートする時より大きくなると思います。

 曖昧ですみません。私の頭にあったのは、ちょうど、

  (C)
          push(data)
      ↓
  (アセンブラ)
          PUSH    rN,data

 みたいな機構でした。ダイレクトにマッピングしてもらえれば、いろいろ
細工ができるので有り難いと。当然ですが、ここで使うレジスタは、Cは他の
目的で使わないものとします。この機構があれば、FORTHエンジンをネイティ
ブで実現できるなあと思うのです。
 でも「じゃあ最初からアセンブラで書けば?」と言われそうですね(^^;。
 
 (これはOSじゃなくてやはりCの話になりますか‥)

 で、もう一つの方法ですが、Cのほうはいじらないとすると次のような
感じになるかと思っています。(落合さんが示してくたれたソースが参考に
なりました)。

  ・スタックポインタおよびIP(Instruction Pointer)(計3本)は
      register変数を使う
  ・スタックの実体は(Cの)スタックフレームかメモリ獲得で2個取る
  ・この状態でディスパッチャをスタートさせる
  ・ディスパッチャが呼ぶ下位ワードには必ず上記3本のポインタを
      参照渡しする

 これなら、ポインタを局所域にとっても現行方式より速いかも知れません。

|うーん、OS 側でユーザプログラムのレジスタの使用を制限することはないの
|で、レジスタはユーザプログラムで自由に使えます。

 了解です。
 register指定がミソですね。これって「運が良ければ」という性質のもの
と理解しているのですが、確実にレジスタに割り当てるという方策はあるの
でしょうか。(Cの中身のことはよく知らないものですから)

|もちろん、特権レベルが高くないと使えないようなシステムレジスタ(セグメ
|ントレジスタなど)は、ユーザプログラムでは使えません。しかし、システム
|レジスタの類は、ユーザプログラムレベルで普通のプログラムを組む場合には
|必要ないと思います。

 はい、単純に間接メモリアクセスができるだけで良いです。
 ・・あ、そうか。
 かなり都合の良いregister変数が出来たとすると、

       *--p = data;

 が機械語のPUSHと等価になるんですね。

|ですから、C コンパイラの convention が許す限り、実レジスタをスタックポ
|インタとして使うことはできると思います(ただ、i386 系の CPU は、汎用レ
|ジスタの数が少ないので、C コンパイラはすべてのレジスタを使っていまうよ
|うな気がします)。

 そうですか。情報ありがとうございます。

|この辺の話は、Windows でも同じかと思っていたんですが、ひょっとして、
|Windows ではレジスタの使いかたが違うんでしょうか?

 すみません、こちらも知識ありません(^^;。Pentiumでレジスタ数は多少
多くなっているんでしたっけ。

 では。
                                片桐 明  (株)リギーコーポレーション
                                killy@rigy.co.jp
                                NIFTY: PAG01434