= SPIMの使用法および例題 = == 演習の目的 == * 命令レベルシミュレータに慣れること * MIPSのアセンブラ命令の使い方を理解すること * 今後の課題で使用するプログラムを作成すること 今回の演習ではMIPSプロセッサのアセンブラを用いて簡単なプログラミングを行います。 このプログラムを動作させるために、SPIMシミュレータを用いて、実際に正しく動作しているかどうかを確認します。 ここで作成したプログラムはあとで設計するMIPSプロセッサで実行させるテストプログラムになります。 == シミュレータのドキュメント == == 留意点 1 == 以下の表に示された以外の命令は使わないこと。 これ以外の命令を使うと、後半の演習で設計するMIPSプロセッサでは動作しません。ただし、他の命令に置き換えられる疑似命令は使用できます。 例えば la 命令は ori 命令に置き換えられるので使用できます。 レジスタの指定は、$0から$31でも、$zero,$v0,$v1,...でも構いません。 指定があるもの(スタックポインタ,リターンアドレスなど)は、指定通りに使ってください。 以下の課題において、一時的にレジスタを利用する場合は、$8から$15と$24, $25(これらは$t0 - $t9としてもアクセス可能)を使用します。 $1はアセンブラが使用するので、プログラムでは使用しないでください。 == 留意点 2 == シミュレーションはステップ実行で行うこと。方法については演習の時間に説明します。 == 留意点 3 == 後半の演習で設計するMIPSプロセッサでは、システムコールを実装しないので、exit システムコールは利用できません。 プログラムの最後で停止させたいときは、自分自身にジャンプさせ無限ループさせるようなコードを挿入します。 例: {{{ exit: j exit }}} = 単純な代入文 = 定数の代入文はor immediate命令とstore word命令の組み合わせで実現できます。 例えばC言語のコード {{{ A = 15; }}} は、擬似的なアセンブリプログラム {{{ $8 = 15; A = $8 }}} に置き換えることができます。 各行を実行可能な命令に置き換えると: {{{ ori $8, $0, 15 sw $8, A }}} のようなプログラムに置き換えることができます. == 考察事項 == * この2つのアセンブラ命令でA=15が正しく実現できているか考えなさい。 * なぜ$0が使われるのか? * この方法で扱える代入文の右辺の定数の範囲を考えなさい。 * 符号付き32bitの範囲の定数の代入文を実装する方法を考えなさい。 == メモリの初期化 == 代入文「A = 15;」は、Aへの代入としてプログラム開始から最初に実行され、一度しか実行されない場合 {{{ .data A: .word 15 }}} とすることで、アセンブリプログラムによるメモリ領域の初期化によっても実現できます。 しかし、この初期化を含んだプログラムをサブルーチンに用いる場合、一回目の実行でAの値が変更されてしまうと、 2回目以降の呼び出しにおいてAは15以外の値を持つ可能性があります。 この様な場合、上記のようにori命令とsw命令の組み合わせで代入文を実現します。 = 例題1 =