ca-7. データ転送命令と アドレッシングモード

1K 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

シェア

またはPlayer版

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

関連スライド

各ページのテキスト
1.

ca-7. データ転送命令と アドレッシングモード (コンピュータ・アーキテクチャ演習) URL: https://www.kkaneko.jp/cc/ca/index.html 金子邦彦 1

2.

アウトライン 7-1 データ転送命令 7-2 アドレッシングモード 7-3 配列 7-4 C/C++ の配列は,メモリにどのように格納され ているか 2

3.

7-1 データ転送命令 3

4.

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

5.

プログラムの例 5

6.

C++ 言語とアセンブリ言語 Visual C++ の プログラム アセンブリ言語 命令 オペランド 6

7.

データ転送命令とは 「データ転送」せよの命令 ・メモリからデータを読み出して,レジスタに書き込み ・レジスタからデータを読み出して,メモリに書き込み ・レジスタからデータを読み出して,別のレジスタに書き込み など メモリからレジスタ eax へ レジスタ eax からメモリへ アセンブリ言語のプログラム データ転送命令 mov 命令 が使用されている 7

8.

7-2 アドレッシングモード 8

9.

アドレッシングモードのバリエーション Visual C++ の プログラム アセンブリ言語 x のアドレス y のアドレス x のアドレス y のアドレス z のアドレス メモリへの書き込み, メモリからの読み出し を行う アドレッシングモード 9

10.

アドレッシングモードのバリエーション Visual C++ の プログラム アセンブリ言語 変数 x に 3 をセット 変数 y に 4 をセット 値を扱う アドレッシングモード 10

11.

アドレッシングモードのバリエーション Visual C++ の プログラム アセンブリ言語 結果を 変数 z に書き込む レジスタを扱う アドレッシングモード 11

12.

演習 次のプログラムを Visual Studio で実行し, 結果を確認しなさい ①レジスタEAXに値10をセット ②レジスタEAXに20を足しこむ ③レジスタEAXの値を,変数aのア ドレスに書き込む 「a = 30」 が表示されたら成功 12

13.

7-3 配列 13

14.

C/C++ での配列と繰り返し 繰り返す処理 i の値は 0, 1, 2, 3, 4 と変化し,全部済んだら終わる 14

15.

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

16.

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

17.

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

18.

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

19.

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

20.

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

22.

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

23.

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

24.

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

25.

7-4 C/C++ の配列は, メモリにどのように格納され ているか 25

26.

配列 数値 (10進数) 16 進数 80 → 50 00 00 00 60 → 3c 00 00 00 40 → 28 00 00 00 20 → 14 00 00 00 30 → 1e 00 00 00 ダンプリストの例 リトルエンディアンで, 4バイトの数値にコード化した場合の例 26

27.

7-4 配列 • C 言語や,C++ 言語の配列は,同じ型の要素の並 び. • コード化されて,メモリに格納されるとき, 要素が順にメモリに格納される 各要素のサイズは同じ 27

28.

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

29.

• 先ほどのプログラムをそのまま使う 29

30.

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

31.

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

32.

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

33.

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

34.

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

35.

• ローカルウインドウで配列 y の先頭アドレスを調 べなさい 「0x」が付いているの は16進数 y の先頭アドレスは,起動の たびに変化する可能性がある. 注意! 35

36.

• プログラムの中で配列 y の先頭アドレスがある ことを確認しなさい 「h」が付いているのは 16進数 36

37.

• ダンプリストを表示させなさい. ② メモリの中身がダンプ リスト形式で表示される ①「デバッグ」 → 「ウインドウ」 → 「メモリ」→「メモリ1」 37

38.

• 配列 y の先頭アドレスを, メモリウインドウの「アドレス」のところに 書き写して,Enter キーを押す 「0x00229150」のように 頭に 0x を付ける ① 配列 y の先頭ア ドレス 38

39.

• メモリウインドウに,配列 y の中身が表示される ので確認する 00 が並んでいる 39

40.

• ステップオーバーの操作を行いながら,メモリの 中身の変化を確認しなさい. 「デバッグ」 → 「ステップオーバー」 (あるいは F10 キー) 40

41.

• 10 進数にすると,80, 60, 40, 20, 30 である 16進数 10進数 50 80 3c 60 28 40 14 20 1e 30 41

42.

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

43.

配列の要素に値を格納するプログラム レジスタ EAXに値 4 をセットせよ レジスタ EAXの値 を3倍した値を ECXにセットせよ アセンブリ言語 EAX 4 ECX 12 レジスタ ECXの値 と 0EC8130h を足したアドレス に4を書き込め! 0EC8130h は 配列 a の先頭アドレス 43

44.

配列の要素に値を格納するプログラム Visual C++ では: a[3] = 4 EAX 4 ① EAX に 4をセット 1つの要素が4バイト 3倍 ECX 12 ③ ECXの値と, 配列 a の 先頭アドレスを足したア ドレスに 4 を書き込む メモリへの書き込み ② 3倍した値を ECXにセット 3番目の要素は12バイト先にある 44

45.

種々のアドレッシングモード b = a + 200; b = a + x; b = a + y[5]; b = a + y[i]; mov eax,dword ptr ds:[00348130h] add eax,0c8h mov eax,dword ptr ds:[00258130h] add eax,dword ptr ds:[258138h] mov eax,4 imul ecx,eax,5 mov edx,dword ptr ds:[1198130h] add edx,dword ptr ds:[ecx+1198138h] mov eax,dword ptr ds:[00048160h] mov ecx,dword ptr ds:[48130h] add ecx,dword ptr ds:[eax*4+48138h] 0c8h 変数 x のア ドレス y[5]があるア ドレス y[i]があるア ドレス 45