Practice1 - 2024年度 システムプログラミング
課題内容
本課題では,以下について学習します.
- CPUが命令を実行していく過程と機械語の関係の概略
- 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&
起動直後の画面は,以下の通り.

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

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

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

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

SPIMは,メモリ中のプログラムを実行する.今回の例では,一瞬で実行が終了するはずである. 実行結果を確認するには,どこを見ればよいか考えて欲しい.
その他の機能
SPIM (= spim) について,教科書A.9節 「SPIM」を参考にして以下の操作方法を試してみよ.
また,Simulator メニューにあるその他の機能を試してみよ.
- 実行中のプログラムの中断 (Pause)
- 実行中のプログラムの強制終了 (Stop)
- 1行づつ状態を確認しながら実行 (Single Step)
さらに,実行を指定した箇所で中断する機能 (ブレークポイント) を試してみよ.

- ロードしたプログラムの目的の行で右クリック (上図のコンテキストメニューが出現)
- Set Breakpoint で中断箇所を指定
- Run でプログラムを実行
- ブレークポイント設定箇所でプログラムが自動的に中断 (Pause)
ブレークポイントによって,プログラムの特定の行で中断できる. 中断後,メモリやレジスタ (変数) の値を見たり,Single Step で 1行づつ実行を進めての様子を確認したりできるので,デバッグや実行の理解に役立つ.
プログラムの再実行
アセンブリプログラムはメモリを書換えながら動くので,一度実行を終えた後に再び実行しようとすると, メモリの内容が初期状態とは異なる場合がある.したがってプログラムを二度目に実行する場合は, たとえプログラムの変更がなくとも,以下の操作が必要になる.
- メモリとレジスタの初期化
- 初期化したメモリに再びプログラムのロード
- 実行
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 すればよい.

