2016年度CPU実験B班の1stアーキテクチャFELIS用シミュレータ。
$ mkdir build; cd $_
$ cmake ..
$ makeリンカエラーを起したときは、もう一回cmake ..からやり直せば通ります
(make時にコード生成しているため)。
cmake 時に NO_ASSERTオプションをつけると、プログラムカウンタやメモリの範囲チェックを省略し、若干高速化します。
$ cmake -DNO_ASSERT=On ..simulatorは次のように、-fオプションに機械語ファイルを渡して実行します。
$ ./simulator -f test.bin他にもいくつかオプションがあります。
-d-- 逆アセンブル結果を標準出力に吐いて終了します。-i [file]--IN命令で読むファイルを指定します。-s [int]-- メモリ量を指定します。int32_tの配列をこの要素数だけ確保します。デフォルト値は1,000,000です。-r--HALT命令まで自動ですすめます。到達後、qで終了します。-q---rが指定されているとき、qの入力を待たずに自動で終了します。-m-- 出力する統計情報に、メモリの情報を含めます。-n-- 巻き戻し機能を無効にします。-rのときは自動でこの設定が適用されます。-o [file]--OUT命令の出力先ファイル名を指定します。デフォルト値はout.logです。
-rオプションを指定しない場合、インタラクティブに実行できます。
画面は水平に四分割され、
- 命令数や実行時間
- レジスタの値
- プログラムカウンタ付近の命令列と逆アセンブル結果
- 反転しているのが、次に実行する命令
- コマンドライン
を表示しています。
逆アセンブル結果の形式は、
- Type R -- mnemonic, rs, rt, rd, shamt
- Type I -- mnemonic, rs, rt, immediate(符号拡張したもの。カッコ内に符号拡張前のものを16進数で。)
- Type J -- mnemonic, addr
となっています。
コマンドラインは、以下の入力を受け付けます。
run|r-- HALT命令またはbreakpointまで進めます。reset-- 初期状態にリセットします。(break|b) [int] <int>-- 指定したプログラムカウンタにbreakpointをはります。自然数を指定すると、その回数だけ命令を実行した後breakします。pb-- breakpointを表示します。db [int]-- 指定したbreakpointを削除します。pm [int]-- 指定したインデックスのメモリの状態を表示します。(step|s) <int>-- 命令をひとつ実行します。自然数を指定すると、その命令数だけ実行します。prev|p-- 命令の実行をひとつ巻き戻します。log|l-- その時点での統計情報を出力します。quit|q-- 終了します。help|h-- ヘルプを表示します。
HALT命令が実行されると、以下の統計情報が出力されます。
call_cnt.logに、動的命令数と、プログラムカウンタごとの呼ばれた回数。instruction.logに、命令ごとの呼ばれた回数。register.logに、最終的なレジスタの状態。memory.logに、最終的なメモリの状態。-mオプションが指定されているときのみ。memory_access_cnt.logに、メモリのワードごとのアクセス回数。-mオプションが指定されているときのみ。
