[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