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-6. プログラムカウンタ (コンピュータ・アーキテクチャ演習) URL: https://www.kkaneko.jp/cc/ca/index.html 金子邦彦 1
アウトライン 6-1 プログラムカウンタの振る舞い 6-2 Visual Studio でプログラムカウンタの表示 6-3 命令実行サイクル 2
6-1 プログラムカウンタの振 る舞い 3
6-1 プログラムカウンタとは • プログラムカウンタには,次に実行すべき命令の アドレスが入っている 4
変数 age の値が 12 以上の ときの経路 分岐 変数 age の値が 12 未満の ときの経路 5
現在実行中 プログラム カウンタ 分岐 ◇変数 age の値 が12以上なら 薄青の経路 ◇12未満なら 薄赤の経路 6
現在実行中 プログラム カウンタ 分岐 ◇変数 age の値 が12以上なら 薄青の経路 ◇12未満なら 薄赤の経路 7
プログラム カウンタ 現在実行中 分岐 ◇変数 age の値 が12以上なら 薄青の経路 ◇12未満なら 薄赤の経路 8
age の値が12以上のとき 現在実行中 プログラム カウンタ 分岐 ◇変数 age の値 が12以上なら 薄青の経路 ◇12未満なら 薄赤の経路 9
age の値が12以上のとき 現在実行中 分岐 ◇変数 age の値 が12以上なら 薄青の経路 ◇12未満なら 薄赤の経路 10
age の値が12以上のとき プログラム カウンタ 分岐 ◇変数 age の値 が12以上なら 薄青の経路 ◇12未満なら 薄赤の経路 ジャンプ 11
age の値が12以上のとき プログラム 現在実行中カウンタ 分岐 ◇変数 age の値 が12以上なら 薄青の経路 ◇12未満なら 薄赤の経路 合流 12
age の値が12未満のとき 現在実行中 分岐 ◇変数 age の値 が12以上なら プログラム 薄青の経路 カウンタ ◇12未満なら 薄赤の経路 合流 13
age の値が12未満のとき 分岐 ◇変数 age の値 が12以上なら 薄青の経路 現在実行中 ◇12未満なら 薄赤の経路 プログラム カウンタ 合流 14
age の値が12未満のとき 分岐 ◇変数 age の値 が12以上なら 薄青の経路 ◇12未満なら 薄赤の経路 プログラム カウンタ 現在実行中 合流 15
age の値が12未満のとき プログラム カウンタ 分岐 ◇変数 age の値 が12以上なら 薄青の経路 ◇12未満なら 薄赤の経路 現在実行中 合流 16
age の値が12未満のとき プログラム 現在実行中 カウンタ 分岐 ◇変数 age の値 が12以上なら 薄青の経路 ◇12未満なら 薄赤の経路 合流 17
6-2 Visual Studio で プログラムカウンタの表示 18
プログラムカウンタの表示操作 デバッガーを起動済みで, プログラムの実行が中断し ているときに・・・ ① 「デバッグ」 → 「ウインドウ」→「レジスタ」 ② レジスタが表示される 19
演習 • Visual Studio を起動しなさい • Visual Studio で,Win32 コンソールアプリケー ション用プロジェクトを新規作成しなさい プロジェクトの「名前」は何でもよい 20
• Visual Studioのエディタを使って,ソースファイ ルを編集しなさい 追加 21
• ビルドしなさい.ビルドのあと「1 0 失敗」の表示を確認しなさい 正常終了, → 表示されなければ,プログラムのミスを自分で 確認し,修正して,ビルドをやり直す 22
• Visual Studioで「age = 20;」の行に,ブレー クポイントを設定しなさい 赤丸がブレークポイント の印
• Visual Studioで,デバッガーを起動しなさい. 「デバッグ」 → 「デバッグ開始」 • 「age = 20;」の行で,実行が中断することを確認 しなさい • あとで使うので,中断したままにしておくこと 黄色の 矢印 「age = 20;」の行で実行が 中断している 24
• 「age = 20;」の行で,実行が中断した状態で,逆 アセンブルを行いなさい. ① 「デバッグ」→ 「ウインド ウ」→「逆アセンブル」 ② 逆アセンブルの結果が表示される 25
• 「age = 20;」の行で,実行が中断した状態で,レ ジスタの中身を表示させなさい.手順は次の通り. EIP はプログラムカウンタ デバッガーを起動済みで, プログラムの実行が中断し ているときに・・・ ② レジスタが表示 される. EIP に注目 ① 「デバッグ」 → 「ウインドウ」→「レジスタ」 26
• ステップオーバーの操作を1回ずつ行いながら, レジスタウインドウの中の EIP の変化を確認しな さい. 「デバッグ」 → 「ステップオーバー」 (あるいは F10 キー) 27
アセンブリ言語の中で: 赤丸: ブレークポイント 黄色矢印: プログラムカウンタ EIP は プログラムカウンタ 28
• 最後に,プログラム実行の再開の操作を行いなさ い.これで,デバッガーが終了する. 「デバッグ」 → 「続行」 29
演習 • 「age = 20;」の行を「age = 10;」に変えて,今の 手順を繰り返しなさい. • ジャンプの様子が変わるので確認しなさい 30
演習 • 次のプログラムでプログラムカウンタの値の変化 の様子を確認しなさい. 31
5-3 命令実行サイクル 32
Visual C++ 言語とアセンブリ言語 Visual C++ の プログラム アセンブリ言語 いまから,この3行を図解で説明 33
プロセッサの仕組みの概要 34 アドレスバス CPU データバス データ等の記 憶, スタックの管 理, 比較の結果の 保存 レジスタ 算術演算,論理 演算などの実行 算術演算ユニット プログラムカウンタ (インストラクションポインタ) 次に実行すべき R/W プログラム命令の メモリアドレスを記憶 プログラム命令の解読 制御系 命令デコーダ 命令レジスタ メモリ
アドレスバス CPU データバス xと プログラムカウ ンタ Program Counter + y を足して レジスタ Registers 算術演算ユニット Arithmetic and Logic Unit 命令長 z に入れたい 制御系 Control Unit 命令デコーダ 命令レジスタ Instruction DecoderInstruction Register R/W ※この図では,メモリ の1マスは4バイト メモリ
CPU アドレスバス データバス 算術演算ユニット レジスタ Registers Arithmetic and Logic Unit メモリ
アドレス レジスタ に格納 メモリをオンに
アドレス データが転送された レジスタ に格納 メモリをオンに
アドレス 2つのデータが 算術演算ユニットに 与えられる メモリをオンに
結果がレジスタに入る
アドレス メモリをオンに. データを書き込む