昔のページをここに移動
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