Report1 - 2024年度 システムプログラミング
課題内容
以下の課題についてレポートせよ. プログラムは,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
レポートに関する注意
- 体裁に関しては,レポートの体裁と章立て を参照
- 一般的なレポートの書き方については, LaTeXによるレポート作成の基本 を参照のこと.
- レポート締切は,教員の指示に従うこと. レポート内容について,口頭にて試問を行う.
- レポートは, Moodle のレポート提出ページからアップロードし, 試問時には参照できるように持参してもらう.
以上