Harry's Page

私も新しいページを作りました。
昔のものはharry(昔)に移動


はりーの掲示板

えーと、みなさんからのコメントを見落とさないように、ページの一番最初の領域を掲示板として使います。
新しいコメントはこの領域の一番上に書いていただくとありがたいです。
ここの領域が大きすぎないように、既に読んだ&解決したコメントはその日のところに移します。

~~~~~~~~ここから書き込んでくださいね♪~~~~~~~~~

アセンブラの最新版(assem3-15.c),とそれにmin-rt02.sを入力したところ、吐き出した
コードファイル(newcode.txt), アセンブリファイル(newout.txt)をアップします。


3月15日(木)


アセンブラのコードを綺麗にしました。
最終版をアップします(assem- last.c)



3月12日(月)


アセンブラの最新版をアップします。
ぶよぶよん氏による多大な援助を感謝感謝
6〜7行程度コンパイラの方と行数がずれていて、またバグがあるはずですが、たぶん
movあたりのムダな変換かな??

<昔のコメント>

  • To buyobuyon
行数を32000行、ラベル数を2048行確保しました。
yastakのページにあるmin-rt02.sをやってみたところ、min-rt02.binと一致しました。

  • To yastak
申し訳ないです。通電テストはまだしていません。
午後学校に行きますので、その時にしたいと思います。



大丈夫?CPU実験も大事だけど、体も大事だよ!お大事にね!
拡張基盤についてですが、これって、通電テストしてありますか?
いきなり接続して使ってみようと思うのですが、大丈夫ですか?(yastak)

風邪ですか。お大事に。
アセンブラ、正しく動作するようになって何よりです。
一応、コンパイラでインライン展開などを実装した関係で、
min-rt.sのサイズがかなり大きくなりましたので、
読み込み可能なラベル数・プログラムの行数の限界を少し大きめにしておいてください。(buyobuyon)


できたっぽい!
えーと、diffで調べて、min-rtn.sの方も完全に一致したので、たぶん今度は大丈夫だと思います。
今まで本当に多大な援助を頂いたぶよぶよん氏に感謝感謝です。
アセンブラの最新版(assem 3-14.c)と それが吐き出したコードファイル (min-code.txt),アセンブリファイル(min-out.txt)をアップします。

(はりー)


風邪で寝込んでしまいました。こんな時期に申し訳ないです。
もうだいぶよくなったので、今から作業を再開します。

buyobuyonさんの言う通りにstrcmp("mov", opcode)に変えたところ、min-rtnは8478と、行数はちゃんと一致しました。
それでruntime.binと一行ずつ比較したところ、完全一致しました。
しかしmin-rtnの方で比較したら、ラベルのところでやはり間違いが出ました。

ラベルの処理でちゃんとラベルの配列すべて見るように直したが、label[]はint の配列で、ラベル値は unsigned int のせいなのか、addi,hiあたりで、ラベル値が負になったりしてバグがあるようです。
恐らくまたintとunsigned intの型の扱いに問題があると思われます。

この辺はきちんと分かっていないので、まずunsingned intとintについてきちんと勉強してからデバッグしたいと思います。できるだけ今日の夜中に最新版をアップしたいのです(間に合うのかな。。。)
(はりー)

ええと、アセンブラのことですが、
一応、min-rtで試すと複雑すぎるので、代わりとなるアセンブリソースファイルとして、
runtime.sをこのページにアップロードしておきました。
同じくアップロードしたruntime.binには、アセンブラにruntime.sを与えたときに
本来出力されるべき内容が入っています。
とりあえず、最新版のアセンブラ(assem3-12.c)でruntime.sをコンパイルしてみたところ、
本来35行目に入るはずのmul命令が抜け落ちてしまうことがわかりましたので、
そのあたりからデバッグを始めてみてください。単純にdiffをとるとたくさん差分が
出力されますが、おそらくほとんどは、一部の命令が抜け落ちたことにより、
ラベルの行番号がずれてしまったことが原因だと思うので、あまり気にせず、
とりあえず総命令数をruntime.binと一致させることをまず目指してください。
ちなみに、mulが抜け落ちるのは、180行目あたりのif(opcode[0]!= ':' && opcode[0]!='m')が
原因だと思います。movを除外するための条件のつもりなのだと思いますが、MULやMULIなども
ありますので、"mov"を除外できて"mul"を除外しないような条件にしないといけませんので。
もう一つ気になるのは、ラベルの個数です。ラベルが出現したときに、一致するラベルを配列中から
探す際、配列の中身を256個しか調べておらず、またその際に配列中で見つからなくても
エラーメッセージが出ないようになっているので、そのあたりを修正しておいてください。
(buyobuyon)



3月10日 (土)

アセンブラの最新版を添付しました(assem3-10.c)
それを用いて、min-rt.sで吐き出したコードファイル(code.txt)とアセンブラファイル(out.txt)をもアップしました。
./assem3-10 入力ファイル  アセンブラファイル(出力ファイル) コードファイル(出力ファイル)
で使用してください

<むかしのこめんと>
To buyobuyon
御指摘ありがとうございます。

文字列の扱いに問題があり、一行のものが二行になったりして、行のズレが生じてしまいました。
それを直したファイル(assem3-11.c)をアップしました。
結果のコードファイル(code.txt)とアセンブラファイル(out.txt)をもアップしました。
一応両ファイルはともに8494行となりました。



ええと、アセンブラにバグが…。
例えばmin-rt.sをコンパイルすると、99行目の"mov r13, 0;"が00000000になってしまいます。
あと、心なしか生成されるコードの長さが違うような気がするのですが。
生成されるコードの長さは、
元々の命令の個数+MOV命令の個数(引数として即値をとり、その値が-1024から1023まで場合を除く)
になるはずですよね?(buyobuyon)


To buyobuyon
配列を大きくするのを忘れました。(m_m)
一応16384行確保したのですが、足りるのでしょうか?
エラーチェック(レジスタや即値やラベル値のチェック)も入れたので最新版をアップします。昨日までにアップすると言ったのに遅れてすみません。

それでmin-rt.sをアセンブラに変えたところエラー表示はありませんでした。
ちなみにmain()関数は入力ファイル、アセンブラファイル(出力ファイル)、コードファイル(出力ファイル)と引数3つにしました。

実行結果は以下のようになり、assem3-10.c,code.txt,out.txtを添付しました。
[hari@localhost Desktop]$ ./assem3-10 min-rt.s out.txt code.txt
assembly finished
[hari@localhost Desktop]$ ↑エラー表示されなかったので、min-rt.sに値の大きさ関係のエラーはない模様

(harry)




min-rt.sにアセンブラを適用してみたら何かエラーが起きて強制終了されました。
たぶん、確保した配列が小さすぎたのだと思います。
今後、インライン展開などを実装したらさらにmin-rt.sは長くなると思うので、
充分なサイズの配列を確保するようにしてください。

一応、現段階のコンパイラ・globals解析器・ライブラリ・リンカもどきが生成した
min-rt.sをこのページにアップしておきましたので、テストに使ってください。(buyobuyon)



3月6日(火)


昨日の春の嵐から一転して、今日はずいぶんと穏やかな日ですね。
天気が変わりやすく、風邪を引きやすい時期になりましたが、みなさん体調を崩さないように気をつけましょう

えーと、FPUのシミュレータの最新版をアップしました。

<昔のコメント>


buyobuyon氏に助けをもらって、アセンブラのバグが分かった。感謝感謝!!
えーと、アセンブラの最新版をアップします
エラー処理をきちんと追加する予定なので、それを入れたらまたアップします。
(harry)


↓jmp/jmplや分岐命令では、ジャンプ先の絶対的なアドレスではなく、
ジャンプ先の相対的なアドレス(ジャンプ先のアドレス - そのジャンプ命令のあるアドレス)を
指定する必要があります。
そのように修正するとたぶんfib_b.txtのようになるかと。(buyobuyon)


  • to buyobuyon

詳細なアドバイスありがとうございます。
直して、3076,1025,2047...あたりでやってみて大丈夫だったので、movはたぶん大丈夫だと思います。

添付してくれたfib_b.txtとアセンブラが吐き出したコード(out.txt)を一行ずつ比較したのですが、以下の5行に違いが出ました。(他は全部一致しました)


行数   対応するコード    
13       jmpl fib_00000001;   (fib) : 11000000011010000000000000000110
                                (out)  :       11000000011010000000000000010010

15 jmpl print_int;      (fib):11000000011010000000000000100111
                                        (out):    11000000011010000000000000110101

21   beq r13, LABEL_00000015; (fib): 11000110100000000000000000000100
                                        (out):    11000110100000000000000000011001

31       jmpl fib_00000001; (fib): 11111111111011111111111111110100
                                        (out):     11000000011010000000000000010010

37      jmpl fib_00000001; (fib): 11111111111011111111111111101110
                                         (out):    11000000011010000000000000010010

えーと、それぞれの飛び先のラベル値を調べたら18、53、25、18、18となっていて、out.txtに出てきた結果が一応私の予想通りのものとなっていますが、もしかしたら何か私の勘違いなのかな?

最新版のアセンブラとout.txtと実行結果(result.txt)をアップしました


  • to tsuy
御指摘ありがとうございます。
これは完全に私のミスです(m_m)申し訳ございません。
直してアップしました。(harry)

  • すみません、直していただいて恐縮なのですが"100000000"同士の比較の部分、
fpu-3-6.cの374行目は
 return -1;
ではなく
 return 0;
でお願いします。(tsuy)

  • 一応、この前fibのテストを行う際に作成した、
    fib.sを変換してできたアセンブリコードをこのページに載せておきました。
    fib_b.binがシミュレータで実行可能なバイナリ形式のファイル、
    fib_b.txtがビット列をテキスト形式で出力したものとなっています。
    (ファイルの形式が違うだけで、この2つが表すアセンブリコードは同じです)
    一応、fib_b.binはシミュレータでテスト済み(fibの引数が30以上でも
    正しく動作するバージョン)なので、間違いは無いはず…。

    fib_b.txtとharryさんのアセンブラの変換結果を比べると
    とりあえず、hiとaddiの引数(レジスタの番号)が違っています。
    hi r1, 1048576;
    addi r125, r1, 1048576;
    とすると、もともとr1に入っていた内容を消し去ってしまうので、
    hi r125, HI(1048576);
    addi r125, r125, LO(1048576);
    のようにしてください(HIとLOは1048576の上位21bit対応部と下位11bit対応部)。

    ええと、あと、mov, addiの引数の話。
    ごめんなさい。movもaddiも引数は(符号つきの)intです(fprintfの%dで出力していますので)。
    ちゃんと仕様を説明しておくべきでしたね…。

    で、addiの符号拡張の件ですが、とりあえず上のレジスタ番号の件を修正した後で、
    mov r1, 3072;
    を変換して、
    10000000100000000000000000000010
    00000000100001000000110000000000
    となるかどうか確かめてみてください。 -- buyobuyon (2007-03-07 01:52:13)
名前:
コメント:



To tusy
直しました。
新しいFPUのシミュレータをアップしました♪ーーーfpu-3-6.c
また何か変更あったら言ってくださいね。
(harry)

シミュレータのFPU部分についてですが、申し訳ないのですが私の作ったPerlのプログラムにミスが
あったので、該当箇所を訂正していただけたらと思います。
Flessの
if($in1_n < $in2_n){
   $result = "11111111111111111111111111111111";
}else{
   $result = "00000000000000000000000000000000";
}

に該当する部分に、先に+0.0,-0.0に関する条件分岐をつけて

if(substr($in1,0,9) eq "000000000" && substr($in2,0,9) eq "000000000"){
   $result = "00000000000000000000000000000000";
}elsif(substr($in1,0,9) eq "100000000" && substr($in2,0,9) eq "000000000"){
   $result = "11111111111111111111111111111111";
}elsif(substr($in1,0,9) eq "000000000" && substr($in2,0,9) eq "100000000"){
   $result = "00000000000000000000000000000000";
}elsif(substr($in1,0,9) eq "100000000" && substr($in2,0,9) eq "100000000"){
   $result = "00000000000000000000000000000000";
}elsif($in1_n < $in2_n){
   $result = "11111111111111111111111111111111";
}else{
   $result = "00000000000000000000000000000000";
}

のような処理をするようにしていただけたらと思います。
忙しい時期に申し訳ありませんが、よろしくお願いします。(tsuy)


  • to buyobuyon
ご指摘ありがとうございます。
えーと、たぶん私がよくわかっていないのだと思いますが、今日アップしたアセンブラでfib.sの3ー6、8ー9は以下のようになりました。これは一応私が想定した結果と一致したものになりますが、どういう結果が出るべきでしょうか?
(一応全体の実行結果と変換結果をresult1.txt result2.txtとして添付しました)

(1)03〜06行目:
対応しているコード:
hi r1, 1048576;
addi r125, r1, 1048576;
hi r1, $-_-$;
addi r126, r1, $-_-$;
アセンブリ:
03	:	10000000100000000000001000000000
04	:	00111110100001000000100000000000
05	:	10000000100000000000000000000000
06	:	00111111000001000000100000111000

(2)08〜09行目:
対応しているコード:
hi r1, x_array;
addi r14, r1, x_array;
アセンブリ:
08	:	10000000100000000000000000000000
09	:	00000111000001000000100000000010


addiの符号拡張の部分は私もかなり気になりました。
えーと、ちょっと確認したいのですが、movの引数はunsinged intで、addiの引数はint でいいのかな?
(はりー)

  • とりあえず、テスト用として、このページに最新版のfib.sをアップしておきました。
これを見た感じでは、hiは即値部分だけでなく、レジスタ指定部分も値が違うような気がします。
(fib.sをアセンブリコードにしたときの03~06、08~09行目あたりを見てもらえると良いかと)。
mov関連で一つ気になることが。addiは演算時に定数部が符号拡張されるため、
mov→hi+addiの変換の際に、movの引数(定数orラベルの値)の下から11bit目が
'1'か'0'かで場合分けする必要があると思うのですが、そのあたりは大丈夫ですか?(buyobuyon)


3月4日(日)



  • To yastak
mov の変換hiの部分は確かに間違いました。
御指摘ありがとうございます。
えーと、endの方ですが、こっちで何回かテストしたけど、全部普通に出力されました。
最新版で使ってみて、やはりall 0になるのだったら知らせてください。(harry)


  • アセンブラにバグがあるようです。
end;が0000...(all 0)
に変換されてしまいました…。
あと、movをhiとaddiに変換したときのhiの即値部分の値がおかしい気がします。
ちょっと自信ないけど。(yastak)


えーと、アセンブラの最新版を添付します
movの即値の変換は即値の大きさで場合分けできるようになりました。
以下に実行結果を貼ります。


:MAIN;
mov r2, 3500;
end;
mov r4, 30;
add r0, r0, r0;
mov r3, MAIN;
end;
:FADD;
mov r5, FADD;
mov r1, 1023;
mov r1, 1025;
addi r0, r0, -256;


[hari@localhost Desktop]$ ./assem3-4 source1.txt exit.txt;
mov_int------ mov, r2, 3500
big m---3500
mov_int------ mov, r4, 30
small m---30
mov_label------- mov, r3, MAIN;
mov_label------- mov, r5, FADD;
mov_int------ mov, r1, 1023
small m---1023
mov_int------ mov, r1, 1025
big m---1025

hi r1, 3500;
addi r2, r1, 3500;
end;
addi r4, r1, 30;
add r0, r0, r0;
hi r1, MAIN;
addi r3, r1, MAIN;
end;
hi r1, FADD;
addi r5, r1, FADD;
addi r1, r1, 1023;
hi r1, 1025;
addi r1, r1, 1025;
addi r0, r0, -256;
assembly finished
[hari@localhost Desktop]$ cat exit.txt

00	:	10000000100000000000000000000001
01	:	00000001000001000000110110101100
02	:	11000000001110000000000000000000
03	:	00000010000001000000100000011110
04	:	00000000000000000000000000000000
05	:	10000000100000000000000000000000
06	:	00000001100001000000100000000000
07	:	11000000001110000000000000000000
08	:	10000000100000000000000000000000
09	:	00000010100001000000100000001000
0A	:	00000000100001000000101111111111
0B	:	10000000100000000000000000000000
0C	:	00000000100001000000110000000001
0D	:	00000000000001000000011100000000
END;

昔のコメント:
アセンブラ機能追加のお願い

データを表現するための構文、".word"の追加をお願いします。
 .word 即値オペランド(符号付き32bit値)
 .word ラベル
の2つの形をとることができ、
どちらも、オペランド(ラベル)の値をその行の値としてそのまま出力するようにしてください。(buyobuyon)





3月2日(金)

.wordを追加したアセンブラの最新版をアップしました。

テストしてみた結果を貼ります

ソースファイル:
:MAIN;
mov r2, 15;
.word FADD;
add r0, r0, r0;
:FADD;
.word MAIN;
.word 3;

実行結果:
[hari@localhost Desktop]$ ./assem3-2 source1.txt out.txt
label[0]---0---MAIN;
label[1]---4---FADD;
hi r2, 15;
addi r2, r1, 15;
.word FADD;
add r0, r0, r0;
.word MAIN;
.word 3;
.wrod label---FADD;---4
.wrod label---MAIN;---0
int_word: 3
assembly finished
[hari@localhost Desktop]$ cat out.txt

       00      :       10000001000000000000000000001111
       01      :       00000001000001000000100000001111
       02      :       00000000000000000000000000000100     //.word FADD
       03      :       00000000000000000000000000000000
       04      :       00000000000000000000000000000000    //.word MAIN
       05      :       00000000000000000000000000000011     //.word 3
END;


  • .word構文の追加、ありがとうございます。

    こちらの方も、.word構文を使って
    データ領域を作成するプログラムの実装が終わったので、
    もう少しでmin-rt実行できますね。 -- buyobuyon (2007-03-02 11:52:35)



2月28日(水)


アセンブラの最新バージョンをアップします。
yastakさんのアドバイス通りに実装したらうまくいきました☆ありがとう♪

To buyobuyon
movだけでラベル値と即値の両形式に対応できるようにしました。
新しい構文の形式が決まったら追加しますので、どんどん言ってくださいね。


自分へのメモ
☆アセンブラーーー高速化をまだやっていない(mov変換部)
☆シミュレーターーー(1)tsuy氏に指摘されたMAX,MINの対応の追加
          (2)テストすること
って、一応実行結果を貼ります
(buyobuyon氏のとこのもののmovをいくつかラベル値にしたのをソースファイルとした)
一応前問題点だったmovの両形式の命令変換と前へジャンプすることができたみたい。


ソース:
:MAIN;
mov r2, 15;
jmpl fib_00000002;
add r0, r0, r0;
end;
add r0, r0, r0;

:fib_00000002;
mov r124, LABEL_00000010; //ここをらべるにした(後ろに飛ぶ)
cmplt r123, r124, r2;
not r122, r123;
beq r122, LABEL_00000010;
add r0, r0, r0;
addi r2, r2, 0;
ret;
add r0, r0, r0;
:LABEL_00000010;
addi r125, r125, -3;
storei r2, r125, 2;
mov r121, fib_00000002;  //ここをラベルにした(前に飛ぶ)
sub r2, r2, r121;
storei r127, r125, 0;
jmpl fib_00000002;
add r0, r0, r0;
storei r2, r125, 1;
mov r124, 1;
loadi r123, r125, 2;
sub r2, r123, r124;
jmpl fib_00000002;
add r0, r0, r0;
loadi r124, r125, 1;
add r2, r2, r124;
loadi r127, r125, 0;
addi r125, r125, 3;
ret;
add r0, r0, r0;


[hari@localhost Desktop]$ ./assem2-28 source1.txt exit1.txt
label[0]---0---MAIN;
label[1]---6---fib_00000002;
label[2]---15---LABEL_00000010;
hi r2, 15;
addi r2, r0, 15;
jmpl fib_00000002;
add r0, r0, r0;
end;
add r0, r0, r0;
hi r124, LABEL_00000010;
addi r124, r0, LABEL_00000010;
cmplt r123, r124, r2;
not r122, r123;
beq r122, LABEL_00000010;
add r0, r0, r0;
addi r2, r2, 0;
ret;
add r0, r0, r0;
addi r125, r125, -3;
storei r2, r125, 2;
hi r121, fib_00000002;
addi r121, r0, fib_00000002;
sub r2, r2, r121;
storei r127, r125, 0;
jmpl fib_00000002;
add r0, r0, r0;
storei r2, r125, 1;
hi r124, 1;
addi r124, r0, 1;
loadi r123, r125, 2;
sub r2, r123, r124;
jmpl fib_00000002;
add r0, r0, r0;
loadi r124, r125, 1;
add r2, r2, r124;
loadi r127, r125, 0;
addi r125, r125, 3;
ret;
add r0, r0, r0;
count---36
jmpl label OK--label[1], num: 6, content: fib_00000002;
hi label OK--label[2], num: 15, content: LABEL_00000010;
addi label OK--label[2], num: 15, content: LABEL_00000010;
hi label OK--label[1], num: 6, content: fib_00000002;
addi label OK--label[1], num: 6, content: fib_00000002;
jmpl label OK--label[1], num: 6, content: fib_00000002;
jmpl label OK--label[1], num: 6, content: fib_00000002;
assembly finished

[hari@localhost Desktop]$ cat exit.txt

       00      :       10000001000000000000000000001111
       01      :       00000001000001000000000000001111
       02      :       11000000011010000000000000000110
       03      :       00000000000000000000000000000000
       04      :       11000000001110000000000000000000
       05      :       00000000000000000000000000000000
       06      :       10111110000000000000000000001111
       07      :       00111110000001000000000000001111
       08      :       00111101101100111110000000100000
       09      :       00111101010110111101100000000000
       0A      :       11111101000000000000000000001111
       0B      :       00000000000000000000000000000000
       0C      :       00000001000001000001000000000000
       0D      :       11000000001100111111100000000000
       0E      :       00000000000000000000000000000000
       0F      :       00111110100001111110111111111101
       10      :       10000001011011111110100000000010
       11      :       10111100100000000000000000000110
       12      :       00111100100001000000000000000110
       13      :       00000001000010000001011110010000
       14      :       10111111111011111110100000000000
       15      :       11000000011010000000000000000110
       16      :       00000000000000000000000000000000
       17      :       10000001011011111110100000000001
       18      :       10111110000000000000000000000001
       19      :       00111110000001000000000000000001
       1A      :       10111101110011111110100000000010
       1B      :       00000001000010111101111111000000
       1C      :       11000000011010000000000000000110
       1D      :       00000000000000000000000000000000
       1E      :       10111110010011111110100000000001
       1F      :       00000001000000000001011111000000
       20      :       10111111110011111110100000000000
       21      :       00111110100001111110100000000011
       22      :       11000000001100111111100000000000
       23      :       00000000000000000000000000000000
END;

[hari@localhost Desktop]$







  • 自分へのメモ:
    mov 変換で
    hi r1, imm
    addi r1, r1, immと二番目のレジスタをr1に直し忘れないように -- harry (2007-03-01 00:03:28)


2月26日(月)



To yastak:
アドバイスありがとうございます。
全くおっしゃる通りですね
うん、今まで自分が何を悩んでいたんだろう??(>_<)
えーと、明日(27日)はちょっと用事があって、28日中にさっそくアセンブラの最新版をアップしたいと思います。

  • 構造が出来上がっちゃうと、
    それを生かして変えるのって難しいと思うから…。
    私はいままで何も考えていなかった(すみません)のが幸いしましたw -- yastak (2007-02-27 02:15:28)
  • 私のページの方で議論中なのですが、
    おそらくアセンブラに新しい構文の追加をお願いすることになると思います。
    たぶん追加してもらうことになるのが、
    .word オペランド1
    というような構文なのですが、
    オペランド1(32bitの数値、もしくはラベル)の値をそのままその行の値として出力するようなものです。
    外部変数の初期値を書き込む&外部変数の領域を確保するのにあると便利そうなので。 -- buyobuyon (2007-02-28 05:07:28)
最終更新:2009年06月07日 10:58