ca-4. アセンブリ言語

>100 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-4. アセンブリ言語 (コンピュータ・アーキテクチャ演習) URL: https://www.kkaneko.jp/cc/ca/index.html 金子邦彦 1

2.

アウトライン 4-1 アセンブリ言語とは 4-2 逆アセンブル 4-3 Visual Studio のデバッガー 4-4 変数のアドレスの確認 2

3.

4-1 アセンブリ言語とは 3

4.

4-1 アセンブリ言語とは • アセンブリ言語とは人間が理解しやすいように, マシン語(機械語)を翻訳した言語 • アセンブリ言語の命令と,マシン語の命令が,ほ ぼ 1 対 1 に対応 実行型ファイルの例 アセンブリ言語の例 4

5.

Pentium 系列プロセッサでの アセンブリ言語の主な命令 種類 データ転送と 実効アドレス 算術演算 論理演算 比較 ジャンプ(分 岐) サブルーチン 命令 MOV 意味 ロード,ストア,プッシュ, データ転送 ※ ポップ 実効アドレスのロード LEA 加算 ADD 減算 SUB 乗算 IMUL 除算 IDIV SAR, SAL 算術シフト 論理積 AND 論理和 OR SHR, SHL 論理シフト 比較 CMP AND による比較 TEST 無条件ジャンプ(無条件分岐) JMP 条件ジャンプ(条件分岐) J?? サブルーチン呼び出し(サブルーチンコール) CALL サブルーチンからの復帰 RET 5

6.

4-2 逆アセンブル 6

7.

逆アセンブル マシン語をアセンブリ言語に翻訳すること 逆アセンブル ビルド C言語などの プログラミング言語 マシン語 アセンブリ言語 7

8.

Visual Studioでの逆アセンブル手順 ② アセンブリ言語が表示され る デバッガーを起動済みで, プログラムの実行が中断し ているときに・・・ ① 「デバッグ」 → 「ウインドウ」 →「逆アセンブル」 表示を閉じたいときは,「x」 をクリック 8

9.

逆アセンブルの結果の例 元のマシン語での アドレス 命令 アセンブリ言語によるプログラム 9

10.

アセンブル • アセンブリ言語を • マシン語に翻訳すること • (逆アセンブルの逆) マシン語による プログラム アセンブリ言語による プログラム 10

11.

4-3 Visual Studio の デバッガー 11

12.

デバッガー • デバッガーとは、プログラムの不具合(バグ)の 発見や修正を支援するソフトウェアのこと ※ バグを自動的に取り除いてくれるわけではない 主な機能 ◆ ブレークポイント機能: プログラムの実行中断 ◆ トレース機能: プログラム実行中に変数の値などを表示 12

13.

Visual Studio でのブレークポイント設定手順 赤丸 ① 「return 0;」の行を マウスでクリック ② 「デバッグ」→ 「ブレークポイント の設定/解除」 ブレークポイントとは、 プログラムの実行を中断 させたい行.複数設定可 ③ ブレークポイン トが設定されるの で確認 ブレークポイントを解除したい ときは赤丸をクリック ※ 同様の操作で、ブレークポ イントの設定もできる 13

14.

Visual Studio でのデバッガー起動手順 ① 「デバッグ」 → 「デバッグの開始」 ブレークポイントが設定され た状態で、デバッガーを起動 しようとしている 形が変化! これは、プログ ラムの実行が、ここで中断し ていることを示す 14

15.

デバッガーのステップオーバー機能 デバッガーのステップオーバー機能とは、 ブレークポイントで、プログラム実行が中 断しているときに、プログラム実行を1行 進めること 15

16.

ステップオーバー機能の用途例 • 変数の値の変化 ※ 変数名と値の対応表 変数 x の値が 0 から 3 に変化 • メモリ中のデータの変化 ※ ダンプリスト形式 • プロセッサのレジスタ内のデータの変化 ※ レジスタ名と値の対応 16

17.

ブレークポイントで中断されたプログラム実 行を再開する手順 実行がここで 中断している 「デバッグ」→ 「続行」 17

18.

変数の値の変化 この行で, x の値は 3 に変化 この行で, y の値は 4 に変化 この行で, z の値は 7 に変化 ※ 「static int x, y, z;」の「static」は、変数 x, y, z のメモリへの格納法を コントロールするキーワード 18

19.

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

20.

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

21.

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

22.

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

23.

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

24.

• 「x=3;」の行で,実行が中断した状態で,変数の 値を表示させなさい.手順は次の通り. ② 変数名と値の対応表が 表示される ①「デバッグ」 → 「ウインドウ」 → 「ローカル」 ※ 次ページに拡大図 24

25.

「x=3;」は 未実行であることを確認! 25

26.

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

27.

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

28.

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

29.

4-4 変数のアドレスの確認 29

30.

• ソースファイルをそのまま使う. ←そのまま使う 30

31.

• ブレークポイントの設定もそのまま使う. • 「x = 3;」の行にブレークポイントが設定されてい ること再確認しておく 赤丸がブレークポイントの印

32.

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

33.

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

34.

逆アセンブルの結果の見方 元の Visual C++ プログラム プログラムで読み書きする メモリのアドレス Visual C++ に対応した アセンブリ言語プログラム 34

35.

• 「x = 3;」の直下に、x のアドレスが表示されてい るので確認しなさい.後で使う。 例) アドレスは 0289138h 35

36.

• 「x = 3;」の行で、実行が中断した状態で、メモリ の中身を表示させなさい.手順は次の通り. ② メモリの中身がダンプ リスト形式で表示される ①「デバッグ」 → 「ウインドウ」 → 「メモリ」→「メモリ1」 36

37.

• 「アドレス」のところに「0289138h」のように記 入。「0289138h」は、手順 6 で調べた値を転記. 末尾に「h」 x y z 変数 x, y, z の値はすべて0 ③ アドレスのところに、x の アドレスを書き、末尾に「h」を 付けて Enter キーを押す ④ メモリの中身が表示される 「x = 3;」は未実行で ることを確認! あ 37

38.

• 1回だけステップオーバーの操作を行い、変数 x の値が 3 に変化することを確認しなさい. x y z 変数 x の値が 3 に変化! 「デバッグ」 → 「ステップオーバー」 (あるいは F10 キー) 「x = 3;」が実行された 38

39.

• もう1回だけステップオーバーの操作を行い、変 数 y の値が 4 に変化することを確認しなさい. x y z 変数 y の値が 4 に変化! 「デバッグ」 → 「ステップオーバー」 (あるいは F10 キー) 「y = 4;」が実行された 39

40.

• さらに3回、ステップオーバーの操作を行い、変 数 z の値が 7 に変化することを確認しなさい. x y z 変数 z の値が 7 に変化! 「デバッグ」 → 「ステップオーバー」 (あるいは F10 キー) 「z = x + y;」が実行された 40

41.

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

42.

アセンブリ言語の中のメモリアドレス • プログラム 変数 x のメモリア ドレス 変数 y のメモリア ドレス 変数 x のメモリア ドレス 変数 y のメモリア ドレス 変数 z のメモリア ドレス 42

43.

C++ 言語とアセンブリ言語 Visual C++ の プログラム アセンブリ言語 同じ意味 同じ意味 同じ意味 命令 命令が対象とする相手である オペランド 43

44.

C++ 言語とアセンブリ言語 Visual C++ の プログラム アセンブリ言語 x のアドレス y のアドレス x のアドレス y のアドレス z のアドレス 44

45.

C++ 言語とアセンブリ言語 Visual C++ の プログラム アセンブリ言語 変数 x に 3 をセット 変数 y に 4 をセット 変数 x を読み出す 変数 y を読み出して 足し算 結果を 変数 z に書き込む 45