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

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



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

|GCC の場合だと asm という予約語を使えば、C の関数の中に直接アセンブラ
|を書けると思います。
|GCC の場合、asm の中はそのままアセンブラに落ちるのではなく、C コンパイ
|ラが asm 文の中を解析してくれます。たとえば、局所変数をオペランドに直
〜略〜
|簡単な例を次に示します。

 貴重な情報ありがとうございます。UNIXのアセンブラ(のような?)
記述は始めて見ました。gccということは私のLinuxでも試すことができますね。
 いままでUNIXでのアセンブラは、カーネルを書くような一部の人間だけが使う
ものだと思っていました。

|  asm ("movl $1, %0" : "=r"(foo));
|  asm ("movl $2, %0" : "=r"(bar));

 2命令とも「%0」を使っていますがこれでいいんでしょうか?。
 「仮想レジスタ0番」みたいなものですね。

|#APP
|	movl $1, %edx		<-- 変数 foo を %edx にわりつけ、定数 
|#NO_APP				    1 を代入する。

 オペランドの向きがインテル表記と逆なんですね(^^)。

|#APP
|	add %eax, %edx		<-- はじめからレジスタだけを使っている
|				    でも、初期化していない。
|#NO_APP

 なるほどあまり高度な指示を出したのでコンパイラが混乱したんですね。

|ということで、GCC だと機械語の PUSH を asm で書けます。
|ただ、強制的に局所変数をレジスタを使うようにしても、前後の C の部分に
|よっては、かなり非効率なコードになってしまいそうです。

 たいへん詳細な解説をどうもありがとうございました。

−−

 ところで私は勘違いしていたようです。
 いままで何度か、「i386だとうんぬん」というお話が出てきたのでなぜだろ
うと思っていたのですが、B-Freeは当面インテル系の石といいますか、PC-UNIX
のような形態で計画されているんですね。
 私はずっと「独自の石を使う」という錯覚を持っていました。(昔のTRON 
CPUの話の影響でしょうか)
 MLに参加したわりには初心者的なことで恐縮です。

−−
 
 スタックとregister変数のことに戻ます。
 先に岩間さんへのコメント書いていて気が付いたのですが、次のようなこと
は可能なのでしょうか。

  (ディスパッチャ(ルート))
     局所のregister変数を(ポインタとして)3本割り当てる
     それを初期化してからディスパッチ開始、下位関数を
     呼び始める

  (下位関数) ↓これは出来るのかな?
     ディスパッチャから渡されたregister変数を使うことで
     スタック操作する

 のような感じで使いたいわけですが、問題は、これら多くの関数すべて
において、それから関数→関数へ渡る間も含めて、一貫して同一レジスタ
の使用(および他用途での破壊からの保護)が約束されるのでしょうか。
 ディスパッチャ→下位関数へは、ポインタへのポインタを渡すんです
よね。(レジスタへのポインタというのも変なものですね(^^;)

 しかしそれ以前の問題として、i386でインデックスレジスタを3本も
開放してくれそうもないですね(^^;。
 では。
                                片桐 明  (株)リギーコーポレーション
                                killy@rigy.co.jp
                                NIFTY: PAG01434