649 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-8. 算術演算命令 (コンピュータ・アーキテクチャ演習) URL: https://www.kkaneko.jp/cc/ca/index.html 金子邦彦 1
アウトライン 8-1 算術演算の例 8-2 算術演算命令 2
8-1 算術演算の例 3
足し算 add の例 アセンブリ言語のプログラム a に 100 をセット a に 200 を足しこむ 実行結果の例 4
演習 • Visual Studio を起動しなさい • Visual Studio で,Win32 コンソールアプリケー ション用プロジェクトを新規作成しなさい プロジェクトの「名前」は何でもよい 5
• Visual Studioのエディタを使って,ソースファイ ルを編集しなさい 6行追加 6
• ビルドしなさい.ビルドのあと「1 0 失敗」の表示を確認しなさい 正常終了, → 表示されなければ,プログラムのミスを自分で 確認し,修正して,ビルドをやり直す 7
• Visual Studioで「printf」の行に,ブレークポイン トを設定しなさい ① 「 printf」の行をマウ スでクリック ② 「デバッグ」→「ブレー クポイントの設定/解除」 ③ ブレークポイントが 設定されるので確認. 赤丸がブレークポイント の印 8
• Visual Studioで,デバッガーを起動しなさい. 「デバッグ」 → 「デバッグ開始」 • 「printf」の行で,実行が中断することを確認しな さい • あとで使うので,中断したままにしておくこと 「printf」の行で実行が 中断している 9
• 「printf」の行で,実行が中断した状態で,変数の 値を表示させなさい.手順は次の通り. ② 変数名と値の対応表が 表示される ①「デバッグ」 → 「ウインドウ」 → 「ローカル」 10
• 最後に,プログラム実行の再開の操作を行いなさ い.これで,デバッガーが終了する. 「デバッグ」 → 「続行」 11
• 次のように書き替えて,同じ手順を繰り返しなさ い. そして,変数 a の値を確認しなさい add 加算 12
• 次のように書き替えて,同じ手順を繰り返しなさ い. そして,変数 a の値を確認しなさい sub 加算 13
• 次のように書き替えて,同じ手順を繰り返しなさ い. そして,変数 a の値を確認しなさい imul 乗算 次ページに解説 14
アセンブリ言語の プログラム ① a に 30 をセット ② a × 20 の結果を, レジスタ eax にセット ③ a にレジスタ eax の 値をセット 15
8-2 算術演算命令 16
算術演算命令とは • 数に関する各種の演算を行う命令 加算 減算 乗算 除算 算術シフト など 17
プロセッサの中の算術演算ユニット アドレスバス CPU データバス データ等の記 憶, スタックの管 理, 比較の結果の 保存 算術演算,論理 演算などの実行 算術演算 ユニット レジスタ プログラムカウンタ (インストラクションポインタ) 次に実行すべき プログラム命令の メモリアドレスを 記憶 R/W メモリ プログラム命令の解読 制御系 命令デコーダ 命令レジスタ 18
Pentium 系列プロセッサでの算術演算の例 Visual C++ アセンブリ言語 a = a + 100; add eax,64h a = a – 100; sub eax,64h a = a * 100; imul eax,dword ptr ds:[0C08130h],64h a = a / 100; mov ecx,64h idiv eax,ecx a は整数の変数 19
Pentium 系列プロセッサでの算術演算の例 Visual C++ アセンブリ言語 a = a + 100; add eax,64h a = a – 100; sub eax,64h a = a * 100; imul eax,dword ptr ds:[0C08130h],64h a = a / 100; mov ecx,64h idiv eax,ecx a は整数の変数 20
加算 Visual C++ の プログラム アセンブリ言語 同じ意味 21
減算 Visual C++ の プログラム アセンブリ言語 同じ意味 22
乗算 Visual C++ の プログラム アセンブリ言語 同じ意味 IMUL は独特. 第2オペランドと第3オペランドを 乗算して,第1オペランドに格納 23
除算 Visual C++ の プログラム アセンブリ言語 同じ意味 Pentium 系列プロセッサで の除算は,割った余りを扱う ための準備が必要で, プログラムが長くなる 24
演習 • Visual Studio を起動しなさい • Visual Studio で,Win32 コンソールアプリケー ション用プロジェクトを新規作成しなさい プロジェクトの「名前」は何でもよい 25
• Visual Studioのエディタを使って,ソースファイ ルを編集しなさい 4行追加 26
• ビルドしなさい.ビルドのあと「1 0 失敗」の表示を確認しなさい 正常終了, → 表示されなければ,プログラムのミスを自分で 確認し,修正して,ビルドをやり直す 27
• Visual Studioで「printf」の行に,ブレークポイン トを設定しなさい ※ 設定されていないときは,下のように操作して設定する ① 「 printf」の行をマウ スでクリック ② 「デバッグ」→「ブレー クポイントの設定/解除」 ③ ブレークポイントが 設定されるので確認. 赤丸がブレークポイント の印 28
• Visual Studioで,デバッガーを起動しなさい. 「デバッグ」 → 「デバッグ開始」 • 「printf」の行で,実行が中断することを確認しな さい • あとで使うので,中断したままにしておくこと 「printf」の行で実行が 中断している 29
• 「printf」の行で,実行が中断した状態で,変数の 値を表示させなさい.手順は次の通り. ② 変数名と値の対応表が 表示される ①「デバッグ」 → 「ウインドウ」 → 「ローカル」 30
• 「printf」の行で,実行が中断した状態で,逆アセ ンブルを行いなさい. ① 「デバッグ」→ 「ウインド ウ」→「逆アセンブル」 ② 逆アセンブルの結果が表示される 31
• 逆アセンブルの結果で,「a = a + 100」のところ にある「add」を確認しなさい 32
• 次のように書き替えて,同じ手順を繰り返しなさ い. • 逆アセンブルで「a = a - 10」のところの sub を確 認しなさい. 33
• 次のように書き替えて,同じ手順を繰り返しなさ い. • 逆アセンブルで「a = a * 40」のところの imul を 確認しなさい. 34
• 次のように書き替えて,同じ手順を繰り返しなさ い. • 逆アセンブルで「a = a / 5」のところの idiv を確 認しなさい. 35
• 最後に,プログラム実行の再開の操作を行いなさ い.これで,デバッガーが終了する. 「デバッグ」 → 「続行」 36