620 Views
December 23, 21
スライド概要
コンピュータ・アーキテクチャ演習
URL: https://www.kkaneko.jp/cc/ca/index.html
金子邦彦(かねこくにひこ) 福山大学・工学部・教授 ホームページ: https://www.kkaneko.jp/index.html 金子邦彦 YouTube チャンネル: https://youtube.com/user/kunihikokaneko
ca-9. 数の扱い (コンピュータ・アーキテクチャ演習) URL: https://www.kkaneko.jp/cc/ca/index.html 金子邦彦 1
アウトライン 9-1 浮動小数点数の扱い 9-2 2の補数 9-3 算術シフト 9-4 論理シフト 2
9-1 浮動小数点数の扱い 3
対応 4
対応 使用されるレジスタが xmm0 に変わるなど, いくつかの変化 int を double に変更 5
9-4 2の補数 6
2の補数 • 2の補数は,負の整数も扱いたいときに便利 • 2の補数では,最上位ビットが符号ビット 0 → 正の整数または0 1 → 負の整数 10進数の2 0 0 0 0 0 0 1 0 10進数の1 0 0 0 0 0 0 0 1 10進数の0 0 0 0 0 0 0 0 0 10進数の-1 1 1 1 1 1 1 1 1 10進数の-2 1 1 1 1 1 1 1 0 7
2の補数での符号ビット 8ビットの整数データの場合 8 7 6 5 4 3 2 1 2の補数では,最上位ビットは符号ビット 0 → 正の数,0 1 → 負の数 正なのか負なのかの区別に使う 8
演習 ① ウェブブラウザを起動する ② python tutor を使いたいので,次の URL を開く http://www.pythontutor.com/ ※ Internet Explorer でうまく動かない場合があり ます → うまく動かないときは Google Chrome を試し てください ※ 日本語モードはないので,英語で使う 9
③ 「Visualize your code and live help now」をク リック 10
言語を選べる. 「Python 3.6」を選んでおく エディタ 実行のためのボタン 11
① 次のように書きなさい print( format( -2 & 0xff, 'b' ) ) print( format( -1 & 0xff, 'b' ) ) print( format( 0 & 0xff, 'b' ) ) print( format( 1 & 0xff, 'b' ) ) print( format( 2 & 0xff, 'b' ) ) print( format( 3 & 0xff, 'b' ) ) 12
②「Visualize Execution」をクリック 13
③「Last」ボタンをクリック 14
④ 結果を確認 -2 -1 0 1 2 3 10進数 15
9-3 算術シフト 16
算術シフト 整数を2倍したい,4倍したい,1/2倍したい, 1/4倍したい 数 10(十進数) 0 0 0 0 1 0 1 0 (二進数) ここでは, 最上位ビットは 符号ビット (+か-かの記録) 0 20(十進数) 0 0 0 1 0 1 0 0 (二進数) 整数の2倍 = 最上位ビット以外のビットを左に1つ ずらす(左シフト) 17
算術シフトの左と右 • 算術左シフト • 最上位ビットは変化しない • 最上位ビット以外を左にシフト.できた空きに は0を詰める • 算術右シフト • 最上位ビットは変化しない • 最上位ビット以外を右にシフト.できた空きに は最上位ビットの値を詰める 18
算術左シフトによる2倍 10(十進数) 0 0 0 0 1 0 1 0 (二進数) 0 20(十進数) 0 0 0 1 0 1 0 0 (二進数) -5(十進数) 1 1 1 1 1 0 1 1 (二進数) ※ 2の補数 0 -10(十進数) 1 1 1 1 0 1 1 0 (二進数)※ 2の補数 最上位ビット以外を左に1つずらす(左シフ ト). 最下位ビットに0を入れる 19
算術左シフトによる4倍 10(十進数) 0 0 0 0 1 0 1 0 (二進数) 00 40(十進数) 0 0 1 0 1 0 0 0 (二進数) -5(十進数) 1 1 1 1 1 0 1 1 (二進数) ※ 2の補数 00 -20(十進数) 1 1 1 0 1 1 0 0 (二進数)※ 2の補数 最上位ビット以外を左に2つずらす(左シフ ト). 最下位2つに,「00」を入れる 20
算術右シフトによる 1/2倍 10(十進数) 0 0 0 0 1 0 1 0 (二進数) 5(十進数) 0 0 0 0 0 1 0 1 (二進数) -5(十進数) 1 1 1 1 1 0 1 1 (二進数) ※ 2の補数 -3(十進数) 1 1 1 1 1 1 0 1 (二進数)※ 2の補数 最上位ビット以外を右に1つずらす(右シフ ト). 最上位から2番目のビットには,最上位ビッ トを入れる 21
算術シフト • 整数を2倍,4倍,・・・,1/2倍, 1/4倍・・・,したいときに使う • 2の補数では,符号ビットがある.符号 ビットの部分はそのまま残すのが,算術 シフト 22
算術右シフト sar の例 算術右シフトは 1/2倍, 1/4倍, ・・・ アセンブリ言語のプログラム a に 32 をセット a を 2ビット算術右シフト 実行結果の例 23
算術左シフト sal の例 算術左シフトは 2倍, 4倍, ・・・ アセンブリ言語のプログラム a に 32 をセット a を 2ビット算術左シフト 実行結果の例 24
演習 • Visual Studio を起動しなさい • Visual Studio で,Win32 コンソールアプリケー ション用プロジェクトを新規作成しなさい プロジェクトの「名前」は何でもよい 25
• Visual Studioのエディタを使って,ソースファイ ルを編集しなさい 追加 26
• ビルドしなさい.ビルドのあと「1 0 失敗」の表示を確認しなさい 正常終了, → 表示されなければ,プログラムのミスを自分で 確認し,修正して,ビルドをやり直す 27
• Visual Studioで,ブレークポイントを設定しなさ い • Visual Studioで,デバッガーを起動しなさい. 「デバッグ」 → 「デバッグ開始」 • ブレークポイントの行で,実行が中断することを確認し なさい あとで使うので,中断したままにしておくこと 28
• 逆アセンブルで「a = a / 2」のところを確認しな さい. idiv ではなく sar になっている(算術シフト) 1ビットのシフト 29
• 次のように書き替えて,同じ手順を繰り返しなさ い. 逆アセンブルで「a = a / 4」のところを確認しなさ い. 2ビットのシフト 30
• 次のように書き替えて,今度は,変数 a の値を確 認しなさい 3ビットのシフト (8で割って,あまりを切り捨て) 31
• 次のように書き替えて, 変数 a の値を確認しな さい 3ビットのシフト (8倍) 32
Pentium 系列プロセッサの 算術演算命令の例 種類 算術演算 命令 意味 add 加算 sub 減算 imul 乗算 idiv 除算 sar, sal 算術シフト 33
9-4 論理シフト 34
論理シフトの例 2ビット目が1か0かを調べたい 他のビットは無視したい 10001010 論理右シフト 0 01000101 00000001 論理積 00000001 ※ もし,元の2ビット目が0だったときは, この値は「00000000」 35