ca-5. レジスタ

196 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

シェア

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

各ページのテキスト
1.

ca-5. レジスタ (コンピュータ・アーキテクチャ演習) URL: https://www.kkaneko.jp/cc/ca/index.html 金子邦彦 1

2.

アウトライン 5-1 プロセッサの仕組み 5-2 レジスタ 5-3 Pentium系列プロセッサのレジスタ 5-4 レジスタを使うプログラムの例 5-5 Visual Studio でレジスタ表示 2

3.

5-1 プロセッサの仕組み 3

4.

プロセッサ(CPU)の仕組み アドレスバス プロセッサ データバス データ等の記 憶, スタックの管 理, 比較の結果の 保存 レジスタ 算術演算,論理 演算などの実行 算術演算ユニット プログラムカウンタ (インストラクションポインタ) 次に実行すべき R/W プログラム命令の メモリアドレスを記憶 メモリ プログラム命令の解読 制御系 命令デコーダ 命令レジスタ 4

5.

プロセッサ • メモリにあるプログラムやデータが読み出されて, プロセッサで処理される • プロセッサがメモリに書き込みを行うこともある 5

6.

5-2 レジスタ 6

7.

5-2 レジスタとは • レジスタは,プロセッサの内部にあるデータやプ ログラムの格納場所 • レジスタには名前(レジスタ名)がある 7

8.

データ格納場所の種類 レジスタ CPUの 内部 レジスタ名 キャッシュメ 一般のメモリ ハードディス モリ ク CPUの内部 CPUの外 CPUの外 アドレス アドレス 超高速 高速 低速 セクタ番号, シリンダ番号 超低速 極小サイズ 小サイズ 大サイズ 超大サイズ 8

9.

5-3 Pentium系列プロセッサの レジスタ 9

10.

Pentium系列プロセッサのレジスタ • 代表的なものは • EAX, EBX, ECX, EDX, • ESI, EDI, 汎用レジスタ • EBP, ベースポインタ • ESP, スタックポインタ • EFLAGS, フラグレジスタ • CS, DS, ES, SS, FS, GS, • EIP セグメントレジスタ プログラムカウンタ 名前 種類 レジスタの名前がいろいろあるので, 種類分けする 10

11.

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

12.

フラグレジスタ 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

13.

5-4 レジスタを使うプログラ ムの例 13

14.

レジスタを使う例 アセンブリ言語のプログラム Visual Studio の C++ プログラム b = a + 20 mov add mov eax,dword ptr [a] eax,14h dword ptr [b],eax 14

15.

レジスタの値の変化 次のプログラムで,レジスタの値が変化する int i; for (i = 0; i < 5; i++) { printf("%d\n", i); } 15

16.

レジスタの値の変化を見る レジスタ eax の値の変 化が右側に表示される 16

17.

結果の例. レジスタ eax は,最初は初期化されて いない(以前の値が残っている) 17

18.

逆アセンブルしてみると, 「i < 5」かどうかを調べるのに レジスタ eax を使っている. 最初の表示の時点では,まだ「i < 5」 かどうかを調べていないので, レジスタ eax は初期化されていない 18

19.

5-5 Visual Studio でレジスタ 表示 19

20.

レジスタを使っているのは? ここで, レジスタを使用! 20

21.

「z = x + y;」部分で行われていること レジスタ EAX を使用 メモリ レジスタ EAX 3 変数 x の値で 上書きされる ① 転送 3 変数 x 用 4 変数 y 用 変数 z 用 21

22.

「z = x + y;」部分で行われていること レジスタ EAX を使用 メモリ レジスタ EAX 7 変数 y の値が 足しこまれる ② 足しこみ 3 変数 x 用 4 変数 y 用 変数 z 用 22

23.

「z = x + y;」部分で行われていること レジスタ EAX を使用 メモリ レジスタ EAX 7 ③ 転送 3 変数 x 用 4 変数 y 用 7 変数 z 用 レジスタ EAX の値で 上書きされる 23

24.

レジスタを使っているのは? eax は レジスタ名 Visual C++ の プログラム アセンブリ言語 同じ意味 同じ意味 同じ意味 命令 命令が対象とする相手である オペランド 24

25.

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

26.

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

27.

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

28.

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

29.

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

30.

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

31.

• 逆アセンブルの結果で,レジスタ名 eax を確認し なさい レジスタ名 eax の確認! 元の C++ プログラム 31

32.

• 「x = 3;」の行で,実行が中断した状態で,レジス タの中身を表示させなさい.手順は次の通り. デバッガーを起動済みで, プログラムの実行が中断し ているときに・・・ ② レジスタが表示 される. ① 「デバッグ」 → 「ウインドウ」→「レジスタ」 32

33.

• ステップオーバーの操作を1回ずつ行いながら, レジスタ eax の値の変化を確認しなさい. 「デバッグ」 → 「ステップオーバー」 (あるいは F10 キー) 33

34.

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