UP | HOME

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

課題内容

アセンブラによる配列の実現について理解します.

Practice5-1: 100個の素数を求める

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

test_prime(n)
nが素数であれば,1を返し,そうでなければ0を返す.
main()
整数を順々に繰り返し調べて,素数であるかどうかを判定する.得られた素数を最初から100個までプリントする.

C言語で記述した例は以下の通り:

int test_prime(int n)
{
  int i;
  for (i = 2; i < n; i++){
    if (n % i == 0)
      return 0;
  }
  return 1;
}

int main()
{
  int match = 0, n = 2;
  while (match < 100){
    if (test_prime(n) == 1){
      print_int(n);
      print_string(" ");
      match++;
    }
    n++;
  }
  print_string("\n");
}

実行例は,以下の通り(改行は調整してある):

  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

ヒント

解答例

Practice5-2: 配列の利用

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

C言語で記述した例は以下の通り:

int primes[100];
int main()
{
  int match = 0, n = 2;
  while (match < 100){
    if (test_prime(n) == 1){
      primes[match++] = n;
    }
    n++;
  }
  for (;;){
    print_string("> ");
    print_int(primes[read_int() - 1]);
    print_string("\n");
  }
}

実行例は,以下の通り:

> 15
47
> 100
541

解説

解答例

Author: Yoshinari Nomura

Emacs 27.1 (Org mode 9.3)