1220317
Jun's Homepage

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21|


お尋ねしたいのですが 投稿者:ベル 投稿日:2002/12/08(Sun) 22:23 No.102  
GAME86コンパイラの所でVTLの話をしていたのですが、VTLのコンパイラというのは作られたのでしょうか?


Re: お尋ねしたいのですが jun - 2002/12/09(Mon) 23:47 No.103  

VTLコンパイラを作ったことはありません。

GAMEからみると、VTLの文法はGAMEのほぼサブセットなので
GAME86から機能を削ればVTL(に近いもの)になると思います。


Re: お尋ねしたいのですが ベル - 2002/12/10(Tue) 00:38 No.104  

ご返事ありがとうございます。
僕は今、大学4年生で卒業研究にVTLのコンパイラをつくろうとしていますが、悪戦苦闘を強いられています。
コンパイラ設計の勉強もおろそかにしていて、本能もままにコンパイラを記述しているのですけど、なかなかうまくいきません。
やはりコンパイラの勉強をきちんとした方がよいのでしょうか?
また、その時どのような本が一番参考になるのでしょうか?
ちなみに、VTLで書いたコンパイラでVTLをコンパイルするということをやってみようと思ってます。


Re: お尋ねしたいのですが jun - 2002/12/10(Tue) 01:44 No.105  

本格的なコンパイラを作ろうとするのであれば、きちんと勉強すべきでしょうね。
一般論ですが (^^;

しかし、きちんと勉強するのは「遠い道のりで途中で気力がなくなる」というのは
私のことです。

とりあえず簡単なコンパイラを作りながら、自分の知りたいことを知るのもいい方法
だと思います。

簡単なコンパイラを作るときに問題となるのが、「どのような OS の実行ファイルを
生成するのか?」ではないかと思います。リンカやローダの動作にあったバイナリを
生成しようとすると、OS の動作を良く理解することが必要です。
GAME86の場合は、最も簡単な MS-DOS の COM ファイルを生成しています。ほとんど
バイナリをファイルに直接吐くだけです。

悪戦苦闘して、うまくいかない部分を具体的に知らせて下さい。協力できる所もある
かもしれません。

コンパイラ関連の書籍は、素人にしては、結構な数を持っていますが、推薦できるほど
読んでいません。一番参考になる本は、自分が一番知りたいことが書いてある本です。


Re: お尋ねしたいのですが ベル - 2002/12/10(Tue) 17:37 No.106  

文字を出力させるだけの簡単なコンパイラを作っているのですが、メモリーに文字を書き込みさせると暴走したり、エラーが出てMS−DOSが閉じたりしてしますのです。
VTLを書いたアセンブラが今のCPUに対応していないのでしょうか?


Re: お尋ねしたいのですが jun - 2002/12/10(Tue) 21:14 No.107  

「VTLを書いたアセンブラ」って、VTLのコンパイラを
アセンブラで書いたのでしょうか?アセンブラは何をお使いですか?

暴走の原因はコンパイラが出力したコードを調べるしかないです。


Re: お尋ねしたいのですが ベル - 2002/12/10(Tue) 21:27 No.108  

以前、大学の先輩がVTLをMSーDOSに移植いたしまして、そのVTLはインタプリタなのです。
そのインタプリタでコンパイラを記述しようとしています。
アセンブラはZZ386とMASMで書かれたらしいです。
今日、色々実験いたしましたところ、どうもメモリー領域への書き込みがうまくいってないようなのです。


Re: お尋ねしたいのですが jun - 2002/12/10(Tue) 23:35 No.109  

VTL-MSですか?以前に読んだことがあります。
VTLのような小さい言語でコンパイラを記述するのは
大変そうですね。頑張って下さい。


Re: お尋ねしたいのですが ベル - 2002/12/11(Wed) 10:01 No.110  

はい!ありがとうございます。がんばります!!


検索エンジンの性能? 投稿者:jun 投稿日:2002/12/05(Thu) 01:51 No.101  
このサイト http://www.nk.rim.or.jp/~jun/ が、どのくらい注目されているか?
ということが気になって検索してみました。

検索キーワードに「jun」を使った場合の結果です。

検索エンジン [当サイトの順位/全体の件数]
--------------------------+----------------------------
http://www.msn.co.jp/ [1/60]
http://www.google.co.jp/ [8/553,000] (日本語)
http://www.biglobe.ne.jp/ [8/504,000]
http://www.google.co.jp/ [29/33,200,000] (すべて)
http://www.excite.co.jp/ [30/32,200,000]
http://www.aol.com/ [30/24,500,000]
http://search.lycos.co.jp/ [35/941,198]
http://www.yahoo.co.jp/ [37/362]
http://www.goo.co.jp/ [???/17,828,112]
http://www.infoseek.co.jp/ [???/647,069]
http://www.altavista.com/ [???/15,054,260]
http://www.fresheye.com/ [???/17,438,466]

結構、上位になっていますね。ありがとう > robots

結果が???となっている検索エンジンは、500位以内に
してもらえてないようなので、

「お前は二度と使わん!!」



junさんありがと!! 投稿者:志穂 投稿日:2002/11/30(Sat) 01:03 No.96  
http://www.ics.kagoshima-u.ac.jp/edu/proen1c/page5.html
にもわかりやすくかかれてありました!

>関数の呼び出し側が、仮引数用のメモリを用意し、実引数の値を代入し関数を呼び出します。

junさんの「スタックにコピーされた実引数を仮引数と呼ぶ。」
でより理解が深まりました。
どうもありがとうございました。

例題プログラム
#include <stdio.h>
int f(int i,int j)
{
int s=2;
i=i+s+j;
return i;
}
int main(void)
{
int t=1;
t=f(t,3);
return 0;
}
 
でいくと、


%esp <- %esp-4で仮引数のメモリを用意
して、それから(%esp)に実引数3が代入される

ってとらえればいいんですよね?





Re: junさんありがと!! jun - 2002/11/30(Sat) 02:08 No.97  

> %esp <- %esp-4で仮引数のメモリを用意
> して、それから(%esp)に実引数3が代入される
>
>ってとらえればいいんですよね?

正解です。
一般的には、「実引数の値をPUSHしてCALL」となります。


自問自答? 投稿者:志穂 投稿日:2002/11/28(Thu) 17:00 No.93  

add(2,3);

void add(int x , int y);

---------------------- <------- %EBP
| 保存されたEBPの内容 |
----------------------
|  戻りアドレス   |
----------------------
| 実引数  2    |
----------------------
| 実引数  3    |
----------------------

8(%ebp) ・・(%ebp+8)・・2 ・・第1引数
12(%ebp) ・・(%ebp+12)・・3 ・・第2引数

8(%ebp),12(%ebp)が仮引数?




Re: 自問自答? jun - 2002/11/28(Thu) 23:38 No.95  

a=2;
b=3;
add(a, b);
のように変数で考えるとわかりやすいです。

スタック上の2や3は、aでもbでもなく、aとbの値のコピーです。
「仮引数は、実引数の値で初期化した局所変数」としてコンパイラが
アセンブリで実現しています。
実引数(argument)や仮引数(parameter)は、C言語の用語です。
Cの文法の説明で、アセンブリでの実装(スタックフレームなど)を
気にしなくてもいいように考え出された用語と思います。


仮引数と実引数について 投稿者:志穂 投稿日:2002/11/28(Thu) 13:44 No.89  
いつもお世話になってます。

http://www.iic.tuis.ac.jp/edoc/journal/ron/r6-1-2/r6-1-2d.html
にあるスタックフレーム
の図なんですが、
仮引数っていうのはどこに存在するのですか?
どうもこのあたりがわかりません。
C言語の本をみると、実引数が仮引数にコピーされる
などという話がのってますが、
アセンブラソースをみるとそのような命令が
出力されていません。
EBPをオフセットとして、アクセスしてるだけです。

-------------- <-------- %ESP
ローカル変数 |
-------------- <-------- %EBP
%EBPの内容保存|
--------------
戻りアドレス |
--------------
 実引数 |
---------------
呼び出し元のロ-|
カル変数領域 |
---------------


Re: 仮引数と実引数について 志穂 - 2002/11/28(Thu) 14:35 No.90  

実引数はスタックに積まれても、仮引数はスタックに積まれない。
仮引数ってローカル変数ですよね?
ってことはメモリ上にとられてないとおかしいですよね?
このあたりで悩んでます。


Re: 仮引数と実引数について 志穂 - 2002/11/28(Thu) 14:37 No.92  

"実引数が仮引数にコピーされる"
っていうのは何を根拠にいってるんでしょうか?


Re: 仮引数と実引数について jun - 2002/11/28(Thu) 22:58 No.94  

「スタックにコピーされた実引数を仮引数と呼ぶ。」が正解。
実際にはスタックにコピーせずレジスタで渡すこともあるわけですが。




オーバーヘッド? 投稿者:志穂 投稿日:2002/11/14(Thu) 21:09 No.83  
@///test]cat main.c
main()
{
char str1;
}
[@///test]gcc -S main.c
[@///test]cat main.s
.file "main.c"
.version "01.01"
gcc2_compiled.:
.text
.align 4
.globl main
.type main,@function
main:
pushl %ebp
movl %esp,%ebp
subl $24,%esp  <-------------------
.L2:
movl %ebp,%esp
popl %ebp
ret
.Lfe1:
.size main,.Lfe1-main
.ident "GCC: (GNU) 2.95.3 19991030 (prerelease)"
[@///test]


subl $24,%espですが、必要以上にローカル変数に
空間が割り当てられてますが、これはオーバーヘッドですか?
オーバーヘッドというのはなんとなくしっているというだけで。。。
できればローカル変数とオーバーヘッドの関係に
ついて詳しく述べてるHPがあったら紹介して下さい。
さがしたんですが、いい文書がみあたりません。



Re: オーバーヘッド? jun - 2002/11/14(Thu) 23:38 No.84  

ebx といいい、この質問といい gcc の「くせ」または仕様に
関することなので、私は全く詳しくありません。

見てませんか?>誰か詳しい方

「ローカル変数とオーバーヘッド」は初めて聞きました。
オーバーヘッドは速度に関してはよく使うと思います。


Re: オーバーヘッド? 志穂 - 2002/11/28(Thu) 14:36 No.91  

オーバーヘッドは関係ありませんでした。
すみません。
これはどうやらコンパイラーが勝手に割り当てるみたいですね。


makefileエラー? 投稿者:yu 投稿日:2002/11/26(Tue) 14:58 No.85  
こんにちは。今回からこちらに投稿させて頂きます。

makefileとCソースファイルを同じフォルダに置いて
$make としたところ、

gcc -02 -Wall -L/usr/X11R6/lib -o glprg_01 glprg_01.c -lm -lX11 -lGLU -lglut -lXext -lXmu -lXi
/usr/X11R6/lib/libGLU.so: undefined reference to 'sqrt'
/usr/X11R6/lib/libGLU.so: undefined reference to 'ceil'
/usr/X11R6/lib/libGLU.so: undefined reference to 'floor'
/usr/X11R6/lib/libGL.so: undefined reference to 'pow'
collect2: ld returned 1 exit status
make: *** [glprg_01] エラー1

と、エラーがかえって来ました。glprg_01.oの作成はできました。

以下がmakefileです。
-----------------------------------------------------
TARGETNAME = glprg_01


SRCS = glprg_01.c


CC = gcc


CFLAGS = -O2 -Wall -L/usr/X11R6/lib


LIBS = -lm -lX11 -lGL -lGLU -lglut -lXext -lXmu -lXi


OBJS = $(SRCS:.c=.o)


.SUFFIXES: .c .cpp .o


.c.o :

${CC} ${CFLAGS} -c $<


all : ${TARGETNAME}


${TARGETNAME} : $(OBJS)

$(CC) ${CFLAGS} -o ${TARGETNAME} $(OBJS) $(LIBS)


clean:

rm -f *.o

rm -f ${TARGETNAME}

-------------------------------------------------------
$(CC)とrmの前は[TAB]にしてあります。

makefileの内容が間違っているのでしょうか?
分かりましたらよろしくお願いします。


Re: makefileエラー? jun - 2002/11/26(Tue) 23:00 No.86  

> gcc -02 -Wall -L/usr/X11R6/lib -o glprg_01 glprg_01.c -lm -lX11 -lGLU ..

となっていますが、コンパイルのエラーからは -lm が指定されていないと思われます。

gcc -02 -Wall ... の行は実際の画面ではないですよね。

Makefile で LIBS = -lm -lX11 -lGL -lGLU -lglut -lXext -lXmu -lXi
と指定してあれば、上記のエラーは発生しません。


Re: makefileエラー? jun - 2002/11/26(Tue) 23:20 No.87  

もうひとつ気になるのですが、

> /usr/X11R6/lib/libGLU.so: undefined reference to 'sqrt'
> /usr/X11R6/lib/libGLU.so: undefined reference to 'ceil'
> /usr/X11R6/lib/libGLU.so: undefined reference to 'floor'
> /usr/X11R6/lib/libGL.so: undefined reference to 'pow'

これは、XFree86 4.x に含まれているMesaをリンクしようとしています。
もし、/usr/local にインストールした Mesa-4.0.4 を使うのであれば、
/usr/X11R6/lib/libG* を別の場所に退避しておいて /sbin/ldconfig を
実行したあとでコンパイルしてみて下さい。
ldd glprg_01 で実際にリンクしているライブラリを見ることができます。


Re: makefileエラー? yu - 2002/11/27(Wed) 20:23 No.88  

libのリンク先を変更することでエラーがとれました。その後、
$make
$./glprg_01
としても”許可がありません”とエラーになり、実行できなかったのですが、
--//hello.c---------------------
#include <stdio.h>
main (int argc,char *argv[]){
printf("hello.linux"\n);
}
--------------------------------
$gcc hello.c
$ls -F
とすると、なぜかa.out*だけでなく、glprg_01*もできていて
$./a.out と同じように
$./glprg_01
で実行できました。

その後は普通に
$make
$./glprg_01
で実行できました。(そのほかのプログラムも実行できました。)

なぜ、このようにしてできるようになったのかは分かりませんが、
今は無事全て動いています。ありがとうございました。


%EBXはやはり保持されなければならない... 投稿者:志穂 投稿日:2002/11/13(Wed) 10:41 No.81  
@///test]cat test.s
.file "test.s"
.data
var: .long 0x1234
.text
.globl main
main:
movl $var,%ebx
ret
[@///test]gcc -o test test.s
[@///test]./test
Segmentation fault   <----------------セグル
[@///test]

-----------------------------------

[@///test]cat test.s
.file "test.s"
.data
var: .long 0x1234
.text
.globl main
main:
movl %ebx,%eax <------ %ebxの内容を保持
movl $var,%ebx
movl %eax,%ebx <------- 元に戻した
ret
[@///test]!gcc
gcc -o test test.s
[@///test]./test
[@///test] <----------せぐらない






Re: %EBXはやはり保持され... jun - 2002/11/14(Thu) 01:08 No.82  

ebx の確認、ご苦労様です。実験して確認することは大事です。

ところで、

  せぐっちゃった  (連用形)
  セグル      (終止形)
  せぐらない    (未然形)

Segmentation faultの五段活用ですね (^^)。


jyunさん,、いつもありがとうございま... 投稿者:志穂 投稿日:2002/11/12(Tue) 18:00 No.74  
void intadd(int a,int b,int *c)
{
*c=a+b;
}
からアセンブリソース吐き出さ
 ると
わからないことが2点ほどあります。

.file "add.s"
gcc2_compiled.:
.text
.align 4
.globl add
.type intadd,@function
add:
pushl %ebp
movl %esp,%ebp
pushl %ebx <-------
movl 16(%ebp),%eax
movl 8(%ebp),%edx
movl 12(%ebp),%ecx
leal (%ecx,%edx),%ebx <--------
movl %ebx,(%eax)
.L2:
movl -4(%ebp),%ebx
movl %ebp,%esp
popl %ebp
ret

2つ目のpushlはなんのために必要なんでしょうか?




Re: jyunさん,、いつもあ・.. 志穂 - 2002/11/12(Tue) 18:02 No.75  

それと、
leal (%ecx,%edx),%ebx <--------
ですが、
これは
%ecx + %edxの結果を%ebxに格納するってことでしょうか?
でも、わからないのは、
(%ecx,%edx)の()です。
これがついてるってことは、アドレスのメモリの
内容ってことですよね?
これは無視して考えるんでしょうか?


Re: jyunさん,、いつもあ・.. jun - 2002/11/12(Tue) 22:31 No.77  

> 2つ目のpushlはなんのために必要なんでしょうか?
ebx の保存です。movl -4(%ebp),%ebxで復帰しています。
なぜ、popl %ebx でないかはコンパイラに聞いてください(^^)。

> でも、わからないのは、
> (%ecx,%edx)の()です。

lea はそういう命令です。R1 = R2 + R3 * 4 + 定数 のように
配列のアドレス計算などが高速にできるように用意された特殊
な命令です。四則演算命令と考えると"( )"は不自然ですが、
理由はインテルのアセンブラ作者に聞いて下さい(^^)。


Re: jyunさん,、いつもあ・.. 志穂 - 2002/11/12(Tue) 22:45 No.79  

親切にどうもありがとうございます。
はぁー、すっきり!!(笑)
もう、わかんないことだらけで。
ほんといつもたすかります!!


原因はわかりましたが・・ 投稿者:志穂 投稿日:2002/11/12(Tue) 20:01 No.76  
%ebxを%eaxに代えたらせぐらずに
実行されました。
どうやら、%ebxに数値を入れようとしたために
せぐってしまったようです。
なぜかがわからないんですが・・




[@///test]./test
Segmentation fault
[@///test]cat test.s
.file "test.s"
.text
.globl main
main:
movl $0x12,%ebx
ret
[@///test]gcc -o test test.s
[@///test]./test
Segmentation fault   <----------せぐっちゃった
[@///test]

[@///test]cat test.s
.file "test.s"
.text
.globl main
main:
movl $0x12,%eax
ret
[@///test]gcc -o test test.s
[@///test]./test
[@///test]
~


Re: 原因はわかりましたが・・ jun - 2002/11/12(Tue) 22:39 No.78  

投稿者:志穂 投稿日:2002/11/12(Tue) 18:00 No.74 の
コンパイル結果を見ると、関数の呼び出しの前後で ebx
の値を保存する必要があるのでしょうね。
少なくとも ebx、ebp、esp の値はCから呼び出す場合には、
変化させてはいけないのでしょう。
この辺はコンパイラに依存しますから、私は詳しくありません。