UP | HOME

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

課題内容

本課題では,以下について学習します.

  1. CPUが命令を実行していく過程と機械語の関係の概略
  2. MIPSシミュレータ xspim の使い方

Practice1-1: CPUと機械語の関係 (演習課題)

解答は,演習時間内に配布する用紙に記入して提出すること

以下の命令表を持った CPU がある.

命令 意味 説明
ADD A,B,C 01 A B C (A)+(B)→(C) A番地の値とB番地の値を加えC番地に格納
SUB A,B,C 02 A B C (A)-(B)→(C) A番地の値からB番地の値を減じC番地に格納
ADI A,X,C 03 A X C (A)+X→(C) A番地の値にXそのものを加えC番地に格納
SBI A,X,C 04 A X C (A)-X→(C) A番地の値からXそのものを減じC番地に格納
JNZ X,Y 05 X Y JUMP TO Y IF (X)!=0 X番地の値が0でないならY番地に分岐
HLT 06 HALT プログラムを停止する

このとき,以下のプログラムをメモリ中に格納して,0番地から実行する. このプログラムは,何を計算していることになるか. また,その結果は,どうやって確認できるか.

番地 ヒント
00 01 80 81 80 ADD SUM,COUNT,SUM
04 04 81 01 81 SBI COUNT,01,COUNT
08 05 81 00 JNZ COUNT,00
11 06 HLT
:    
80 00 SUMの中身
81 05 COUNTの中身

Practice1-2: xspim を利用したアセンブリプログラムの実行

前問と同様の動作をするMIPS CPU上のプログラムは,以下の通りである. このプログラムを MIPSシミュレータである SPIM (xspim) を利用して実行してみよ. 実行結果を確認するには,何を見ればよいかを考えて,結果を確認せよ.

      .text                  # text セグメントに配置する指定
      .align  2              # 4バイト境界に配置する指定

main:                        # main (ここから実行開始)
      move    $a0,$zero      # $a0 : SUM   = 0
      li      $v1,1          # $v1 : COUNT = 1
loop:
      addu    $a0,$a0,$v1    # SUM   += COUNT
      addu    $v1,$v1,1      # COUNT++
      slt     $v0,$v1,6      # $v0 = COUNT < 6 ? 1 : 0
      bnez    $v0,loop       # if ($v0 != 0) goto loop
      move    $t0,$a0        # $t0 = SUM
      j       $ra            # return

以下,実際の操作方法,

  1. 上記のアセンブラプログラムを practice1-1.s という名前で作成する.
  2. xspim コマンドを起動する.教育用計算機上では,

    $ xspim -mapped_io&
    

    のように入力して起動できる.

    xspim-image.png
  3. (load) のメニューから, practice1-1.s と入力, (assembly file) を押す.

    xspim-load.png これで,SPIM のメモリ中に, practice1-1.s が読み込まれる.

  4. 次に, (run) のメニューを選んで (ok) を押す.

    xspim-run.png すると,SPIMは,メモリ中のプログラムを実行する. 例では,一瞬で実行が終了するはずである.

また,SPIM (= xspim) の使用方法について,教科書A.9節 「SPIM」を参考に,以下の操作方法を試してみよ.

  1. ステップ実行
  2. ブレークポイント設定,解除
  3. 無限ループなどに陥った場合の強制中断
  4. プログラムを変更し,再び実行する

Author: Yoshinari Nomura

Emacs 27.1 (Org mode 9.3)