750 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-11. 条件分岐,繰り返し (コンピュータ・アーキテクチャ演習) URL: https://www.kkaneko.jp/cc/ca/index.html 金子邦彦 謝辞:「いらすとや」のイラストを使用しています 1
11-1 比較命令 2
比較命令 • 比較命令は, 何かと何かの比較を行い,フラグレジスタを変化さ せるための命令 • 条件ジャンプ命令は, フラグの値がある特定の条件のときだけジャンプす る命令 3
比較命令 比較命令は,何かと,何かの比較 変数 age のメモリアドレス 10 進数で 12 変数 age の値をメモリから読み込んで 12 と比較 4
比較命令の前後でのフラグレジスタの変化 比較命令 cmp の実行直前 比較命令 cmp の実行直後 5
フラグ変化 age = 20 のとき age = 10 のとき age と 12 の比較によるフラグの変化 ◆ ZF(ゼロフラグ) クリア age の値は 20 と等しくない ◆ SF(サインフラグ) クリア age の値は 12 より小さくない ◆ ◆ ZF(ゼロフラグ) クリア age の値は 20 と等しくない SF(サインフラグ) セット age の値は 12 より小さい 6
11-2 条件分岐とジャンプ命令 7
条件分岐の例 Visual C++ の プログラム age = 20; if (age >= 12) p = 1800; else p = 500; こちらが 有効 無視 される age = 10; if (age >= 12) p = 1800; else p = 500; 無視 される こちらが 有効 8
条件分岐でのプログラムの配置 比較命令 条件ジャンプ命令 B 無条件ジャンプ命令 A 「ある条件」が成り立てばAを, 成り立たなければBを実行 9
プログラム実行の流れ • マシン語(機械語)のプログラム実行は,1度に 1命令ずつ進む • マシン語(機械語)での分岐は,ジャンプ命令の 組み合わせ 無条件ジャンプ 条件ジャンプ 10
分岐 ◇変数 age の値 が12以上なら Aコース ◇12未満なら Bコース プログラムはメモリに,格納される 11
変数 age が12未満 のときだけジャンプ せよという命令列が 入る 分岐 ◇変数 age の値 が12以上なら Aコース ◇12未満なら Bコース ジャンプ 12
分岐 ◇変数 age の値 が12以上なら Aコース ◇12未満なら Bコース 必ずジャンプせよ という命令が入る ジャンプ 13
age の値が 12 以上のとき age の値が 12 未満のとき 14
ジャンプ命令の種類 ・無条件ジャンプ命令 必ずジャンプする ・条件ジャンプ命令 比較命令の結果によって,ジャンプしたりしなかったりする 15
11-3 条件分岐の演習 16
条件分岐の例 • 12歳以上は 1800円 • 12歳未満は 500円 17
Visual C++ のソースファイル例 18
Visual C++ 言語とアセンブリ言語 Visual C++ の プログラム アセンブリ言語 同じ意味 同じ意味 同じ意味 命令 命令が対象とする相手である オペランド 19
この2行で「変数 age が12 未満のときだけジャンプせよ」 という意味 条件ジャンプ 20
必ずジャンプせよ という無条件ジャンプ命令 無条件ジャンプ 21
演習 • 条件分岐でのプログラム実行の流れ(実行順)を 確認 ステップオーバー機能を利用 22
実行順 ① ② ③ ④ ⑤ 無条件ジャンプ この行は飛ばされることを確認 23
• age = 20; age = 10; age の値が変わるとジャンプの様子が変化する ① ① ② ③ ② ③ ④ ④ ⑤ ⑤ ジャンプ ⑤でジャンプ ジャンプ ③でジャンプ 24
演習 ① Visual Studio を起動しなさい ② Visual Studio で,Win32 コンソールアプリケー ション用プロジェクトを新規作成しなさい プロジェクトの「名前」は何でもよい 25
③ Visual Studioのエディタを使って,ソースファイ ルを編集しなさい 追加 26
④ ビルドしなさい.ビルドのあと「1 0 失敗」の表示を確認しなさい 正常終了, → 表示されなければ,プログラムのミスを自分で 確認し,修正して,ビルドをやり直す 27
⑤ Visual Studioで「age = 20;」の行に,ブレーク ポイントを設定しなさい ① 「age = 20;」の行を マウスでクリック ② 「デバッグ」→「ブレーク ポイントの設定/解除」 ③ ブレークポイントが 設定されるので確認. 赤丸がブレークポイント の印
⑥ Visual Studioで,デバッガーを起動しなさい. 「デバッグ」 → 「デバッグ開始」 ⑦ 「age = 20;」の行で,実行が中断することを確 認しなさい あとで使うので,中断したままにしておくこと 黄色の 矢印 「age = 20;」の行で実行が 中断している 29
⑧「age = 20;」の行で,実行が中断した状態で,逆 アセンブルを行いなさい. ① 「デバッグ」→ 「ウインド ウ」→「逆アセンブル」 ② 逆アセンブルの結果が表示される 30
⑨ ステップオーバーの操作を1回ずつ行いながら, 実行の流れを確認しなさい. 「デバッグ」 → 「ステップオーバー」 (あるいは F10 キー) 31
ステップオーバー ステップオーバー ステップオーバー ステップオーバー ステップオーバー 「mov …」の行は スキップされること を確認 32
⑩ 最後に,プログラム実行の再開の操作を行いなさ い.これで,デバッガーが終了する. 「デバッグ」 → 「続行」 33
演習課題 「age = 20;」の行を「age = 10;」に変えて, 今の手順を繰り返しなさい. ジャンプの様子が変わるので確認しなさい 34
11-4 繰り返しの演習 35
繰り返し • 同じ処理を繰り返し,いつかは終わる 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
繰り返しの例 Visual C++ のプログラム y 36 60 24 12 24 24 x 3 5 2 1 2 2 繰り返す処理 i の値は 0 → 1 → 2 → 3 → 4 → 5 と変化し,全部済んだら終わる 37
Visual C++ 言語とアセンブリ言語 Visual C++ の プログラム アセンブリ言語 同じ意味 命令 命令が対象とする 相手であるオペランド 38
ジャンプ命令 アセンブリ言語 比較命令 条件ジャンプ命令 無条件ジャンプ命令 命令 命令が対象とする 相手であるオペランド 39
演習 • 条件分岐でのプログラム実行の流れ(実行順)を 確認 ステップオーバー機能を利用 40
演習 ① Visual Studio を起動しなさい ② Visual Studio で,Win32 コンソールアプリケー ション用プロジェクトを新規作成しなさい プロジェクトの「名前」は何でもよい 41
③ Visual Studioのエディタを使って,ソースファイ ルを編集しなさい 追加 42
④ ビルドしなさい.ビルドのあと「1 0 失敗」の表示を確認しなさい 正常終了, → 表示されなければ,プログラムのミスを自分で 確認し,修正して,ビルドをやり直す 43
⑤ Visual Studioで「for」の行に,ブレークポイント を設定しなさい ① 「 for (i = 0;」の行を マウスでクリック ② 「デバッグ」→「ブレー クポイントの設定/解除」 ③ ブレークポイントが 設定されるので確認. 赤丸がブレークポイント の印
⑥ Visual Studioで,デバッガーを起動しなさい. 「デバッグ」 → 「デバッグ開始」 ⑦「for」の行で,実行が中断することを確認しなさ い あとで使うので,中断したままにしておくこと 「for (i = 0; …」の行で実行が 中断している 45
⑧「for」の行で,実行が中断した状態で,変数の値 を表示させなさい.手順は次の通り. ② 変数名と値の対応表が 表示される ①「デバッグ」 → 「ウインドウ」 → 「ローカル」 ※ 次ページに拡大図 46
変数 i の値は,変な値に なっているはず 「y[i] = x[i] * 12;」は 未実行であることを確認! 47
⑨「for」の行で,実行が中断した状態で,逆アセン ブルを行いなさい. ① 「デバッグ」→ 「ウインド ウ」→「逆アセンブル」 ② 逆アセンブルの結果が表示される 48
⑩ ステップオーバーの操作を1回ずつ行いながら, 実行の流れを確認しなさい. 「デバッグ」 → 「ステップオーバー」 (あるいは F10 キー) 49
⑪ 最後に,プログラム実行の再開の操作を行いなさ い.これで,デバッガーが終了する. 「デバッグ」 → 「続行」 50
確認クイズ • ジャンプ命令は,2つ確認できましたか • ジャンプ命令でジャンプが行われたことを確認で きましたか 51
演習 52
足し算の繰り返し • 次のプログラムで,プログラム実行の流れを 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
足し算の繰り返し • 次のプログラムで,プログラム実行の流れを 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
文字列の長さ • 文字列の長さを数えるプログラム static char s[10] = "abc"; int i; for (i=0;;i++) if ( s[i] == 0 ) break; printf("%d\n", i); 55