UP | HOME

Practice7 - 2023年度 システムプログラミング

課題内容

C言語における配列とポインタ,autoとstaticの違いについて, アセンブラの観点から学習します.

Practice7

以下のプログラムを MIPS 用のコンパイラでアセンブリ言語に変換した 結果をもとに,以下の各問についてレポートを作成せよ. file.c を file.s に変換する方法は以下の通り.

$ spim-gcc file.c

Practice7-1: 配列とポインタ,autoとstaticの違い

以下のプログラム report2-1.c をコンパイルした結果 report2-1.s をもとに, auto変数とstatic変数の違い,ポインタと配列の違いについてレポートせよ.

 1: int primes_stat[10];
 2: 
 3: char * string_ptr   = "ABCDEFG";
 4: char   string_ary[] = "ABCDEFG";
 5: 
 6: void print_var(char *name, int val)
 7: {
 8:   print_string(name);
 9:   print_string(" = ");
10:   print_int(val);
11:   print_string("\n");
12: }
13: 
14: main()
15: {
16:   int primes_auto[10];
17: 
18:   primes_stat[0] = 2;
19:   primes_auto[0] = 3;
20: 
21:   print_var("primes_stat[0]", primes_stat[0]);
22:   print_var("primes_auto[0]", primes_auto[0]);
23: }

例えば,下記01行目で宣言されている変数は,static(静的)変数, 一方,05行目で宣言されている変数は,auto(自動)変数であるという.

 1: int primes_stat[10];
 2: 
 3: main()
 4: {
 5:   int primes_auto[10];
 6: 
 7:   primes_stat[0] = 2;
 8:   primes_auto[0] = 3;
 9: 
10:   print_int(primes_auto[0]);
11:   print_int(primes_stat[0]);
12: }
13: 

static変数は,以下の特徴を持っている.

  • プログラムの開始から終了まで,値を保持しつづける.

一方,auto 変数は,以下の特徴を持っている.

  • 関数の中で宣言され,その関数の実行開始時から終了時までの間,その値を保持する.

この特徴の違いは,アセンブリ言語コード内でどのような記述の違いとして 生じているのかを調べてみるとよい.

解説

また,C言語では, string_ptrstring_ary は,ほぼ同様に扱えるといえる. しかし,たとえば,両者の宣言後に, string_ptr = pointer; のような代入は可能であるが, string_ary には代入ができない. (string_ary[n] にはもちろん代入が可能). この両者の性質の違いは, アセンブリ言語コード内でのどのような違いとなって表れているかについて考察するとよいであろう.

そのためには,例題のファイルをコンパイルしてアセンブリ言語コードを眺めるだけではなく, 自分がC言語で書いたプログラムをコンパイラがどうアセンブリ言語に変換するかを予想し, 実際の結果と比べてみることが重要である.

Author: Yoshinari Nomura

Emacs 27.1 (Org mode 9.3)