Changes between Version 3 and Version 4 of Ex02課題2015
- Timestamp:
- Apr 14, 2015 2:25:36 PM (11 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
Ex02課題2015
v3 v4 8 8 9 9 == 左シフト == 10 1ビット左シフトは2倍することと等価なので 加算命令によって実現できます。 10 1ビット左シフトは2倍することと同等なので加算命令によって実現できます。 11 12 シフト命令を使う場合: 13 {{{ 14 sll $8,$9,1 15 }}} 16 17 加算命令の場合: 18 {{{ 19 add $8,$9,$9 20 }}} 21 22 ここで気をつけなければならないのは、加算によるオーバーフローです。 23 最上位ビットが1である数を2倍すると(正確には同じ数を足し合わせると)、最上位ビットで桁上がりを生じるため、 24 add 命令ではオーバーフロー例外が発生してしまいます。 25 xspimでは、このためプログラムが停止してしまいますので、 左シフトするための加算はaddではなく、 オーバーフローを無視するadduを使用してください。 26 27 一方、今後設計するプロセッサはオーバーフローをチェックしません ので、回路シミュレーション時は、adduをaddに戻す必要があります。 28 詳しいことは今後説明します。今回作成するプログラムはadduを利用したものを保存しておくこと。 11 29 12 30 == 右シフト == 13 31 1ビット右シフトを他の命令で単純に実現することは困難です。 14 そこで今回は、乗算アルゴリズムとハードウエアの直列バージョン(教科書上巻p.212)に あるアルゴリズムを左シフトのみを使うように修正して 乗算を実現します。32 そこで今回は、乗算アルゴリズムとハードウエアの直列バージョン(教科書上巻p.212)に あるアルゴリズムを左シフトのみを使うように修正して乗算を実現します。 15 33 16 34 [[Image(http://galaxy.u-aizu.ac.jp/note/raw-attachment/wiki/Ex02%E8%AA%B2%E9%A1%8C2015/mult_chart.gif)]] 35 36 乗算で使われる右シフトは、ビットを下位から順に調べることだけが 目的なので、左シフトを使って同等の機能を実現することができます。 37 38 下のように、右シフトの結果と定数1とのandをとる代わりに、 39 初期値として1をレジスタに入れておき、これを左シフトしたものとand をとるようにします。 40 41 シフト命令を使う場合: 42 {{{ 43 slr $8,$8,1 44 andi $9,$8,1 45 }}} 46 47 加算命令の場合: 48 {{{ 49 addi $10,$0,1 # $10に1を代入(前処理) 50 : 51 addu $10,$10,$10 # 左シフト。通常でslr命令だった部分に相当 52 and $9,$8,$10 # 通常でandi命令だった部分に相当 53 }}} 54 55 この様にして各ビットが1か0かを調べられます。 56 57 シフト命令を使う方法(上)だと結果は 0…01(32ビット) か 00…0(32ビット)の2通りだけですが、 58 加算命令を使用した方法(下)だと、そのビットが0のときは 00…0 ですが、そのビットが1だった場合、 59 その結果もそれが何桁目かによって、結果を左にシフトしています。 60 ですから、結果が0であるか否かで条件分岐をすることになります。 61 62 [[Image(http://galaxy.u-aizu.ac.jp/note/raw-attachment/wiki/Ex02%E8%AA%B2%E9%A1%8C2015/shift_ex.gif)]] 63 64 65 66 67
