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

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




隆一です。


From: 片桐 明 <killy@rigy.co.jp>
Subject: [b-free: 1106] Re: OS による言語へのスタック機構のサポート
Date: Thu, 26 Feb 1998 23:11:11 +0900
Message-ID: <199802261409.XAA08969@mb.rigy.co.jp>

>  隆一さん、こんにちは。リギーコーポレーションの片桐です。
> 
> |GCC の場合だと asm という予約語を使えば、C の関数の中に直接アセンブラ
> |を書けると思います。
> |GCC の場合、asm の中はそのままアセンブラに落ちるのではなく、C コンパイ
> |ラが asm 文の中を解析してくれます。たとえば、局所変数をオペランドに直
> 〜略〜
> |簡単な例を次に示します。
> 
>  貴重な情報ありがとうございます。UNIXのアセンブラ(のような?)
> 記述は始めて見ました。gccということは私のLinuxでも試すことができますね。
>  いままでUNIXでのアセンブラは、カーネルを書くような一部の人間だけが使う
> ものだと思っていました。

いやまぁ、たしかにアセンブラを使うのはプログラマの中でも一部の人たちだ
と思います。

# たしか、UNIX GURU の定義に cat でアセンブラプログラムを組める
# というのがあった気がします。


ただ、UNIX の C コンパイラ (GCC に限らず) は、一般にアセンブラコードを
出力するようにできており、出力結果をいじくることもできるので、アセンブ
ラを扱うこと自体は簡単にできると思います。



> |  asm ("movl $1, %0" : "=r"(foo));
> |  asm ("movl $2, %0" : "=r"(bar));
> 
>  2命令とも「%0」を使っていますがこれでいいんでしょうか?。
>  「仮想レジスタ0番」みたいなものですね。

えーと %0 は "=r"(foo) と組になっています。つまり、$1 (定数 1) を
foo という変数に入れるという意味です。そこで、"=r" というのが foo の値
をレジスタで処理しろという指定になります。

"=r" でなく、"=m" のように指定するとメモリで処理しろという意味になりま
す。



>  スタックとregister変数のことに戻ます。
>  先に岩間さんへのコメント書いていて気が付いたのですが、次のようなこと
> は可能なのでしょうか。
> 
>   (ディスパッチャ(ルート))
>      局所のregister変数を(ポインタとして)3本割り当てる
>      それを初期化してからディスパッチ開始、下位関数を
>      呼び始める
> 
>   (下位関数) ↓これは出来るのかな?
>      ディスパッチャから渡されたregister変数を使うことで
>      スタック操作する
> 
>  のような感じで使いたいわけですが、問題は、これら多くの関数すべて
> において、それから関数→関数へ渡る間も含めて、一貫して同一レジスタ
> の使用(および他用途での破壊からの保護)が約束されるのでしょうか。
>  ディスパッチャ→下位関数へは、ポインタへのポインタを渡すんです
> よね。(レジスタへのポインタというのも変なものですね(^^;)

うーん、これっていくつかのレジスタを特別な処理用に確保するという
ことですよね。多分、GCC を作り直せばできると思います。

ただ、結果としてコンパイラが使えるレジスタが 3 つ減ることになるの
で、単純な処理もレジスタだけでは間に合わなくなり、メモリを頻繁に
使うことになりそうです。


---
B-Free プロジェクト実行中! 詳細はこの Web ページへ
(http://www.sccs.chukyo-u.ac.jp/B-Free) 


内藤隆一 (rnaitoh@st.rim.or.jp)