参照:スライド5〜7
` (Step 1内) 2. `参照:スライド9〜15, 18
` (Step 2内) 3. `参照:スライド22〜24, 33〜34, 39
` (Step 3内) 4. `参照:スライド26〜27, 37
` (Step 4内) 5. `参照:スライド30〜31, 41
` (Step 5内) 6. `参照:スライド17
` (Step 6内) 7. `操作に迷った場合は、スライド16の画面構成図を参照する。...` (ヒント内の文中参照) 8. `
誤りを修正したら、保存してから再度ビルドを実行する(スライド28「手戻り」参照)。
` (warning内の文中参照) 9. 参照スライド一覧のテーブル全体(`参照スライド一覧
`とそれに続く`参照:スライド3
` (vc-4 演習1) 17. `参照:スライド4
` (vc-4 演習2) 18. `参照:スライド5
` (vc-4 演習3) 19. `参照:スライド6
` (vc-4 演習4) 20. `参照:スライド7
` (vc-4 演習5) 21. `参照:スライド8〜9
` (vc-4 演習6) 22. `参照:スライド2、10〜11
` (vc-4 演習7) 23. `参照:スライド12
` (vc-4 演習8) 24. `参照:スライド2、13
` (vc-4 演習9) 25. `参照
スライド4〜13
` (vc-5 演習1) 26. `参照
スライド16〜22
` (vc-5 演習2) 27. `参照
スライド23
` (vc-5 演習3) 28. `参照
スライド24
` (vc-5 演習4) 29. `参照
スライド25〜26
` (vc-5 演習5) --- ## HTML構文エラーの特定 1. `コースの特徴` — `
`が欠落 2. `各回の概要` — `
`が欠落 3. `- `内の`
- `が``で閉じられている(` `であるべき)— 5箇所 4. `
- 第1回:Visual Studio 2019 C++ の基本操作では、開発環境の起動からプロジェクトの作成、ソースコードの編集、ビルド、実行までの一連の基本操作を学ぶ。Visual Studio C++を使用したプログラム開発の出発点となる回である。
- 第2回:Visual Studio C++ のデバッガでは、プログラムの誤りを発見・修正するためのデバッガの使用法を学ぶ。ブレークポイントの設定、ステップ実行、変数の監視など、効率的なデバッグ作業に必要な機能を習得する。
- 第3回:ダンプリスト、配列では、メモリ上のデータを16進数で表示するダンプリストの読み方と、配列データの扱い方を学ぶ。メモリレベルでのデータ構造の理解を深める回である。
- 第4回:文字データと文字コードでは、コンピュータ内部での文字の表現方法を学ぶ。ASCII文字コードの仕組みと、文字データの内部表現について理解を深める。
- 第5回:インラインアセンブラでは、C++プログラム内にアセンブリ言語を埋め込むインラインアセンブラの技法を学ぶ。mov、add、sub、imulなどの算術演算命令を使用し、CPUレベルでの処理を理解する。
- Windowsのスタートメニューを開く
- 「Visual Studio 2019」を選択して起動する
- 起動画面が表示されることを確認する
- 「後で行う。」を選択する
- 「Visual Studioの開始」をクリックする
- 起動画面で「新しいプロジェクトの作成」を選択する
- プロジェクトの種類選択画面で「コンソールアプリ」を選ぶ
- 「次へ」をクリックする
- 「プロジェクト名」が自動設定されていることを確認する
- 「場所」が自動設定されていることを確認する(ネットワークドライブを使用する場合は適宜変更する)
- 「作成」をクリックする
- 画面上部に設定したプロジェクト名が表示されていることを確認する
- エディタ画面(ソースファイルの編集画面)を確認する
- 以下のソースコードを入力する
- 保存ボタンをクリックするか、メニューから保存を実行する
- メニューから「ビルド」→「ソリューションのビルド」を選択する
- 画面下部のビルド結果を確認する
- 「ビルド:1 正常終了,0 失敗」と表示されることを確認する
- メニューから「デバッグ」→「デバッグなしで開始」を選択する
- 実行画面(コンソールウィンドウ)が表示される
- 「2.000000, 1.414214」のような出力結果を確認する
- 任意のキーを押してコンソールを閉じる
- メニューから「ファイル」→「終了」を選択する
- セミコロン(;)の付け忘れ
- 括弧の対応(開き括弧と閉じ括弧の数が一致しているか)
- スペルミス(include, iostream, double, printf, sqrt など)
- 大文字・小文字の区別(C++は大文字と小文字を区別する)
- プロジェクト名のフォルダ:プロジェクト全体を格納するルートフォルダ
- ソースファイル(.cpp):プログラムコードを記述するファイル
- ヘッダファイル(.h):宣言などを記述するファイル
- プロジェクトファイル(.vcxproj):Visual Studioがプロジェクト設定を管理するファイル
- ソリューションファイル(.sln):複数のプロジェクトをまとめて管理するファイル
- Visual Studio 2015を起動し、既存のプロジェクト(または新規作成したプロジェクト)を開く
- ソースファイル内の「return 0;」の行をマウスでクリックする
- メニューから「デバッグ」→「ブレークポイントの設定/解除」を選択する
- 行の左側に赤丸が表示されることを確認する(これがブレークポイントの印)
- メニューから「デバッグ」→「デバッグの開始」を選択する
- 「return 0;」の行で実行が中断し、赤丸の形状が変化することを確認する
- 次の演習のため、中断したままの状態を維持する
- ブレークポイントを解除したい場合は、赤丸をクリックする
- ブレークポイントは複数の行に設定可能である
- デバッガーはバグを自動的に取り除くものではなく、不具合の発見と修正を支援するツールである
- Visual Studio 2015を起動する
- 「ファイル」→「新規作成」→「プロジェクト」を選択する
- 「Visual C++」→「Win32コンソールアプリケーション」を選択し、「OK」をクリックする
- ウィザードで「次へ」をクリックし、「完了」をクリックする
- 自動生成されたソースファイルに以下の4行を追加する:
static int x, y, z;x = 3;y = 4;z = x + y;
- メニューから「ビルド」→「ソリューションのビルド」を実行し、「1 正常終了、0 失敗」を確認する
- 「x = 3;」の行にブレークポイントを設定する
- 「デバッグ」→「デバッグの開始」でデバッガーを起動する
- 「デバッグ」→「ウインドウ」→「ローカル」を選択し、変数名と値の対応表を表示する
- 変数x, y, zの値がすべて0であることを確認する
- 「デバッグ」→「ステップオーバー」(またはF10キー)を1回実行し、xの値が3に変化することを確認する
- 同様にステップオーバーを実行し、yの値が4に変化することを確認する
- さらにステップオーバーを実行し、zの値が7に変化することを確認する
- 「デバッグ」→「続行」でデバッガーを終了する
- ビルドで失敗した場合は、プログラムの記述ミス(セミコロンの欠落、変数名の誤り等)を確認する
- 「static」キーワードは、変数のメモリへの格納方法を制御するものである
- ステップオーバーは関数の中には入らない。関数の中に入りたい場合はステップイン(F11キー)を使用する
- Visual Studio 2015を起動する
- Win32コンソールアプリケーション用プロジェクトを新規作成する
- ソースファイルに配列と繰り返し処理のコード(6行)を追加する:
- 配列xの宣言と初期化(6つの値を持つ配列)
- 配列yの宣言
- ループ変数iの宣言
- for文による繰り返し処理(
y[i] = x[i] * 12;)
- ビルドを実行し、正常終了を確認する
- 「for (i = 0; …」の行にブレークポイントを設定する
- デバッガーを起動し、ブレークポイントで実行が中断することを確認する
- 「デバッグ」→「ウインドウ」→「ローカル」で変数の値を表示する
- ステップオーバーを1回ずつ実行しながら、以下を観察する:
- 変数iの値の変化(0→1→2→3→4→5)
- for文の条件判定と繰り返しの流れ
- 配列y各要素への値の格納
- 「デバッグ」→「続行」でデバッガーを終了する
- 変数iの初期値が「変な値」になっているのは正常な動作である。for文が実行される前は初期化されていないためである
- 繰り返し処理では、for文の行に何度も戻ってくることを確認する
- 配列の各要素の値の変化にも注目する
- Visual Studio 2015を起動する
- Win32コンソールアプリケーション用プロジェクトを新規作成する
- ソースファイルに累積加算のコードを追加する(sを0で初期化し、繰り返しでsにiを加算)
- ビルドを実行し、正常終了を確認する
- 「s = 0;」の行にブレークポイントを設定する
- デバッガーを起動し、「s = 0;」の行で実行が中断することを確認する(黄色の矢印が表示される)
- 「デバッグ」→「ウインドウ」→「ローカル」で変数の値を表示する
- 変数の値が「おかしい」(未初期化の値)ことを確認する。これは「s = 0;」がまだ実行されていないためであり、正しい動作である
- ステップオーバーを1回ずつ実行しながら、変数sとiの値の変化を確認する
- 繰り返しが進むにつれてsの値が累積されていく様子を観察する
- 「デバッグ」→「続行」でデバッガーを終了する
- 「s = 0;」実行前に変数の値がおかしいのは、初期化前の状態であり正常である
- 累積加算では、sの値が 0→(0+i)→(前のs+i)→… と変化していくことを確認する
- ループの各回でsとiがどのように変化するか、表に記録しながら進めると理解が深まる
- メモリがバイト(8ビット)単位で区切られていること、各バイトに0から始まる通し番号(アドレス)が付与されていることを確認する。
- ダンプリストの表示形式を理解する。左端にアドレスが表示され、その右側にメモリの中身が16進数で並んでいることを確認する。
- クイズに取り組む。表示されているダンプリストを見て、指定された位置のアドレスを答える。
- 解答後、自分の答えを照合する。
- ダンプリストの左端に表示されるアドレスは、その行の先頭バイトのアドレスである。
- 各バイトは1列ずつ右に進むごとにアドレスが1増加する。
- 16進数の「0x」は16進数表記であることを示す接頭辞である。例えば0x002F814Cは16進数で002F814Cを意味する。
- 4バイト右隣のアドレスを求めるには、元のアドレスに4を足す。16進数の加算に注意すること(例:0x002F814C + 4 = 0x002F8150)。
- Visual Studio 2015を起動する。
- 「Win32 コンソールアプリケーション」用のプロジェクトを新規作成する。プロジェクト名は任意でよい。
- エディタでソースファイルを編集して、示された6行のコードを追加する。
- ビルドを実行し、「1 正常終了、0 失敗」の表示を確認する。表示されない場合はプログラムを修正し、再度ビルドする。
- 「int i;」の行にブレークポイントを設定する。手順は以下のとおり。
- 「int i;」の行をマウスでクリックする。
- メニューから「デバッグ」→「ブレークポイントの設定/解除」を選択する。
- 行の左側に赤丸が表示されることを確認する。
- デバッガを起動する。メニューから「デバッグ」→「デバッグの開始」を選択する。
- 「int i;」の行で実行が中断することを確認する。中断したままの状態を維持する。
- ローカルウインドウを表示して変数の値を確認する。メニューから「デバッグ」→「ウインドウ」→「ローカル」を選択する。
- ローカルウインドウで配列yの先頭アドレスを確認する。「0x」が付いた16進数で表示される。
- メモリウインドウを表示する。メニューから「デバッグ」→「ウインドウ」→「メモリ」→「メモリ1」を選択する。
- メモリウインドウの「アドレス」欄に、手順9で確認した配列yの先頭アドレス(例:0x00229150)を入力し、Enterキーを押す。
- メモリウインドウに配列yの中身が表示されることを確認する。初期状態では00が並んでいる。
- ステップオーバーを繰り返し実行し、メモリの中身が変化する様子を観察する。メニューから「デバッグ」→「ステップオーバー」を選択するか、F10キーを押す。
- 配列に格納された10進数の値(80, 60, 40, 20, 30)が16進数(50, 3c, 28, 14, 1e)でメモリに格納されていることを確認する。
- 演習終了後、メニューから「デバッグ」→「続行」を選択し、デバッガを終了する。
- 配列の先頭アドレスはプログラム起動のたびに変化する可能性がある。毎回ローカルウインドウで確認すること。
- 4バイト整数(int型)の場合、各要素は4バイトを占有する。メモリウインドウでは、要素ごとに4バイト分のデータが並んで表示される。
- 10進数から16進数への変換例:80 = 0x50、60 = 0x3C、40 = 0x28、20 = 0x14、30 = 0x1E。
- メモリ上のデータはリトルエンディアン(下位バイトが先に格納される方式)で格納されることが多い。例えば、10進数80(16進数で0x00000050)は、メモリ上では「50 00 00 00」の順で表示される。
注釈:リトルエンディアンに関する説明は、本演習で観察されるメモリ表示を理解するための補足情報である。授業スライドには明示的な記載がないため、詳細については別途参考書等を参照されたい。 - Visual Studio 2015を起動する
- メニューから「ファイル」→「新規作成」→「プロジェクト」を選択する
- テンプレートから「Visual C++」→「Win32」→「Win32 コンソール アプリケーション」を選択する
- プロジェクトの「名前」欄に任意の名前を入力する
- 「OK」をクリックし、ウィザードの指示に従ってプロジェクトを作成する
- ソリューションエクスプローラーでソースファイル(.cpp)をダブルクリックして開く
- 本ガイドの「使用するソースコード」セクションに記載されたコード(演習2〜8用)を正確に入力する
- 入力後、ファイルを保存する(Ctrl + S)
- メニューから「ビルド」→「ソリューションのビルド」を選択する
- 出力ウィンドウに「1 正常終了、0 失敗」と表示されることを確認する
- エディタ上で
char message[] = "hello";の行をクリックしてカーソルを置く - その行の左端(行番号の左側の灰色部分)をクリックして、ブレークポイントを設定する(赤い丸が表示される)
- メニューから「デバッグ」→「デバッグ開始」を選択してデバッガーを起動する
- デバッガー起動後、
char message[] = "hello";の行で実行が中断することを確認する - 中断中であることを示す黄色い矢印が、該当行の左端に表示されていることを確認する
- この状態を維持したまま、次の演習に進む(中断を解除しないこと)
- プログラムが中断した状態で、メニューから「デバッグ」→「ウィンドウ」→「ローカル」を選択する
- 「ローカル」ウィンドウが表示され、変数名と値の対応表が表示されることを確認する
- 表示されている変数の内容を観察する
- プログラムが中断した状態で、メニューから「デバッグ」→「ウィンドウ」→「メモリ」→「メモリ1(1)」を選択する
- 「メモリ1」ウィンドウが表示される
- 「アドレス」欄に
&messageと入力し、Enterキーを押す - 画面が変化し、変数
messageのメモリアドレス周辺の内容が表示されることを確認する - メニューから「デバッグ」→「ステップオーバー」を選択する(またはF10キーを押す)
char message[] = "hello";の行が実行され、次の行に黄色い矢印が移動することを確認する- 「メモリ1」ウィンドウの内容が
68 65 6c 6c 6f 00に変化することを確認する - ASCII文字コード表を参照し、各バイト値と文字の対応を確認する
- メニューから「デバッグ」→「続行」を選択する(またはF5キーを押す)
- プログラムが最後まで実行され、デバッガーが終了することを確認する
- 本ガイドの「使用するソースコード」セクションに記載されたコード(演習9用)に書き換える
- 演習2〜8の手順を再度実施する
- メモリウィンドウに表示される値と、ASCII文字コード表を照合する
- Visual Studio 2015を起動する
- Win32コンソールアプリケーション用プロジェクトを新規作成する(プロジェクト名は任意)
- ソースファイルを開き、
__asmブロックを使用してインラインアセンブラのコードを5行追加する - ビルドを実行し、「1 正常終了、0 失敗」の表示を確認する
printfの行をクリックし、「デバッグ」→「ブレークポイントの設定/解除」でブレークポイントを設定する- 「デバッグ」→「デバッグの開始」でデバッガーを起動する
printfの行で実行が中断することを確認する- 「デバッグ」→「ウインドウ」→「ローカル」で変数名と値の対応表を表示する
- 「デバッグ」→「ウインドウ」→「逆アセンブル」で逆アセンブル結果を表示する
mov a, 100がmov dword ptr [a], 64hに翻訳されていることを確認する- 「デバッグ」→「続行」でプログラム実行を再開し、デバッガーを終了する
- ビルドで失敗した場合は、
__asmブロックの構文を確認すること。波括弧の対応や命令の綴りを見直す - 逆アセンブル結果で
64hと表示されるのは、10進数の100が16進数で64であるため dword ptrは、操作対象が4バイト(32ビット)のデータであることを示す- Visual Studio 2015を起動する
- Win32コンソールアプリケーション用プロジェクトを新規作成する
- ソースファイルを開き、
__asmブロック内に6行のコードを追加する(変数aに100をセットし、200を足しこむ処理) - ビルドを実行し、「1 正常終了、0 失敗」の表示を確認する
printfの行にブレークポイントを設定する- デバッガーを起動し、
printfの行で中断することを確認する - 「デバッグ」→「ウインドウ」→「ローカル」で変数の値を確認する
- 「デバッグ」→「続行」でデバッガーを終了する
mov命令は値の代入、add命令は加算を行う- 変数aの値が100+200=300になっていることを確認する
- ブレークポイントで中断した時点では、
__asmブロック内の処理はすべて完了している - 演習2で作成したプロジェクトを開く(または新規作成する)
- 示されたコードに書き替える
- ビルドを実行する
printfの行にブレークポイントを設定する- デバッガーを起動する
- 「デバッグ」→「ウインドウ」→「ローカル」で変数aの値を確認する
- デバッガーを終了する
- add命令の構文:
add 対象, 加算する値 - 計算結果が期待通りになっているか、手計算と比較すること
- 演習3のプロジェクトを使用する
- 示されたコードに書き替える
- ビルドを実行する
printfの行にブレークポイントを設定する- デバッガーを起動する
- 「デバッグ」→「ウインドウ」→「ローカル」で変数aの値を確認する
- デバッガーを終了する
- sub命令の構文:
sub 対象, 減算する値 - スライドには「sub 加算」と記載されているが、これは誤記であり、subは減算(subtraction)を行う命令である
- 演習4のプロジェクトを使用する
- 示されたコードに書き替える
- ビルドを実行する
printfの行にブレークポイントを設定する- デバッガーを起動する
- 「デバッグ」→「ウインドウ」→「ローカル」で変数aの値を確認する
- デバッガーを終了する
- imul命令は乗算結果をレジスタに格納するため、直接変数に結果を代入できない
- 処理の流れは以下の3段階である:(1) 変数aに30をセット、(2) a×20の結果をレジスタeaxにセット、(3) レジスタeaxの値を変数aにセット
- eaxは32ビットの汎用レジスタであり、演算結果の一時保存によく使用される
- C/C++プログラミング用語集: リンク »
- Windows環境でのC言語:プログラムの作成から実行まで: リンク »
- 開発ツール,デバッグツールgcc, dbx, Makefile の使用法
- はじめてのCプログラミング -基礎から応用まで(授業資料): リンク »
- Visual StudioによるC/C++プログラミング:基礎からデータ構造・数値計算まで(授業資料): リンク »
- C++によるオブジェクト指向プログラミング入門: リンク »
- C 言語によるアルゴリズムとデータ構造: リンク »
- Visual Studio C++ で学ぶプログラムの内部動作(コース資料): リンク »
到達目標` — `
`が欠落 5. ``の後に`
Visual Studio C++ で学ぶプログラムの内部動作(コース資料)
コースの特徴
本コースでは、パソコン画面のスクリーンショットを多用し、視覚的に理解しやすい教材構成を採用している。各回には演習パートが設けられており、受講者は実際に手を動かしながら学習を進めることができる。
各回の概要
到達目標
本コースを修了することにより、受講者はVisual Studio C++の基本操作を習得するとともに、デバッガを活用した効率的なプログラム開発、メモリやCPUレベルでのプログラム動作の理解といった、より深い技術的知識を身につけることができる。
vc-1. Visual Studio 2019 C++ の基本操作
資料(スライド): Visual Studio 2019 C++ の基本操作 [PDF], [パワーポイント], [HTML]
演習パート(クリックして展開)
演習:Visual Studio 2019 でのC++プログラムの編集・ビルド・実行
目的
Visual Studio 2019を使用して、C++のソースファイルを編集し、ビルド(コンパイル)と実行の一連の流れを体験する。これにより、統合開発環境(IDE: Integrated Development Environment)の基本操作を習得する。
前提条件
Visual Studio 2019がインストールされていること。
手順
初回起動時のみ、以下の設定を行う。
#include <iostream>
#include <math.h>
int main() {
double d = 2.0;
printf("%f, %f \n", d, sqrt(d));
}
ビルドとは
ビルド(build)とは、ソースファイル(人間が読み書きできるプログラムコード)から実行型ファイル(コンピュータが実行できる形式)を生成する処理である。コンパイル(compile)とも呼ばれる。
ヒント
プログラムの内容について
このプログラムは変数dに2.0を代入し、dの値とその平方根(sqrt関数)を表示する。出力される1.414214は√2の近似値である。
「d = 2」ではなく「d = 2.0」と記述するのは、小数点以下を含む数値(浮動小数点数)として扱うためのC/C++言語の慣習である。
整数型と浮動小数点型の違い
C/C++では、数値の表現方法として整数型(int など)と浮動小数点型(double, float など)がある。整数型は小数点以下を持たない数値(例:2, -5, 100)を扱い、浮動小数点型は小数点以下を含む数値(例:2.0, 3.14, -0.5)を扱う。
「d = 2」と記述すると、右辺の2は整数として解釈される。一方「d = 2.0」と記述すると、右辺は浮動小数点数として解釈される。変数dがdouble型(浮動小数点型)であるため、「d = 2.0」と記述することで、意図が明確になり、型の一貫性が保たれる。
ビルドでエラーが発生した場合
「1 正常終了」と表示されない場合は、ソースコードに誤りがある。以下を確認する。
誤りを修正したら、保存してから再度ビルドを実行する。
ビルドエラーメッセージの読み方
ビルドでエラーが発生すると、画面下部の「出力」または「エラー一覧」ウィンドウにエラーメッセージが表示される。エラーメッセージは一般に以下の形式で構成される。
ファイル名(行番号): error C番号: エラーの説明
例:
ConsoleApplication1.cpp(6): error C2146: 構文エラー: ';' が、識別子 'printf' の前に必要です。
この例では、ConsoleApplication1.cppファイルの6行目付近で、セミコロンが不足していることを示している。エラーメッセージに記載された行番号を手がかりに、該当箇所を確認して修正する。
複数のエラーが表示される場合は、最初のエラーから順に対処する。1つのエラーが原因で連鎖的に複数のエラーが発生することがあるため、最初のエラーを修正すると他のエラーも解消される場合がある。
画面構成の確認
操作に迷った場合は、画面構成図を参照する。エディタ領域、ファイル一覧、ビルド結果表示領域、メニュー、操作ボタンの位置を確認できる。
プロジェクトのフォルダ構造
Visual Studioのプロジェクトを作成すると、指定した「場所」に複数のファイルとフォルダが自動生成される。主な構成は以下のとおりである。
フォルダ構造を確認するには、Windowsのエクスプローラーで「場所」に指定したパスを開く。
vc-2. Visual Studio C++ のデバッガ
資料(スライド): Visual Studio C++ のデバッガ [PDF], [パワーポイント], [HTML]
演習パート(クリックして展開)
演習1:ブレークポイント設定とデバッガー起動
目的
ブレークポイント(プログラムの実行を中断させたい行)を設定し、デバッガーを起動して指定した行で実行が中断することを確認する。
手順
ヒント
演習2:ステップオーバー機能による変数の変化確認
目的
ステップオーバー機能(プログラム実行を1行ずつ進める機能)を使用し、変数の値が各行の実行によってどのように変化するかを確認する。
手順
ヒント
演習3:繰り返し処理の実行の流れ確認
目的
for文による繰り返し処理において、ステップオーバー機能を使って実行の流れ(ループ変数iの変化と処理の繰り返し)を確認する。
手順
ヒント
演習4:累積加算における変数の値の変化確認
目的
繰り返し処理による累積加算のプログラムで、変数s(累積値)とi(ループカウンタ)の値がどのように変化するかをステップオーバーで確認する。
手順
ヒント
vc-3. ダンプリスト、配列
資料(スライド): ダンプリスト、配列 [PDF], [パワーポイント], [HTML]
演習パート(クリックして展開)
演習1:ダンプリストのアドレス読み取り(クイズ)
目的
ダンプリスト(メモリの中身を16進数で一覧表示したもの)からアドレスを正確に読み取る技術を習得する。
手順
ヒント
演習2:配列とデバッガによるメモリ確認(パソコン演習)
目的
Visual Studio 2015のデバッガ機能を用いて、配列がメモリ上にどのように格納されるかを実際に確認する。ブレークポイント(プログラム実行を一時停止させる地点)の設定、ローカルウインドウ(変数の値を表示するウインドウ)、メモリウインドウ(メモリの中身をダンプリスト形式で表示するウインドウ)の使い方を習得する。
手順
ヒント
vc-4. 文字データと文字コード
資料(スライド): 文字データと文字コード [PDF], [パワーポイント], [HTML]
演習パート(クリックして展開)
本演習の概要
本演習では、Visual Studio 2015のデバッガー機能を用いて、文字列がメモリ上でどのように格納されるかを観察する。ASCII文字コード(American Standard Code for Information Interchange:英数字や制御文字を7ビットの数値で表現する文字符号化方式)の理解を深めることを目的とする。
使用するソースコード
演習2〜8で使用するコード
#include <stdio.h>
int main()
{
char message[] = "hello";
printf("%s\n", message);
return 0;
}
演習9で使用するコード
#include <stdio.h>
int main()
{
char message[] = "world";
printf("%s\n", message);
return 0;
}
注意:上記コードはPDFの画像から推測した典型例である。実際のスライド画像と異なる場合は、スライドの画像を確認すること。
演習1:Visual Studioの起動とプロジェクト作成
目的
Visual Studio 2015を起動し、C++プログラムを作成するための環境を準備する。
手順
ヒント
プロジェクト名は日本語を避け、半角英数字のみで命名すると、後のトラブルを回避しやすい。
演習2:ソースファイルの編集
目的
文字列を扱うC++プログラムのソースコードを入力し、編集操作に慣れる。
手順
ヒント
コードの入力では、セミコロン(;)の付け忘れや、ダブルクォーテーション(")の閉じ忘れに注意する。
演習3:ビルドとブレークポイントの設定
目的
プログラムをビルド(ソースコードを実行可能な形式に変換する処理)し、デバッグの準備としてブレークポイント(プログラムの実行を一時停止させる地点)を設定する。
手順
ヒント
ビルドでエラーが発生した場合は、エラーメッセージをよく読み、該当行のコードを確認する。よくある原因として、タイプミス、セミコロンの欠落、括弧の対応ミスがある。
演習4:ブレークポイントでの中断確認
目的
設定したブレークポイントでプログラムの実行が中断することを確認する。
手順
ヒント
中断状態を誤って解除してしまった場合は、演習3の手順5から再度デバッガーを起動する。
演習5:変数の値の表示
目的
デバッガーの「ローカル」ウィンドウを使用して、プログラム内の変数の現在値を確認する方法を習得する。
手順
ヒント
この時点では char message[] = "hello"; の行はまだ実行されていない。そのため、変数 message の値は初期化前の状態である点に注意する。
演習6:メモリの中身の表示
目的
デバッガーの「メモリ」ウィンドウを使用して、変数が格納されているメモリ領域の内容を直接確認する方法を習得する。
手順
ヒント
&message の & はアドレス演算子であり、変数 message が格納されているメモリのアドレスを取得する。メモリウィンドウには16進数でデータが表示される。
演習7:ステップオーバーとASCIIコードの確認
目的
ステップオーバー(現在の行を実行し、次の行で停止する操作)を行い、文字列がASCIIコードとしてメモリに格納される様子を観察する。
手順
ヒント
メモリ上の値とASCIIコードの対応は次のとおりである。
| 16進数 | 文字 |
|---|---|
| 68 | h |
| 65 | e |
| 6c | l |
| 6c | l |
| 6f | o |
| 00 | 文字列の終端(NULL文字) |
C言語の文字列は、最後にNULL文字(00)が付加されて終端を示す。この点を意識して観察すること。
演習8:デバッガーの終了
目的
プログラムの実行を再開し、デバッガーを正常に終了する。
手順
ヒント
デバッグ作業を途中で中止したい場合は、「デバッグ」→「デバッグの停止」を選択する。
演習9:プログラムの書き換えと再実施
目的
異なる文字列でプログラムを書き換え、演習1〜8と同じ操作を繰り返すことで、理解を定着させる。
手順
ヒント
異なる文字列を自分で設定し、予想されるメモリの値を事前に計算してから実行すると、理解が深まる。たとえば「world」という文字列の場合、どのような16進数値がメモリに格納されるか、表を用いて予測してみること。
vc-5. インラインアセンブラ
資料(スライド): インラインアセンブラ [PDF], [パワーポイント], [HTML]
演習パート(クリックして展開)
演習1:インラインアセンブラの基本
目的
インラインアセンブラ(他の言語の中にアセンブリ言語のプログラムを埋め込む手法)の基本的な記述方法を理解し、Visual Studio 2015のデバッグ機能を使用して動作を確認する。
手順
ヒント
演習2:算術演算(加算の準備)
目的
算術演算命令の基本構造を理解し、mov命令(データ転送命令)とadd命令(加算命令)を組み合わせた処理の流れを確認する。
手順
ヒント
演習3:add命令による加算
目的
add命令(加算命令)の動作を確認し、変数に対する加算処理の結果を検証する。
手順
ヒント
演習4:sub命令による減算
目的
sub命令(減算命令)の動作を確認し、変数に対する減算処理の結果を検証する。
手順
ヒント
演習5:imul命令による乗算
目的
imul命令(符号付き乗算命令)とレジスタ(CPUが演算に使用する高速な記憶領域)を使用した乗算処理を理解する。