昔のページをここに移動



2月22日



アセンブラで仮想命令movの変換が出来たので、最新版を添付します。

To buyobuyon
アセンブラは仮想命令変換が簡単にできるように変えたので、また仮想命令変換があったらどんどん言ってくださいね

あのう、buyobuyon氏のページにあるfibのコードをアセンブリにかけたら、
エラーが出てしまったのですが…(We cannot read line 1が大量に。)
(yastak)

ざっと見たところ、原因の一つはadd r0,r0,r0のようです。
この命令は"000..."(all 0)ですが、all 0の時にエラーをはくことになっているので、
エラーが出たようです。
We cannot read line 1 が大量だったのは、1の部分のところの引数がおかしいのではないかと。
(inではなくout?)
そのほかにも原因があるようなので、修正をお願いします。
(yastak)

To yastak:
大変申し訳ございません。
間違いの原因の一つはyastakさんの言ったようにall 0の時エラーを吐くようにしているからであるが、
大量のエラーが出たのは
スペースのありなしの違いのようです
私は例えば
addi r1,r2,30;
のようにオペランド間にスペースの無いものを想定したのですが、
ぶよぶよ氏のページにあるのは
addi r1, r2, 30;
とワンスペースあるものです。
そこを直したらこんな感じの結果になりました

[hari@localhost Desktop]$ ./assem2-25 source.txt exit.txt
label------MAIN;
move value---15
label------fib_00000002;
move value---1
label------LABEL_00000010;
move value---2
jmpl label OK--label[1], num: 5, content: fib_00000002;
move value---1
jmpl label OK--label[1], num: 5, content: fib_00000002;
assembly finished
there is no error
[hari@localhost Desktop]$ cat exit.txt

       mov     00      :       00000001000001000000000000001111
       jmpl    01      :       11000000011010000000000000000001     //ここは間違い
       add     02      :       00000000000000000000000000000000
       end;    03      :       11000000001110000000000000000000
       add     04      :       00000000000000000000000000000000
       mov     05      :       00111110000001000000000000000001
       cmplt   06      :       00111101101100111110000000100000
       not     07      :       00111101010110111101100000000000
       beq     08      :       11111101000000000000000000001000
       add     09      :       00000000000000000000000000000000
       addi    0A      :       00000001000001000001000000000000
       ret;    0B      :       11000000001100111111100000000000
       add     0C      :       00000000000000000000000000000000
       addi    0D      :       00111110100001111110111111111101
       storei  0E      :       10000001011011111110100000000010
       mov     F       :       00111100100001000000000000000010
       sub     10      :       00000001000010000001011110010000
       storei  11      :       10111111111011111110100000000000
       jmpl    12      :       11000000011010000000000000000101
       add     13      :       00000000000000000000000000000000
       storei  14      :       10000001011011111110100000000001
       mov     15      :       00111110000001000000000000000001
       loadi   16      :       10111101110011111110100000000010
       sub     17      :       00000001000010111101111111000000
       jmpl    18      :       11000000011010000000000000000101
       add     19      :       00000000000000000000000000000000
       loadi   1A      :       10111110010011111110100000000001
       add     1B      :       00000001000000000001011111000000
       loadi   1C      :       10111111110011111110100000000000
       addi    1D      :       00111110100001111110100000000011
       ret;    1E      :       11000000001100111111100000000000
       add     1F      :       00000000000000000000000000000000
END;

[hari@localhost Desktop]$

とりあえず大雑把に直したものを添付しますが、このアセンブラはまだ要修正なので、修正後また新しいものを載せます。

☆自分へのメモ:
問題点:
☆assem2-25.cように一行ずつ入力ファイルから読んで結果を出力ファイルに出力するとジャンプなどラベル値のあるものは自分より前のラベルに飛べるけど、後ろに飛べない。
assem.cように入力ファイルを全部読んから出力ファイルを開いて出力すると、movのような命令変換がうまくできない。。。
これを解決しなければ。
☆movの処理を吟味すべし
☆ジャンプなどラベルに飛ぶのはいいけど、即値のケースをも追加すべし(かな?)

ありがとう~♪お世話かけますm(_ _)m
☆最初に全ての行をよんで、配列に格納(よみつつラベルの記録をして、movはhi,addiに変換する)
すると、配列中の命令からラベルとmovが消える。
→格納した命令を順番にマシンコードに…
とかでできないかな…?
(yastak)



2月20日



アセンブラの最新版を添付します
変更点:
(1)命令の変更を入れた
(2)出力ファイルは必要分だけにした(前は256行に限定してた)
(3)負の数にも対応するようにした(即値あたり。1の補数表記で)

問題点:
仮想命令のmovですが、
addiに変更するのはできているけど、
n>1024のとき、つまり二命令に書き換える のはまだできていないです。
書き換えるだけだからすぐに出来ると思ったけど、返り値は一つだから意外と全体の仕様と相性が悪く、試行錯誤中。。。
そこができたらまたアップします。とりあえずそこ以外は修正しました。

to tsuy:
fpu_ftoiなのですが、floatで表せる数の範囲がintで表せる範囲を超えているので、
FPUでは入力がintの範囲を超えるものである場合にINT_MAXやINT_MINを返すようにしている
のですが、シミュレータでは不要なんですかね?(tsuy)

追加します。指摘ありがとうございます。



実行結果例:

addi r3,r8,-10;
muli r1,r100,100;
andi r1,r2,20;
andi r1,r2,-20;
:first;
hi r1,64;
hi r1,-64;
:second;
out r2,100;
out r1,-100;
jmp first;
addi r1,r0,6;
addi r2,r0,4;
mov r1,second;
mov r2,first;

[hari@localhost Desktop]$ ./assem2-20 source.txt exit.txt
jmp label OK--label[0], num: 4, content: first;
mov label: 6
mov label: 4
there is no error
assembly finished


[hari@localhost Desktop]$ cat exit.txt
       00      :       00000001100001000100011111110110;-- 18447F6
       01      :       00000000100101110010000001100100;-- 972064
       02      :       00000000110001000001000000010100;-- C41014
       03      :       00000000110001000001011111101100;-- C417EC
       04      :       10000000100000000000000001000000;-- 80800040
       05      :       10000000100111111111111111000000;-- 809FFFC0
       06      :       10000000011101000001000001100100;-- 80741064
       07      :       10000000011101000000111110011100;-- 80740F9C
       08      :       11000000011000000000000000000100;-- C0600004
       09      :       00000000100001000000000000000110;-- 840006
       0A      :       00000001000001000000000000000100;-- 1040004
       0B      :       00000000100001000000000000000110;-- 840006
       0C      :       00000001000001000000000000000100;-- 1040004
END;



2月19日



(1) >yastak
即値のところにマイナス値を入れると出力ファイルに
FFFFFFF...というall 1の命令が出力されてしまいました。
バグかなぁ?

えーと、アセンブラを作るときにマイナスの値を考慮しませんでした。すみません。(m_m)
addiの返り値は
return (ra << 23) | (ADDI << 18) | (rb << 11) | (imm);
で、
immの値は1の補数(全32ビット)で表記されるからその前の部分が上書きされて、こんな出力となってしまいましたのだと思います。
ここではimmは11ビットだから、11ビットのみの1の補数表記にして、返り値を

return (ra << 23) | (ADDI << 18) | (rb << 11) | ((imm<<21)>>21);
に直したら
addi r1,r2,10;
addi r1,r2,-10;
addi r1,r2,20;
addi r1,r2,-20;


を入れたところこういう感じになりました
       00      :       00000000100001000001000000001010;-- 84100A
       01      :       00000000100001000001011111110110;-- 8417F6
       02      :       00000000100001000001000000010100;-- 841014
       03      :       00000000100001000001011111101100;-- 8417EC

これでいいのかな?

movをaddiとhiの組み合わせに直して、演算部のオペランドにラベルが来てもいいようにしてからアセンブラを添付します。一応明日中に添付する予定です。遅くなってすみません。。。




(2)
シミュレータのfpuがとりあえず完成したので、添付します
実行結果をもいくつか貼りました


[hari@localhost Desktop]$ ./2-18
f1:  //f1, f2はユーザが入力する
3.1
f2:
4.5

fadd: 7.600000
fsub: -1.400000
fmul: 13.950000
fpu_inv of 3.100000: 0.322581
fpu_finvsqrt of 3.100000: 0.567962
fpu_ftoi: 3
fpu_itof of 100: 100.000000
fpu_fless: -1
[hari@localhost Desktop]$ ./2-18
f1:
4.1
f2:
1.3
fadd: 5.400000
fsub: 2.800000
fmul: 5.329999  //←このように入力データにより誤差がでることもある。ここでは本来5.33になるはず
fpu_inv of 4.100000: 0.243902
fpu_finvsqrt of 4.100000: 0.493865
fpu_ftoi: 4
fpu_itof of 100: 100.000000
fpu_fless: 0

[hari@localhost Desktop]$ ./2-18
f1:           //入力データはうまく限られたビットで収まれば誤差が出ない。
4.0
f2:
1.5
fadd: 5.500000
fsub: 2.500000
fmul: 6.000000
fpu_inv of 4.000000: 0.250000
fpu_finvsqrt of 4.000000: 0.500000
fpu_ftoi: 4
fpu_itof of 100: 100.000000
fpu_fless: 0


fpu_fless()なんだけど、引数1>=引数2の場合は0を、そうでない場合はー1を返すようにしてあるけど、それでいいのかな??
って、各関数の引数も返り値もunsigned int型ですが、
どれも32ビットの文字列をそのまま整数に直した値にしてある。(符号無し)
例: ビット列が00000000000000000000000000001111なら15に直すとか(2の補数で)
それでいいのかな?符号つきで1の補数の整数にした方がいいのかな?

あとfpu_ftoi()ですが、負の数の場合は、絶対値が近い方の整数を返すようにしてあるが、いいのかな?
(たとえば-26.38なら-26に、-26.78ならー27に丸めた)






「fpu_fless()なんだけど、引数1>=引数2の場合は0を、そうでない場合はー1を返す」
「fpu_ftoi()ですが、負の数の場合は、絶対値が近い方の整数を返すようにしてある」
これらはこれでいいかと思います。
fpu_ftoiなのですが、floatで表せる数の範囲がintで表せる範囲を超えているので、
FPUでは入力がintの範囲を超えるものである場合にINT_MAXやINT_MINを返すようにしている
のですが、シミュレータでは不要なんですかね?(tsuy)




進行状況報告(1)10月30日



アセンブラ:
大体はできたつもりで、まだ完成していません(>_<)。遅くても11月中に完成させます。

シミュレーター:
この前見つかった資料をまだ解読中です。まだあまり理解していない感じです。

PS. 家の用事により、11月の3日から7日まで日本にいないです。大変申し訳ないのですが、何か連絡があれば こちらに書かれたアドレスにお願いします。(すぐに返事できない場合もありますが)



進行状況報告(2)---12月1日




ずっと更新していなくて本当に申し訳ございません。
進行状況ですが、アセンブラは完成しました。
これからシミュレーターをやる感じです。
本当に作業が遅くて大変申し訳ございません。

  • アセンブラの方はすぐ動きますか?シミュレーターは一応作ったものがありますので(機能は少ないです)、月曜の空き時間なり木曜の放課後なりに、一度テストしてみて、そもそも正常に動くかどうか確かめ、また今後どのような機能を追加すべきかを決めたいと思うのですが。(buyobuyon)


  • 返事遅れて申し訳ございません。
一応適当にコードを書いてテストした結果とりあえず動くみたいです。
コードと結果を以下のようになりました。(harry)
コード:
hi r1,100;
hi r2,200;
add r1,r2,r3;
addi r1,r2,1;
fadd r1,r2,r3;
sqrt r1,r2;
in r1,1203;
load r1,r2;


結果:

DEPTH = 256;
WIDTH = 32;
ADDRESS_RADIX = HEX;
DATA_RADIX = BIN;
CONTENT
BEGIN
[00..7F] : 000000000000;
00	:	10000000100000000000000001100100;-- 80800064
01	:	10000001000000000000000011001000;-- 810000C8
02	:	00000000100000000001000000110000;-- 801030
03	:	00000000100001000001000000000001;-- 841001
04	:	01000000100000000001000000110000;-- 40801030
05	:	01000000101000000001000000000000;-- 40A01000
06	:	10000000110101000000010010110011;-- 80D404B3
07	:	10000000110000000001000000000000;-- 80C01000
08	:	00000000000000000000000000000000;-- 0
09	:	00000000000000000000000000000000;-- 0
0A	:	00000000000000000000000000000000;-- 0
0B	:	00000000000000000000000000000000;-- 0
0C	:	00000000000000000000000000000000;-- 0
0D	:	00000000000000000000000000000000;-- 0
0E	:	00000000000000000000000000000000;-- 0
0F	:	00000000000000000000000000000000;-- 0
10	:	00000000000000000000000000000000;-- 0
11	:	00000000000000000000000000000000;-- 0
12	:	00000000000000000000000000000000;-- 0

。。。以下省略



12月9日


うん、あまり進んでいません(>_<)
ぶよぶよんが作ってくれたシミュレータのプログラムを大体読んでみた

でも同時進行よりもまずアセンブラを完成させることを優先するように言われたのでその通りにします。



12月17日
風邪を引いてほとんど進まず。。。
とりあえずアセンブラのジャンプを実装しました。
まだテストしていません。。。





1月3日

あけましておめでとうございます。
大学生活の最後の年になりましたね。
今年はが皆さんにとっていい年でありますように~☆

昨日は久しぶりに地下に行きました。思った通りに誰もいなかった。大学キャンパスの中にも何人いるんだろう?っていう感じでした。。。

そしてなぜか無線は繋がるのに、有線は繋がらなくなってしまった。なんでだろう???(>_<)

年末はたまりまくった課題に手を付けました。って、未だに終わらず。。。
昨日はアセンブラのジャンプなどのテストをしてみました。大丈夫そうな感じでしたけど、

えーと、ちょっと不明な点がありました。
displacement上位7ビットと下位19ビットって24ビットも使うってことなのかな??
そこまで使うことってあるのかな?
あとラベルとかを使わずにジャンプとか条件分岐はほとんどdisplacementを使うってことですよね?
一応命令セット通りに実装したつもりでした。


↑ごめんなさい、書き方が悪かったですね。ジャンプや条件分岐もアセンブリ言語ではラベルを用いて表記するようにし、アセンブラがラベルからdisplacementを計算してくれるようにしていただけるとありがたいです。(buyobuyon)

displacement 24bit(26bit?)
SRAMのアドレスが20bitだから最大20bitで良いはずだと思いますー。
どっちにしろdisp19じゃたりないけど…。
大ジャンプ(最上位1)と小ジャンプ(最上位0)に命令を分けるとかすればdisp19でことたりるようになるけど、コンパイラさんの手間が増えてしまうだけかなぁと。(yastak)

あれ?コンパイラが出すコードは番地でなくラベルを扱うので、大ジャンプ(最上位1)と小ジャンプ(最上位0)に命令を分けた場合には、アセンブラさんの手間の方が増えません?(buyobuyon)

あ、そうですね。勘違いしていました…。ラベル使うならアセンブラの段階で分かれますね…。
コンパイラのはく命令がJMPH imm/JMP immに分かれるのかなぁというイメージでした。
(yastak)





1月12日

アセンブラでレジスタ関係でとんでもないミスをしたことが分かった。。。(>_<)
幸いすぐに直せるものでよかったよかった。
命令セットの意味がようやく分かって、今週中にアセンブラを直して完成したいと思います。

シミュレータのFPUの部分はとりあえずfloatで直接計算するようにします。後で単精度などを読んで、
シフトを利用したバージョンも作りたいと思います。

色々と教えてくれた班の皆さんに感謝感謝です。

あとテスト勉強と連続系のたまった課題を消化しなくては。。。






1月17日

アセンブラのジャンプと条件分岐を中心に色々とテストしました。
テストしたものは全部大丈夫でした。
いくつかの結果を張っておきます。

ソースファイル:
:first;
hi r2,200;
:second;
add r1,r2,r3;
addi r1,r2,1;
fadd r1,r2,r3;
:third;
sqrt r1,r2;
jmp second;
jmpl first;
jmpr r2;
jmprl r1;
beq r1, first;
bne r2, second;
bgt r3, third;
ret ;
end ;



実行結果:

[hari@localhost ~]$ ./assem source.txt result.txt
jmp label OK--label[1], num: 1, content: second;
jmpl label OK--label[0], num: 0, content: first;
beq label OK--label[0], num: 0, content: first;
bne label OK--label[1], num: 1, content: second;
bgt label OK--label[2], num: 4, content: third;
ret
end
there is no error
assembly finished



出力されたファイル:

00	:	10000001000000000000000011001000;-- 810000C8 
01	:	00000000100000000001000000110000;-- 801030 
02	:	00000000100001000001000000000001;-- 841001 
03	:	01000000100000000001000000110000;-- 40801030 
04	:	01000000101000000001000000000000;-- 40A01000 
05	:	11000000011000000000000000000001;-- C0600001 
06	:	11000000011010000000000000000000;-- C0680000 
07	:	11000000001000000001000000000000;-- C0201000 
08	:	11111111101010000000100000000000;-- FFA80800 
09	:	11000000100000000000000000000000;-- C0800000 
0A	:	11000001000010000000000000000001;-- C1080001 
0B	:	11000001100100000000000000000100;-- C1900004 
0C	:	11000000001100111111100000000000;-- C033F800 
0D	:	11000000001110000000000000000000;-- C0380000 
0E	:	00000000000000000000000000000000;-- 0 
0F	:	00000000000000000000000000000000;-- 0 
。。。





1/26
テストが近づいていますよね。。。(>_<)
シミュレータの FPUのとこ一応ほとんど作ったけど、
なぜか微妙に期待した値とずれたり。。。
たとえば5.00000000000になるべきところが4.99999999999999とかになったり。。。

日曜日に発表資料を作りたいので、土曜日の24時までに中間発表3のページに書き込んで頂ければ幸いです。


原因は分からないけど型をfloatにしているから誤差が出てきてしまった、とかかな?
分からないようでしたらテスト前でも後でもいつでもいいので見せてください。(tsuy)

たぶんその辺だと思います。ありがとうございます。
さっき津田くんがPerlで書いたファイルを読みました。
ほぼ似たようなのことをやっている感じだが、ずっと簡潔なコードに感心しています。
これを参考にさせて頂ながら自分の書いたコードをきれいにしてみます。
(はりー@地下)





2/14

試験お疲れ様&お久しぶりです。

シミュレータのFPUの誤差のところのバグが取れました。

非正規数とかのエラー処理をまだ全然していないので、それらを追加してからアップロードします。

集中講義に参加してしまったため、暫くの間平日は結構埋められているけど、平日の夕方や土日中心に頑張りたいです。えーと一応17日土曜日は地下に行く予定で、シミュレータのファイルをできれば今週中にアップロードする予定です



FPU部分の非正規化数の処理なのですが、コンテストのルールでは要らないそうなのでFPUではサポートしていない(非正規化数が絡む処理の挙動は未定義)んですよね。だからシミュレータでも非正規化数の処理は入れない方がいいような気がするんですが、どうなんでしょうね?(tsuy)


分かりました。ありがとうございます。
えーとFPUの部分についてちょっと聞きたいことがありますけど、tsuyさんはいつ地下に行く予定ですか?
(はりー)



16日以降の午後なら時間を指定してくれればいつでも地下に行けます。曜日もいつでもいいです。(tsuy)


アセンブラについてなのですが、次のように、ラベルが算術演算命令のオペランドとなるような場合には正しく機械語に翻訳できます?

addi r1, r0, func;
jmprl r1;
end;
:func;
ret;

クロージャ経由の関数呼び出しや、外部変数の読み込みの際に、このような形が現れるのですが…。(buyobuyon)



To tsuy

17日の午後~2時半、または5時以降はいかがでしょうか?(2時半~5時に一応バイトが入っていますが、時間調整ができますので、そちらの都合のいい時にあわせます)


To ぶよぶよん
今のアセンブラだとできないと思います。
土日に直します。

To yastak

命令の変更は一箇所だけですよね?
こちらも明日に地下に行って直します


よろしくお願いします。(buyobuyon)


先ほどの、少し訂正。

mov r1, func;
jmprl r1;
end;
:func;
ret;

addiを仮想命令movに置き換えました。
(ラベルが32bit値なのに、addiの定数部が32bitでないことを忘れていました…。)
仮想命令movを、命令hiとaddiに置き換えるのは、
アセンブリ側にお任せしてしまってよろしいですか?
これをコンパイラでやろうとすると
ラベルの処理までコンパイラでやる必要が出てきてしまうので…。(buyobuyon)

17日午後はできるだけ地下にいるようにします。2時半に間に合うか分かりませんが、少なくとも5時にはいると思います(tsuy)


To tsuy
分かりました。ありがとうございます。
早めに戻れるようにバイトの時間を調整します。
ではまた五時ころにお願いしますね@地下
(はりー)

To buyobuyon
mov命令ですが、ちょっと質問がありました。詳細はそちらのページにかき込みました。(m_m)

(harry)

ども。
シミュレーションで、アセンブリを使いたいので、最新版UPしてくださいm(_ _)m

因みに、現在UPされているのをつかってみたのですが、
addi r1,r2,-1
などど、即値のところにマイナス値を入れると出力ファイルに
FFFFFFF...というall 1の命令が出力されてしまいました。
バグかなぁ?
(yastak)

名前:
コメント:
最終更新:2009年06月07日 10:59