ca-11

710 Views

December 23, 21

スライド概要

コンピュータ・アーキテクチャ演習
URL: https://www.kkaneko.jp/cc/ca/index.html

profile-image

金子邦彦(かねこくにひこ) 福山大学・工学部・教授 ホームページ: https://www.kkaneko.jp/index.html 金子邦彦 YouTube チャンネル: https://youtube.com/user/kunihikokaneko

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

ca-11. 条件分岐,繰り返し (コンピュータ・アーキテクチャ演習) URL: https://www.kkaneko.jp/cc/ca/index.html 金子邦彦 謝辞:「いらすとや」のイラストを使用しています 1

2.

11-1 比較命令 2

3.

比較命令 • 比較命令は, 何かと何かの比較を行い,フラグレジスタを変化さ せるための命令 • 条件ジャンプ命令は, フラグの値がある特定の条件のときだけジャンプす る命令 3

4.

比較命令 比較命令は,何かと,何かの比較 変数 age のメモリアドレス 10 進数で 12 変数 age の値をメモリから読み込んで 12 と比較 4

5.

比較命令の前後でのフラグレジスタの変化 比較命令 cmp の実行直前 比較命令 cmp の実行直後 5

6.

フラグ変化 age = 20 のとき age = 10 のとき age と 12 の比較によるフラグの変化 ◆ ZF(ゼロフラグ) クリア age の値は 20 と等しくない ◆ SF(サインフラグ) クリア age の値は 12 より小さくない ◆ ◆ ZF(ゼロフラグ) クリア age の値は 20 と等しくない SF(サインフラグ) セット age の値は 12 より小さい 6

7.

11-2 条件分岐とジャンプ命令 7

8.

条件分岐の例 Visual C++ の プログラム age = 20; if (age >= 12) p = 1800; else p = 500; こちらが 有効 無視 される age = 10; if (age >= 12) p = 1800; else p = 500; 無視 される こちらが 有効 8

9.

条件分岐でのプログラムの配置 比較命令 条件ジャンプ命令 B 無条件ジャンプ命令 A 「ある条件」が成り立てばAを, 成り立たなければBを実行 9

10.

プログラム実行の流れ • マシン語(機械語)のプログラム実行は,1度に 1命令ずつ進む • マシン語(機械語)での分岐は,ジャンプ命令の 組み合わせ 無条件ジャンプ 条件ジャンプ 10

11.

分岐 ◇変数 age の値 が12以上なら Aコース ◇12未満なら Bコース プログラムはメモリに,格納される 11

12.

変数 age が12未満 のときだけジャンプ せよという命令列が 入る 分岐 ◇変数 age の値 が12以上なら Aコース ◇12未満なら Bコース ジャンプ 12

13.

分岐 ◇変数 age の値 が12以上なら Aコース ◇12未満なら Bコース 必ずジャンプせよ という命令が入る ジャンプ 13

14.

age の値が 12 以上のとき age の値が 12 未満のとき 14

15.

ジャンプ命令の種類 ・無条件ジャンプ命令 必ずジャンプする ・条件ジャンプ命令 比較命令の結果によって,ジャンプしたりしなかったりする 15

16.

11-3 条件分岐の演習 16

17.

条件分岐の例 • 12歳以上は 1800円 • 12歳未満は 500円 17

18.

Visual C++ のソースファイル例 18

19.

Visual C++ 言語とアセンブリ言語 Visual C++ の プログラム アセンブリ言語 同じ意味 同じ意味 同じ意味 命令 命令が対象とする相手である オペランド 19

20.

この2行で「変数 age が12 未満のときだけジャンプせよ」 という意味 条件ジャンプ 20

21.

必ずジャンプせよ という無条件ジャンプ命令 無条件ジャンプ 21

22.

演習 • 条件分岐でのプログラム実行の流れ(実行順)を 確認 ステップオーバー機能を利用 22

23.

実行順 ① ② ③ ④ ⑤ 無条件ジャンプ この行は飛ばされることを確認 23

24.

• age = 20; age = 10; age の値が変わるとジャンプの様子が変化する ① ① ② ③ ② ③ ④ ④ ⑤ ⑤ ジャンプ ⑤でジャンプ ジャンプ ③でジャンプ 24

25.

演習 ① Visual Studio を起動しなさい ② Visual Studio で,Win32 コンソールアプリケー ション用プロジェクトを新規作成しなさい プロジェクトの「名前」は何でもよい 25

26.

③ Visual Studioのエディタを使って,ソースファイ ルを編集しなさい 追加 26

27.

④ ビルドしなさい.ビルドのあと「1 0 失敗」の表示を確認しなさい 正常終了, → 表示されなければ,プログラムのミスを自分で 確認し,修正して,ビルドをやり直す 27

28.

⑤ Visual Studioで「age = 20;」の行に,ブレーク ポイントを設定しなさい ① 「age = 20;」の行を マウスでクリック ② 「デバッグ」→「ブレーク ポイントの設定/解除」 ③ ブレークポイントが 設定されるので確認. 赤丸がブレークポイント の印

29.

⑥ Visual Studioで,デバッガーを起動しなさい. 「デバッグ」 → 「デバッグ開始」 ⑦ 「age = 20;」の行で,実行が中断することを確 認しなさい あとで使うので,中断したままにしておくこと 黄色の 矢印 「age = 20;」の行で実行が 中断している 29

30.

⑧「age = 20;」の行で,実行が中断した状態で,逆 アセンブルを行いなさい. ① 「デバッグ」→ 「ウインド ウ」→「逆アセンブル」 ② 逆アセンブルの結果が表示される 30

31.

⑨ ステップオーバーの操作を1回ずつ行いながら, 実行の流れを確認しなさい. 「デバッグ」 → 「ステップオーバー」 (あるいは F10 キー) 31

32.

ステップオーバー ステップオーバー ステップオーバー ステップオーバー ステップオーバー 「mov …」の行は スキップされること を確認 32

33.

⑩ 最後に,プログラム実行の再開の操作を行いなさ い.これで,デバッガーが終了する. 「デバッグ」 → 「続行」 33

34.

演習課題 「age = 20;」の行を「age = 10;」に変えて, 今の手順を繰り返しなさい. ジャンプの様子が変わるので確認しなさい 34

35.

11-4 繰り返しの演習 35

36.

繰り返し • 同じ処理を繰り返し,いつかは終わる y[i] = x[i] * 12 y x 36 60 24 12 24 24 3 5 2 1 2 2 繰り返す処理 i = 0, 1, 2, 3, 4, 5 と変化し 全部済んだら終わる 終了条件 36

37.

繰り返しの例 Visual C++ のプログラム y 36 60 24 12 24 24 x 3 5 2 1 2 2 繰り返す処理 i の値は 0 → 1 → 2 → 3 → 4 → 5 と変化し,全部済んだら終わる 37

38.

Visual C++ 言語とアセンブリ言語 Visual C++ の プログラム アセンブリ言語 同じ意味 命令 命令が対象とする 相手であるオペランド 38

39.

ジャンプ命令 アセンブリ言語 比較命令 条件ジャンプ命令 無条件ジャンプ命令 命令 命令が対象とする 相手であるオペランド 39

40.

演習 • 条件分岐でのプログラム実行の流れ(実行順)を 確認 ステップオーバー機能を利用 40

41.

演習 ① Visual Studio を起動しなさい ② Visual Studio で,Win32 コンソールアプリケー ション用プロジェクトを新規作成しなさい プロジェクトの「名前」は何でもよい 41

42.

③ Visual Studioのエディタを使って,ソースファイ ルを編集しなさい 追加 42

43.

④ ビルドしなさい.ビルドのあと「1 0 失敗」の表示を確認しなさい 正常終了, → 表示されなければ,プログラムのミスを自分で 確認し,修正して,ビルドをやり直す 43

44.

⑤ Visual Studioで「for」の行に,ブレークポイント を設定しなさい ① 「 for (i = 0;」の行を マウスでクリック ② 「デバッグ」→「ブレー クポイントの設定/解除」 ③ ブレークポイントが 設定されるので確認. 赤丸がブレークポイント の印

45.

⑥ Visual Studioで,デバッガーを起動しなさい. 「デバッグ」 → 「デバッグ開始」 ⑦「for」の行で,実行が中断することを確認しなさ い あとで使うので,中断したままにしておくこと 「for (i = 0; …」の行で実行が 中断している 45

46.

⑧「for」の行で,実行が中断した状態で,変数の値 を表示させなさい.手順は次の通り. ② 変数名と値の対応表が 表示される ①「デバッグ」 → 「ウインドウ」 → 「ローカル」 ※ 次ページに拡大図 46

47.

変数 i の値は,変な値に なっているはず 「y[i] = x[i] * 12;」は 未実行であることを確認! 47

48.

⑨「for」の行で,実行が中断した状態で,逆アセン ブルを行いなさい. ① 「デバッグ」→ 「ウインド ウ」→「逆アセンブル」 ② 逆アセンブルの結果が表示される 48

49.

⑩ ステップオーバーの操作を1回ずつ行いながら, 実行の流れを確認しなさい. 「デバッグ」 → 「ステップオーバー」 (あるいは F10 キー) 49

50.

⑪ 最後に,プログラム実行の再開の操作を行いなさ い.これで,デバッガーが終了する. 「デバッグ」 → 「続行」 50

51.

確認クイズ • ジャンプ命令は,2つ確認できましたか • ジャンプ命令でジャンプが行われたことを確認で きましたか 51

52.

演習 52

53.

足し算の繰り返し • 次のプログラムで,プログラム実行の流れを Visual Studio で確認しなさい static int a[4] = {1, 2, 3, 4}; static int b[4] = {2, 4, 6, 8}; static int c[4]; int i; for (i = 0; i < 4; i++) { c[i] = a[i] + b[i]; } 足し算を4回繰り返すプログラム. 結果は 3, 6, 9, 12 53

54.

足し算の繰り返し • 次のプログラムで,プログラム実行の流れを Visual Studio で確認しなさい static int a[4] = {1, 2, 3, 4}; int s; int i; s = 0; i = 0; while (s < 5) { s = s + a[i]; 1, 2, 3, 4 の合計を求めるプログラム. 結果は 10 i++; } 54

55.

文字列の長さ • 文字列の長さを数えるプログラム static char s[10] = "abc"; int i; for (i=0;;i++) if ( s[i] == 0 ) break; printf("%d\n", i); 55