877 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-5. レジスタ (コンピュータ・アーキテクチャ演習) URL: https://www.kkaneko.jp/cc/ca/index.html 金子邦彦 1
アウトライン 5-1 プロセッサの仕組み 5-2 レジスタ 5-3 Pentium系列プロセッサのレジスタ 5-4 レジスタを使うプログラムの例 5-5 Visual Studio でレジスタ表示 2
5-1 プロセッサの仕組み 3
プロセッサ(CPU)の仕組み アドレスバス プロセッサ データバス データ等の記 憶, スタックの管 理, 比較の結果の 保存 レジスタ 算術演算,論理 演算などの実行 算術演算ユニット プログラムカウンタ (インストラクションポインタ) 次に実行すべき R/W プログラム命令の メモリアドレスを記憶 メモリ プログラム命令の解読 制御系 命令デコーダ 命令レジスタ 4
プロセッサ • メモリにあるプログラムやデータが読み出されて, プロセッサで処理される • プロセッサがメモリに書き込みを行うこともある 5
5-2 レジスタ 6
5-2 レジスタとは • レジスタは,プロセッサの内部にあるデータやプ ログラムの格納場所 • レジスタには名前(レジスタ名)がある 7
データ格納場所の種類 レジスタ CPUの 内部 レジスタ名 キャッシュメ 一般のメモリ ハードディス モリ ク CPUの内部 CPUの外 CPUの外 アドレス アドレス 超高速 高速 低速 セクタ番号, シリンダ番号 超低速 極小サイズ 小サイズ 大サイズ 超大サイズ 8
5-3 Pentium系列プロセッサの レジスタ 9
Pentium系列プロセッサのレジスタ • 代表的なものは • EAX, EBX, ECX, EDX, • ESI, EDI, 汎用レジスタ • EBP, ベースポインタ • ESP, スタックポインタ • EFLAGS, フラグレジスタ • CS, DS, ES, SS, FS, GS, • EIP セグメントレジスタ プログラムカウンタ 名前 種類 レジスタの名前がいろいろあるので, 種類分けする 10
Pentium系列プロセッサのレジスタの大きさ Pentium 系列プロセッサでは, レジスタのサイズは32ビットまたは16ビット 代表的なものは • EAX, EBX, ECX, EDX, • ESI, EDI, • EBP, それぞれ32ビット長 (例) 04001234H ※ 16進8桁 • ESP, • EFLAGS, • CS, DS, ES, SS, FS, GS それぞれ16ビット長 (例) 3000H ※ 16進4桁 11
フラグレジスタ eflags (縮めて EFL) 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 32 ビット長 12
5-4 レジスタを使うプログラ ムの例 13
レジスタを使う例 アセンブリ言語のプログラム Visual Studio の C++ プログラム b = a + 20 mov add mov eax,dword ptr [a] eax,14h dword ptr [b],eax 14
レジスタの値の変化 次のプログラムで,レジスタの値が変化する int i; for (i = 0; i < 5; i++) { printf("%d\n", i); } 15
レジスタの値の変化を見る レジスタ eax の値の変 化が右側に表示される 16
結果の例. レジスタ eax は,最初は初期化されて いない(以前の値が残っている) 17
逆アセンブルしてみると, 「i < 5」かどうかを調べるのに レジスタ eax を使っている. 最初の表示の時点では,まだ「i < 5」 かどうかを調べていないので, レジスタ eax は初期化されていない 18
5-5 Visual Studio でレジスタ 表示 19
レジスタを使っているのは? ここで, レジスタを使用! 20
「z = x + y;」部分で行われていること レジスタ EAX を使用 メモリ レジスタ EAX 3 変数 x の値で 上書きされる ① 転送 3 変数 x 用 4 変数 y 用 変数 z 用 21
「z = x + y;」部分で行われていること レジスタ EAX を使用 メモリ レジスタ EAX 7 変数 y の値が 足しこまれる ② 足しこみ 3 変数 x 用 4 変数 y 用 変数 z 用 22
「z = x + y;」部分で行われていること レジスタ EAX を使用 メモリ レジスタ EAX 7 ③ 転送 3 変数 x 用 4 変数 y 用 7 変数 z 用 レジスタ EAX の値で 上書きされる 23
レジスタを使っているのは? eax は レジスタ名 Visual C++ の プログラム アセンブリ言語 同じ意味 同じ意味 同じ意味 命令 命令が対象とする相手である オペランド 24
演習 • Visual Studio を起動しなさい • Visual Studio で,Win32 コンソールアプリケー ション用プロジェクトを新規作成しなさい プロジェクトの「名前」は何でもよい 25
• Visual Studioのエディタを使って,ソースファイ ルを編集しなさい 4行追加 26
• ビルドしなさい.ビルドのあと「1 0 失敗」の表示を確認しなさい 正常終了, → 表示されなければ,プログラムのミスを自分で 確認し,修正して,ビルドをやり直す 27
• Visual Studioで「x=3;」の行に,ブレークポイン トを設定しなさい ① 「 x=3;」の行をマ ウスでクリック ② 「デバッグ」→ 「ブレークポイントの 設定/解除」 ③ ブレークポイン トが設定されるので 確認. 赤丸がブレークポイ ントの印 28
• Visual Studioで,デバッガーを起動しなさい. 「デバッグ」 → 「デバッグ開始」 • 「x=3;」の行で,実行が中断することを確認しな さい • あとで使うので,中断したままにしておくこと 「x=3;」の行で実行が 中断している 29
• 「x=3;」の行で,実行が中断した状態で,逆アセ ンブルを行いなさい. ① 「デバッグ」→ 「ウイン ドウ」→「逆アセンブル」 ② 逆アセンブルの結果が表示 される 30
• 逆アセンブルの結果で,レジスタ名 eax を確認し なさい レジスタ名 eax の確認! 元の C++ プログラム 31
• 「x = 3;」の行で,実行が中断した状態で,レジス タの中身を表示させなさい.手順は次の通り. デバッガーを起動済みで, プログラムの実行が中断し ているときに・・・ ② レジスタが表示 される. ① 「デバッグ」 → 「ウインドウ」→「レジスタ」 32
• ステップオーバーの操作を1回ずつ行いながら, レジスタ eax の値の変化を確認しなさい. 「デバッグ」 → 「ステップオーバー」 (あるいは F10 キー) 33
• 最後に,プログラム実行の再開の操作を行いなさ い.これで,デバッガーが終了する. 「デバッグ」 → 「続行」 34