UP | HOME

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

課題内容

以下の課題についてレポートせよ. プログラムは,MIPSアセンブリ言語で記述し,SPIMを用いて動作を確認すること.

1-1

教科書A.8節 「入力と出力」に示されている方法と, A.9節 最後「システムコール」に示されている方法のそれぞれで "Hello World" を表示せよ.両者の方式を比較し考察せよ.

1-2

アセンブリ言語中で使用する .data.text および .align とは何か解説せよ. 下記コード中の 9行目の .data がない場合,どうなるかについて考察せよ.

 1:         .text
 2:         .align 2
 3: 
 4: _print_data:
 5:         la      $a0, ghost
 6:         lw      $a0, 0($a0)
 7:         li      $v0, 1
 8: 
 9:         .data
10:         .align 2
11: ghost:
12:         .word 12
13: 
14:         .text
15:         syscall
16:         j       $ra
17: 
18: main:
19:         subu    $sp, $sp, 24
20:         sw      $ra, 16($sp)
21:         jal     _print_data
22:         lw      $ra, 16($sp)
23:         addu    $sp, $sp, 24
24:         j       $ra

1-3

教科書A.6節 「手続き呼出し規約」に従って,再帰関数 fact を実装せよ. (以降の課題においては,この規約に全て従うこと) fact をC言語で記述した場合は,以下のようになるであろう.

 1: main()
 2: {
 3:   print_string("The factorial of 10 is ");
 4:   print_int(fact(10));
 5:   print_string("\n");
 6: }
 7: 
 8: int fact(int n)
 9: {
10:   if (n < 1)
11:     return 1;
12:   else
13:     return n * fact(n - 1);
14: }

1-4

素数を最初から100番目まで求めて表示するMIPSのアセンブリ言語プログラムを作成してテストせよ. その際,素数を求めるために下記の2つのルーチンを作成すること.

関数名 概要
test_prime(n) nが素数なら1,そうでなければ0を返す
main() 整数を順々に素数判定し,100個プリント

C言語で記述したプログラム例:

 1: int test_prime(int n)
 2: {
 3:   int i;
 4:   for (i = 2; i < n; i++){
 5:     if (n % i == 0)
 6:       return 0;
 7:   }
 8:   return 1;
 9: }
10: 
11: int main()
12: {
13:   int match = 0, n = 2;
14:   while (match < 100){
15:     if (test_prime(n) == 1){
16:       print_int(n);
17:       print_string(" ");
18:       match++;
19:     }
20:     n++;
21:   }
22:   print_string("\n");
23: }

実行結果(行を適当に折り返している):

  2   3   5   7  11  13  17  19  23  29
 31  37  41  43  47  53  59  61  67  71
 73  79  83  89  97 101 103 107 109 113
127 131 137 139 149 151 157 163 167 173
179 181 191 193 197 199 211 223 227 229
233 239 241 251 257 263 269 271 277 281
283 293 307 311 313 317 331 337 347 349
353 359 367 373 379 383 389 397 401 409
419 421 431 433 439 443 449 457 461 463
467 479 487 491 499 503 509 521 523 541

1-5

素数を最初から100番目まで求めて表示するMIPSのアセンブリ言語プログラムを作成してテストせよ. ただし,配列に実行結果を保存するように main 部分を改造し, ユーザの入力によって任意の番目の配列要素を表示可能にせよ.

C言語で記述したプログラム例:

 1: int primes[100];
 2: int main()
 3: {
 4:   int match = 0, n = 2;
 5:   while (match < 100){
 6:     if (test_prime(n) == 1){
 7:       primes[match++] = n;
 8:     }
 9:     n++;
10:   }
11:   for (;;){
12:     print_string("> ");
13:     print_int(primes[read_int() - 1]);
14:     print_string("\n");
15:   }
16: }

実行例:

> 15
47
> 100
541

レポートに関する注意

以上

Author: Yoshinari Nomura

Emacs 27.1 (Org mode 9.3)