プログラムはどうやって動いているのか?
コンピュータのプログラムがどうのように動作するかを実査に確認する。
ファイルの中身を確認してみる
バイナリエディタでテキストファイル実行ファイルの中身を確認してみる。
- バイナリエディタを次のリンクからダウンロードする。バイナリエディタBzのホームページ
- ダウンロードしたファイルを開き、そこにあるフォルダを適当な場所にコピーする。
- VC++でHello Worldアプリケーションを作る。
- 作成したプログラムのソースファイルと実行ファイルをバイナリエディタで開いてみる。
確認用プログラム
以下のそれぞれのプログラムをVC++で入力し、デバッグする。
加算
#include "stdafx.h" #include <stdio.h> int main(int argc, char* argv[]) { int A, B, C; A = 10; B = 20; C = A + B; printf("%d + %d = %d\n", A, B, C); return 0; }
forループ
#include "stdafx.h" #include <stdio.h> int main(int argc, char* argv[]) { int i, sum = 0; for(i = 1;i <= 10;i++) { sum+= i; } printf("合計=%d\n", sum); return 0; }
whileループ
#include "stdafx.h" #include <stdio.h> int main(int argc, char* argv[]) { int i, sum = 0; i = 1; while(i <= 10){ sum += i; i++; } printf("合計=%d\n", sum); return 0; }
配列
#include "stdafx.h" int main(int argc, char* argv[]) { int A[10]; int i; for(i = 0; i < 10; i++){ A[i] = 0; } return 0; }
関数
#include "stdafx.h" #include <stdio.h> int func1(int i) { int a; a = i * 100; return a; } int main(int argc, char* argv[]) { int i,x; for(i = 1; i <= 10; i++) { x = func1(i); printf("%d * 100 = %d\n", i, x); } return 0; }
ポインター
#include "stdafx.h" int main(int argc, char* argv[]) { int X = 10; int Y = 20; int *ip; ip = &X; Y = *ip; *ip = 0; return 0; }
#include "stdafx.h" int main(int argc, char* argv[]) { int a[10]; int *pa; int i; pa = &a[0]; for(i = 0;i < 10; i++){ *(pa + i) = 200 + i; } return 0; }
#include "stdafx.h" int main(int argc, char* argv[]) { char am[] = "Hello World!!"; char *pm = "Hello World!!"; return 0; }
演習
実習を通して下記の問題を考えよ。
- ファイルの中身はどうなっているのか
- ファイルの内容を16進数で表示することを何というか
- アドレスバスとは何か
- データバスとは何か
- Cなどの高水準言語が実行できるまでの手順を示せ
- アセンブリ言語とマシン語はどんな関係にあるか
- CPUが理解できる言語は何か
- レジスタとは何か
- リトルエンディアン、ビッグエンディアンとは何か
- VC++でプログラムのデバッグはどうすればよいか
- Cプログラムとアセンブリ言語とのプログラムの対応
- プログラムが実行されるとレジスタやメモリの値がどう変化するか
- int型の変数をshortやcharに変更すると何が変わるか
- 各プログラムのメモリマップを描く
- 各プログラムの各変数はメモリのどこにその領域が確保されているか
- VC++のデバッグモードで表示されるアセンブリ言語のコードを最適化できれば最適化せよ
- 関数の引数にはどうやって値を渡しているか
- スタックとは何か
- ポインター型の変数は通常の変数とどう異なっているか