UP | HOME

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

課題内容

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

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

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: qtspim を利用したアセンブリプログラムの実行

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

      .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

以下,実際の操作方法,

アセンブリプログラムファイルを作成

上記のアセンブラプログラムを practice1-1.s という名前で作成する.

qtspim コマンドの起動

教育用計算機上では,Practice2 までの課題は,

qtspim -mapped_io&

のように入力して起動する.これは,SPIM がメモリマップド方式で IO を行うという意味であるが,これらの意味は後に講義の中触れられる.

一方,Practice3 以降課題では,以下のように起動する.

qtspim -nomapped_io&

起動直後の画面は,以下の通り.

qtspim-image.png.png

Console という別のウィンドウも同時に表示されているはずである. これは,SPIM からの画面出力やキーボードからの入力を与える場合に利用する.

qtspim-image-console.png

アセンブリプログラムファイルのロード

File メニューから,Load File,もしくは Reinitialize and Load File を選択 (アイコンバーのアイコンでもよい) し, 作成したファイル (practice1-1.s) を SPIM に読み込む.

qtspim-file-menu.png

ロードしたアセンブリプログラムは,Text タブで確認できる. どこにそれがあるか確認して欲しい

また,プログラムの記述ミスなどで正しくロードできない場合もある. qtspim の下部を占めている領域に表示されるメッセージに注意すること. 下記の例は,main が定義されていないというエラーメッセージである.

qtspim-load-error.png

アセンブリプログラムの実行

Simulator メニューから Run/Continue を選択すると,プログラムが実行される.

qtspim-simulator-menu.png

SPIMは,メモリ中のプログラムを実行する.今回の例では,一瞬で実行が終了するはずである. 実行結果を確認するには,どこを見ればよいか考えて欲しい.

その他の機能

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

また,Simulator メニューにあるその他の機能を試してみよ.

  • 実行中のプログラムの中断 (Pause)
  • 実行中のプログラムの強制終了 (Stop)
  • 1行づつ状態を確認しながら実行 (Single Step)

さらに,実行を指定した箇所で中断する機能 (ブレークポイント) を試してみよ.

qtspim-breakpoint-menu.png
  1. ロードしたプログラムの目的の行で右クリック (上図のコンテキストメニューが出現)
  2. Set Breakpoint で中断箇所を指定
  3. Run でプログラムを実行
  4. ブレークポイント設定箇所でプログラムが自動的に中断 (Pause)

ブレークポイントによって,プログラムの特定の行で中断できる. 中断後,メモリやレジスタ (変数) の値を見たり,Single Step で 1行づつ実行を進めての様子を確認したりできるので,デバッグや実行の理解に役立つ.

プログラムの再実行

アセンブリプログラムはメモリを書換えながら動くので,一度実行を終えた後に再び実行しようとすると, メモリの内容が初期状態とは異なる場合がある.したがってプログラムを二度目に実行する場合は, たとえプログラムの変更がなくとも,以下の操作が必要になる.

  1. メモリとレジスタの初期化
  2. 初期化したメモリに再びプログラムのロード
  3. 実行

File メニューにある Reinitialize and Load File は,上記1,2 を一度に行う操作である.

プログラムの実行に先立って必ず初期化が必要なので,通常は Load File は使わない. Load File をあえて使うケースは,1つのプログラムが 2つ以上のファイルで構成されていて, 両方をロードしなければ実行できない場合である.その場合は, 2つ目以降のファイルは Load File でロードする.

メモリマップドIOの切替

qtspim の起動方法として,qtspim -mapped_io&qtspim -nomapped_io& があるが, 起動後に qtspim のメニューからこれらの状態を確認/変更するには, Simulator→Settings→MIPS→Enable Mapped IO で on/off すればよい.

qtspim-simulator-menu.png
qtspim-simulator-settings.png

Author: Yoshinari Nomura

Emacs 27.1 (Org mode 9.3)