1.3K 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-10. フラグ,フラグレジスタ (コンピュータ・アーキテクチャ演習) URL: https://www.kkaneko.jp/cc/ca/index.html 金子邦彦 謝辞:「いらすとや」のイラストを使用しています 1
10-1 フラグ 2
フラグの用途の例 自動で分岐させたい → フラグを使う 左 分岐 右 3
フラグ フラグを立てる (セット) フラグを下げる (クリア) 4
フラグ • フラグの値は 0 または 1 • プログラムの進行を決めるのに利用できる • フラグの値は,自動で変化する 5
10-2 フラグレジスタ 6
フラグレジスタ フラグレジスタは, レジスタウインドウ「EFL」 この値が変化 フラグレジスタ (名前は EFLAGS で、縮めて EFL)に、 たくさんのフラグが入っている フラグの名前 値 I D V I P V I F A V R C MF N T IOPL O D I T S Z F F F F F F A F P F C F 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 長さ 32 ビット 7
フラグレジスタ • 桁上がりフラグ (Carry Flag, CF) • 演算結果に桁上がりが生じると 1 • 桁あふれフラグ (Overflow Flag, OF) • 演算結果に桁あふれが生じると 1 • ゼロフラグ (Zero Flag, ZF) • 演算結果がゼロになると 1 • サインフラグ (Sign Flag, SF) • 演算結果がマイナスの数になると 1 など 8
フラグレジスタ 00000212 フラグの名前 値 I D V I P V I F A V R C M F N T IOP L O D I T S Z F F F F F F A F P F C F 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 9
フラグレジスタ 00000293 フラグの名前 値 I D V I P V I F A V R C M F N T IOP L O D I T S Z F F F F F F A F P F C F 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 1 10
フラグレジスタ • フラグレジスタのビット1つ1つが,フラグに なっている 11
10-3 Visual Studio で フラグの変化を見る 12
今から行うこと • フラグの値(0 または1)の変化を見る • フラグの値がある条件のときだけジャンプする命 令(条件ジャンプ命令)を見る 13
簡単な条件分岐の例 • 12歳以上は 1800円 • 12歳未満は 500円 14
Visual C++ のソースファイル例 15
パソコン演習 では,フラグレジスタ (EFL) の値の変化と,ジャン プの様子を確認してください ステップオーバー機能を利用 16
演習 ① Visual Studio を起動しなさい ② Visual Studio で,Win32 コンソールアプリケー ション用プロジェクトを新規作成しなさい プロジェクトの「名前」は何でもよい 17
③ Visual Studioのエディタを使って,ソースファイ ルを編集しなさい 追加 18
④ ビルドしなさい.ビルドのあと「1 0 失敗」の表示を確認しなさい 正常終了, → 表示されなければ,プログラムのミスを自分で 確認し,修正して,ビルドをやり直す 19
⑤ Visual Studioで「age = 20;」の行に,ブレーク ポイントを設定しなさい ① 「age = 20;」の行を マウスでクリック ② 「デバッグ」→「ブレーク ポイントの設定/解除」 ③ ブレークポイントが 設定されるので確認. 赤丸がブレークポイント の印
⑥ Visual Studioで,デバッガーを起動しなさい. 「デバッグ」 → 「デバッグ開始」 ⑦「age = 20;」の行で,実行が中断することを確認 しなさい あとで使うので,中断したままにしておくこと 黄色の 矢印 「age = 20;」の行で実行が 中断している 21
⑧「age = 20;」の行で,実行が中断した状態で,逆 アセンブルを行いなさい. ① 「デバッグ」→ 「ウインド ウ」→「逆アセンブル」 ② 逆アセンブルの結果が表示される 22
⑨「age = 20;」の行で,実行が中断した状態で,レ ジスタの中身を表示させなさい.手順は次の通り. デバッガーを起動済みで, プログラムの実行が中断し ているときに・・・ ② レジスタが表示 される. EFL に注目 ① 「デバッグ」 → 「ウインドウ」→「レジスタ」 23
EFL がフラグレジスタ 24
⑩ステップオーバーの操作を1回ずつ行いながら, ・プログラムカウンタ(黄色の矢印) ・フラフレジスタ(レジスタウインドウの中の EFL) の変化を確認しなさい. 「デバッグ」 → 「ステップオーバー」 (あるいは F10 キー) 25
⑪ 最後に,プログラム実行の再開の操作を行いなさ い.これで,デバッガーが終了する. 「デバッグ」 → 「続行」 26
⑫ 今度は,「age = 20;」の行を「age = 10;」に変 えて. ステップオーバーの操作を1回ずつ行いながら, ・プログラムカウンタ(黄色の矢印) ・フラフレジスタ(レジスタウインドウの中の EFL) の変化を確認しなさい. 27
Visual C++ の プログラム age = 20; if (age >= 12) p = 1800; else p = 500; こちらが 有効 無視 される age = 10; if (age >= 12) p = 1800; else p = 500; 無視 される こちらが 有効 28
この2行で「変数 age が12 未満のときだけジャンプせよ」 という意味 条件ジャンプ 29
必ずジャンプせよ という無条件ジャンプ命令 無条件ジャンプ 30