トップ 差分 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

C言語とアセンブリ言語・マシン語

プログラムはどうやって動いているのか?

コンピュータのプログラムがどうのように動作するかを実査に確認する。

 ファイルの中身を確認してみる

バイナリエディタでテキストファイル実行ファイルの中身を確認してみる。

  1. バイナリエディタを次のリンクからダウンロードする。バイナリエディタBzのホームページ
  2. ダウンロードしたファイルを開き、そこにあるフォルダを適当な場所にコピーする。
  3. VC++でHello Worldアプリケーションを作る。
  4. 作成したプログラムのソースファイルと実行ファイルをバイナリエディタで開いてみる。

 確認用プログラム

以下のそれぞれのプログラムを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;
}

 演習

実習を通して下記の問題を考えよ。

  1. ファイルの中身はどうなっているのか
  2. ファイルの内容を16進数で表示することを何というか
  3. アドレスバスとは何か
  4. データバスとは何か
  5. Cなどの高水準言語が実行できるまでの手順を示せ
  6. アセンブリ言語マシン語はどんな関係にあるか
  7. CPUが理解できる言語は何か
  8. レジスタとは何か
  9. リトルエンディアン、ビッグエンディアンとは何か
  10. VC++でプログラムのデバッグはどうすればよいか
  11. Cプログラムとアセンブリ言語とのプログラムの対応
  12. プログラムが実行されるとレジスタメモリの値がどう変化するか
  13. int型の変数をshortやcharに変更すると何が変わるか
  14. 各プログラムのメモリマップを描く
  15. 各プログラムの各変数メモリのどこにその領域が確保されているか
  16. VC++のデバッグモードで表示されるアセンブリ言語のコードを最適化できれば最適化せよ
  17. 関数引数にはどうやって値を渡しているか
  18. スタックとは何か
  19. ポインター型の変数は通常の変数とどう異なっているか