「harry(昔)」の編集履歴(バックアップ)一覧はこちら

harry(昔)」(2009/06/07 (日) 10:59:25) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

***昔のページをここに移動 ------------ **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日まで日本にいないです。大変申し訳ないのですが、何か連絡があれば [[こちらに書かれたアドレス>harry_sub]]にお願いします。(すぐに返事できない場合もありますが) -------- 進行状況報告(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) - セフしさまさまだなwマジ天国www &br() &br()http://sersai%2ecom/hosakimenma/387987537 -- 大日にょ来 (2009-06-06 10:35:39) #comment(vsize=2,nsize=20,size=40)
***昔のページをここに移動 ------------ **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日まで日本にいないです。大変申し訳ないのですが、何か連絡があれば [[こちらに書かれたアドレス>harry_sub]]にお願いします。(すぐに返事できない場合もありますが) -------- 進行状況報告(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) #comment(vsize=2,nsize=20,size=40)

表示オプション

横に並べて表示:
変化行の前後のみ表示: