1 / 31

マイクロプロセッサ

マイクロプロセッサ. 第 4 回. コンピュータにおける算術論理演算(その1). 関根 優年 田向 権. 前回の演習 問 3  回答例. ## array のアドレスを $t0 にロードし、 ## array[0] と array[1] をレジスタ $t1, $t2 に読み込む。 la $t0, array lw $t1, 0($t0) lw $t2, 4($t0) ## $t1 < $t2 ならば , ELSE へ分岐

kenyon
Télécharger la présentation

マイクロプロセッサ

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. マイクロプロセッサ 第4回 コンピュータにおける算術論理演算(その1) 関根 優年 田向 権

  2. 前回の演習 問3 回答例 ## array のアドレスを $t0 にロードし、 ## array[0] と array[1] をレジスタ $t1, $t2 に読み込む。 la $t0, array lw $t1, 0($t0) lw $t2, 4($t0) ## $t1 < $t2 ならば, ELSE へ分岐 slt $s1, $t1, $t2 # if ($t1 < $t2) $s1 = 1; else $s1 = 0; bne $s1, $zero, ELSE # if ($t1 < $t2) ならば,ELSEへジャンプ sub $s0, $t1, $t2 # $s0 = $t1 - $t2; ## ENDIF に強制的にジャンプ j ENDIF ELSE: sub $s0, $t2, $t1 # $s0 = $t2 - $t1; ENDIF:

  3. 前回の宿題答え • 問4-1 array内の要素を全部加算している.最終的に,計算結果$t1をSのアドレスが指すメモリ空間へとストアしている.答えは55.

  4. 符号なし整数の2進数表現 正の整数Xに対するn桁の2進数 (xn-1 xn-2 … x1 x0 )2 xi ∈ L2 ( = {0,1}) X = xn-12n-1+xn-22n-2+…+ x12+ x0 各桁をビット(bit:binary digit) 最上位桁をMSB(Most Significant Bit) 最下位桁をLSB(Least Significant Bit)と呼ぶ 例) 1word長(数値を表すためのビット数)が32bit 0 ~232 ―1 (4,294,967,295) まで表現可能 (232通り) 0000 0000 0000 0000 0000 0000 0000 0000 = 0 0000 0000 0000 0000 0000 0000 0000 0001 = 1 0000 0000 0000 0000 0000 0000 0000 0010 = 2 …. 1111 1111 1111 1111 1111 1111 1111 1101 = 4,294,967,293 1111 1111 1111 1111 1111 1111 1111 1110 = 4,294,967,294 1111 1111 1111 1111 1111 1111 1111 1111 = 4,294,967,295 10進数 2進数

  5. 符号付き整数の2進数表現 数値には負数が存在 ⇒ 符号付き整数の2進数表現 ① 符号・絶対値表現 例) MSB (10)10 : 00001010 (-10)10 : 10001010 符号ビット 0 ⇔ + 1 ⇔ - 絶対値 符号ビットをどこに置くか、右端、左端? ゼロの表現が二通り    0 0000000,1 000 0000 00000000 から 1 を引いてみると,上の桁から2を借りてきて、 00000000(0)10 00000001(1)10 11111111(-1)10 1000001 とは異なる

  6. 例) ②1の補数表現 (10)10 : 00001010 (-10)10 : 11110101 負数は、各ビット反転: 0..0と1..1が共に0 両方を足して見ると 11111111 となる.これは、-1で0に1足りない. 最初から1を加えておけばよいのでは、 1の補数に1を加えたので2の補数?   ③2の補数表現 例) (10)10 : 00001010 (-10)10 : 11110110 負数は、各ビット反転して、さらに+1を加える 実際に用いられるものは、③の2の補数表現 (加算演算が非負数(符号なし整数)と同様に行えるため)

  7. 2の補数表現 2の補数表現 :各ビット反転して、さらに+1を加える 0はひとつだけ,加算は、符号なし整数と同様に可能 例) 1word長(数値を表すためのビット数)が32bit 例) 210及び-210の正負反転 (8ビット符号付き整数) -231 ~231 ―1 (2,147,483,647) まで表現可能 (232通り) 0000 0000 0000 0000 0000 0000 0000 0000 = 0 0000 0000 0000 0000 0000 0000 0000 0001 = 1 0000 0000 0000 0000 0000 0000 0000 0010 = 2 …. 0111 1111 1111 1111 1111 1111 1111 1101 = 2,147,483,645 0111 1111 1111 1111 1111 1111 1111 1110 = 2,147,483,646 0111 1111 1111 1111 1111 1111 1111 1111 = 2,147,483,647 1000 0000 0000 0000 0000 0000 0000 0000 = -2,147,483,648 1000 0000 0000 0000 0000 0000 0000 0001 = -2,147,483,647 1000 0000 0000 0000 0000 0000 0000 0010 = -2,147,483,646 …. 1111 1111 1111 1111 1111 1111 1111 1101 = -3 1111 1111 1111 1111 1111 1111 1111 1110 = -2 1111 1111 1111 1111 1111 1111 1111 1111 = -1 0000 0010 (210 ) ⇒1111 1101 + 1 = 1111 1110 (-210 ) 1111 1110 (-210 ) ⇒0000 0001 + 1 = 0000 0010 (210 ) 10進数 2進数

  8. 例題) 2進から10進への変換 2の補数表現の実際の値の計算法(32ビットの場合) (x31×(-231))+(x30×230)+(x29×229)+ … +(x1×21)+(x0×20) ここで,xiは、数値xのi番目のビット 例題) 次の32ビットの2の補数の10進数はいくつか 1111 1111 1111 1111 1111 1111 1111 11002 答) (1×(-231))+(1×230)+(1×229)+ … +(0×21)+(0×20) = -231 + 230 + 229 +…+ 22 = -2,147,483,64810 + 2,147,483,64410 = -410

  9. 例題) 符号付きの比較と符号なしの比較 符号付き/なしで、大小関係が変わる → それぞれに対応した比較命令 符号付き整数用 比較命令slt(set on less than) (Cでいえばint) slti(set on less than immediate) 符号なし整数用 比較命令sltu(set on less than) (Cでいえばunsigned int) sltiu(set on less than immediate) MIPSの 比較命令 例題) レジスタ$s0に1111 1111 1111 1111 1111 1111 1111 11112 レジスタ$s1に0000 0000 0000 0000 0000 0000 0000 00012 が格納されているとき、次の2つの命令で、レジスタ$t0,$t1の値はどうなるか slt $t0,$s0,$s1# 符号つきの比較 sltu $t1,$s0,$s1 # 符号なしの比較 答) $s0の値 : 符号つき整数だと-110, 符号なし整数だと4,294,967,29510 $s1の値 : 符号つき整数だと110, 符号なし整数だでも110 符号付きの比較(slt)だと、$s0<$s1。  → レジスタ$t0の値は1となる 符号なしの比較(sltu)だと、$s0>$s1。 → レジスタ$t1の値は0となる

  10. 例題) 正負反転の簡便法 例題) 210および-210を正負反転せよ。 答) 210 = 0000 0000 0000 0000 0000 0000 0000 00102 各ビットを反転させ、1を足す。 1111 1111 1111 1111 1111 1111 1111 11012 +)12 1111 1111 1111 1111 1111 1111 1111 11102 -210 = 1111 1111 1111 1111 1111 1111 1111 11102 各ビットを反転させ、1を足す。 0000 0000 0000 0000 0000 0000 0000 00012 +)12 元に戻る 0000 0000 0000 0000 0000 0000 0000 00102

  11. 例題) 符号拡張の簡便法 16ビット2進数 → 32ビット2進数へ変換(符号拡張) 短い方の数値を長い方の右側の部分に単純にコピーし、 長い方の余る部分を短い方の最上位ビットつまり符号ビットで埋める 例題) 16ビット2進数の210および-210を32ビットの2進数に変換せよ。 答) 16ビット表現の2 : 0000 0000 0000 00102 16ビット表現の-2: 1111 1111 1111 11102 32ビット表現の2 : 0000 0000 0000 0000 0000 0000 0000 00102 32ビット表現の-2: 1111 1111 1111 1111 1111 1111 1111 11102

  12. 例題) 2進数から16進数へ変換の簡便法 例題) 次の16進数および2進数の数値を互いに逆に変換せよ eca8 642016 0001 0011 0101 0111 1001 1011 1101 11112 答) eca8 642016 1110 1100 1010 1000 0110 0100 0010 00002 0001 0011 0101 0111 1001 1011 1101 11112 1357 9bdf16

  13. 加算 0000 0111 = 710 + 0000 0110 = 610 = 0000 1101 = 1310 (0) (0) (1) (1) (0)(桁上げ) ・・・0 0 0 1 1 1 ・・・0 0 0 1 1 0 ・・・(0)0 (0)0 (0)1 (1)1 (1)0 (0)1 0+0+0 =00 0+0+0 =00 1+0+0 =01 1+1+1 =11 0+1+1 =10 1+0=01 各ビットの加算と桁上げの様子 2進数の加算 例) 610に710を2進数で加える. 10進の加算と同じように桁上げをする. 数値の各ビットを下位ビットから加え、桁上がりを隣の上位ビットに加える

  14. (1) (1) (1) (1) (0)(桁上げ) ・・・0 0 0 1 1 1 ・・・1 1 1 0 1 0 ・・・(0)0 (0)0 (0)0 (1)0 (1)0 (0)1 例) 710にから610を2進数で引く 710 - 610= 710 + (-610) 0000 0111 = 710 1+0+1 =10 1+0+1 =10 1+0+1 =10 1+1+0 =10 0+1+1 =10 1+0=01 + 1111 1010 = -610 各ビットの加算と桁上げの様子 = 0000 0001 = 110 減算 2進数の減算 引く数を2の補数表現にしてから加算 2の補数表現を用いることで、 非負数と負数の加算が特別な 演算をすることなく、実現できる 他の符号付き整数表現では、特別な演算が必要 1の桁上がりがずーと続き、 最上位ビットまで変わる. 最上位ビットは符号ビットの ように見える!

  15. 加減算におけるオーバーフロー オーバーフロー 計算結果の数値がハードウェアに用意 されているビット数に収まりきらないこと 加算時のオーバーフローの例 (符号付き8bit整数の場合) 正数+正数 01100001 = 9710 + 01001000 = 8010 10101001 = -8710 同じ符号の数を加算しているのに、 違う符号の演算結果が得られている 負数+負数 符号付き8bit整数は、-128~127の整数 しか表現できず、それ以外の範囲の演算 結果が予想される場合にはオーバーフロー 10011111 = -9710 + 10111000 = -8010 01010111 = 8710

  16. 2の補数表現時の加減算のオーバーフロー判定2の補数表現時の加減算のオーバーフロー判定 操作    オペランドA  オペランドB    結果

  17. MIPSにおけるオーバーフロー対応 MIPSにおけるオーバーフロー対応 加算(add)、即値加算(addi), 減算(sub)             → オーバーフロー時に例外が発生 符号なし加算(addu)、符号なし即値加算(addiu), 符号なし減算(subu)             → オーバーフローが起こっても例外は発生しない オーバーフローを認識するかしないかは、状況に応じるため、 それに対応して、命令を選択する 例外(exception) = 割込み(interrupt)とは? 予定外の手続き呼び出し MIPSでは、例外発生時の命令アドレスを退避可能 (例外プログラム・カウンタに格納される)

  18. 論理演算 (シフト演算) シフト演算  ビットを左または右にずらし、 空いた部分に0を挿入する操作 1ビット左シフトするごとに2倍、 右シフトするごとに1/2(正確には違う) MIPS命令 3ビット左にシフト 00001101 (13) ⇒ 01101000 (104) shift left logical命令 sll $t2,$s0,8 C言語的な記述だと # レジスタ$t2 = レジスタ$s0 << 8ビット 1310 << 310 =10410 左へ8ビットシフト shift right logical命令 1ビット右にシフト srl $t2,$s0,8 00011010 (26) ⇒ 00001101 (13) # レジスタ$t2 = レジスタ$s0 >> 8ビット 右へ8ビットシフト C言語的な記述だと 2610 >> 110 =1310

  19. 論理演算 (AND, OR演算) MIPS命令 AND演算 and命令 and $t0,$t1,$t2 (ビットマスク操作とも呼ばれる) # レジスタ $t0 = レジスタ $t1 & レジスタ $t2 00001101 & 11001001 00001001 それぞれの桁のビットの 論理積(AND)をとる andi命令(andの即値命令) andi $t0,$t1,100 # レジスタ $t0 = レジスタ $t1 & 100(即値) OR演算 or命令 or $t0,$t1,$t2 00001101 & 11001001 11001101 # レジスタ $t0 = レジスタ $t1 | レジスタ $t2 それぞれの桁のビットの 論理和(OR)をとる ori命令(orの即値命令) ori $t0,$t1,100 # レジスタ $t0 = レジスタ $t1 | 100(即値)

  20. 算術論理演算ユニットの作成 ALU(Arithmetic Logic Unit: 算術論理演算ユニット) 算術演算や論理演算を行う回路 2. ORゲート (c=a+b) 1. ANDゲート (c=a・b) a a c c b b ここでは、右の4つ の基本要素からな るALUを考える 3.インバータ (c=a) 4. マルチプレクサ(if d==0 c=a; else c=b) d c a a 0 c b 1

  21. 半加算器(1ビット加算器) 1ビット半加算器(全加算器) 入力 出力 備考 a b キャリー イン キャリー アウト 和 a 0 0 0 0 0 0+0 = 00 + 0 0 1 0 0 0+0 = 00 和 0 1 0 0 1 0+1 = 01 b 0 1 1 0 1 0+1 = 01 1 0 0 0 1 1+0 = 01 1 0 1 0 1 1+0 = 01 1 1 0 1 0 1+1 = 10 キャリーアウト 1 1 1 1 0 1+1 = 01 半加算器はa,b だけの1の数を数える

  22. 全加算器(1ビット加算器)-1 (0) (0) (1) (1) (0)(桁上げ) ・・・0 0 0 1 1 1 ・・・0 0 0 1 1 0 ・・・(0)0 (0)0 (0)1 (1)1 (1)0 (0)1 入力 出力 備考 a b キャリー イン キャリー アウト 和 0 0 0 0 0 0+0+0 = 00 0 0 1 0 1 0+0+1 = 01 0+0+0 =00 0+0+0 =00 1+0+0 =01 1+1+1 =11 0+1+1 =10 1+0=01 0 1 0 0 1 0+1+0 = 01 0 1 1 1 0 0+1+1 = 10 1 0 0 0 1 1+0+0 = 01 1ビット加算器の機能 1 0 1 1 0 1+0+1 = 10 1 1 0 1 0 1+1+0 = 10 1 1 1 1 1 1+1+1 = 11 キャリーイン : 隣の加算器からの桁上げ情報 キャリーアウト:隣の加算器への桁上げ情報 1ビット加算器(全加算器) キャリーイン a + 和 b キャリーアウト a,b, キャリーインの1の数を数えて,キャリーアウトと和の2ビットを出力 

  23. 入力 出力 備考 a b キャリー インC キャリー アウトco 和 0 0 0 0 0 0+0+0 = 00 0 0 1 0 1 0+0+1 = 01 0 1 0 0 1 0+1+0 = 01 0 1 1 1 0 0+1+1 = 10 1 0 0 0 1 1+0+0 = 01 1 0 1 1 0 1+0+1 = 10 1 1 0 1 0 1+1+0 = 10 1 1 1 1 1 1+1+1 = 11 全加算器(1ビット加算器)-2 機能:入力の1の数を数える. co = (-a)bc+a(-b)c+ab(-c)+abc s=(-a)(-b)c+(-a)b(-c)+a(-b)(-c)+abc 上の真理値表を簡単化すると カルノー図を書いて簡単化 論理合成で簡単化 co = ab+bc+ca s = abc + (a+b+c)・(-co)

  24. 全加算器(1ビット加算器)の構成 1ビット加算器(全加算器) a c b c s a + s b co co co = ab+bc+ca s = abc + (a+b+c)・(-co)

  25. 1ビットALU 論理演算(AND,OR)および 1ビットの加算能力を持つALU 0 : AND 1 : OR 2 : ADD 操作 1ビットALU キャリーイン キャリーイン a 0 操作 中身は 結果 入力a 入力 1 結果 入力b + 2 b キャリーアウト キャリーアウト ⇒ これらを組み合わせて32ビットALUへ

  26. 32ビットALU キャリーイン キャリーイン a0 ALU1 ALU0 結果0 結果1 キャリーアウト キャリーアウト 1ビットALUを 32個つなげる 操作 キャリーイン LSB 32ビットALU キャリーイン b0 操作 中身は a [a0 to a31] a1 b [a0 to a31] 結果 [結果0 to 結果31] b1 1ビット加算器を直接につなぎ合わせた回路 MSB 順次桁上げ加算器 (ripple carry adder) キャリーイン a31 ALU31 結果31 b31 キャリーアウト

  27. 減算に対応した1ビットALU 減算 = 負の数の加算 b: bのビット反転 a – b = a + (-b) = a + (b+1) = a + b + 1 2の補数表現での符号反転   ビット反転した上に1を足す AND,OR,加算、減算 を行う1ビットALU ビット反転 操作 キャリーイン a 0 加算時: 最下位ビットのキャリーインを0 減算時: 最下位ビットのキャリーインを1 入力 結果 1 + 2 b 0 1 キャリーアウト

  28. 32ビットALUのMIPSへの適合化(1) 1ビットALUへの機能追加 結果の最下位ビットを比較結果、 それ以外を0とする 操作 ビット反転 キャリーイン a 0 入力 結果 1 b + 0 2 1 3 より小 どこから? キャリーアウト 最上位以外の1ビットALU 1. set on less than命令 Rs<Rt が真なら 1 最下位ビットを1/0、 それ以外は0にする a < b →(a – b) < 0 結果が負なら 1 結果が負なら符号ビットは1 入力を減算し、その結果の 符号を比較結果とする

  29. 操作 ビット反転 キャリーイン a 0 入力 結果 1 b + 0 2 1 3 より小 セット オーバー フロー オーバーフロー 検出 最上位ビットの1ビットALU 32ビットALUのMIPSへの適合化(2) 最上位ビットALUにセット出力 2. ゼロ判定(条件分岐に使う) a = b → (a – b) = 0 入力を減算し、その結果の 全NORをとる 1.全ての1ビットALUに     「より小」入力の追加 2.MSBに比較結果      セット出力の追加 3.すべての結果 ORを取る 4.オーバーフロー検出の追加

  30. 32ビットALUのMIPSへの適合化(3) 最終的な32ビットALU ALU操作 a ゼロ判定 結果 オーバーフロー b キャリーアウト 大小比較: LSBの「より小」に MSBのセット(符号)を接続 ゼロ比較: 全ビット情報をORし、それをNOT ビットネゲート:   キャリーインとビット反転を共通化した制御信号      キャリーイン ビット反転 加算     0 0 減算 1 1

  31. 32ビットALUのMIPSへの適合化(4) ビットネゲート 操作 制御信号は3bit  操作(2bit)+ビットネゲート(1bit) キャリーイン a0 ALU0 b0 結果0 より小 キャリーアウト ゼロ判定 キャリーイン a1 b1 ALU1 結果1 0 より小 キャリーアウト a31 キャリーイン b31 ALU31 結果31 0 より小 オーバーフロー

More Related