命令セットシミュレータ

命令セットシミュレータ （めいれい-、英: Instruction set simulator, ISS）とは、コンピュータ（プロセッサ）のシミュレータ（エミュレータ）のモデルのひとつで、命令セットレベルのシミュレーションを行うものである。ISS は通例高級言語でプログラムされており、シミュレートするアーキテクチャの命令を読み込み、プロセッサのレジスタを表現する内部変数の状態を維持して命令レベルでの模倣を行う。
命令のシミュレーション とは、以下のいずれかを目的として導入される方法論である。
命令シミュレータの実装.
ISS は、ソフトウェアエンジニアやプログラマが開発対象のハードウェアを入手する前にプログラムをデバッグできるようにするため、それ自体デバッガとして、またはデバッガと共に提供されることが多い。GNUデバッガはこうした ISS を組み込んだデバッガの一つである。ISS はタイマーや割り込み、シリアルポートや一般的なI/O ポートなど、マイクロコントローラ全体の動きを模倣するための擬似的な周辺回路と結合されている場合もある。
基本的な命令のシミュレーション技術は、目的によらず同一である。まずモニタプログラムが対象のプログラムの名前を入力パラメータ共に受け取る。
対象のプログラムはメモリ上にロードされるが、コードに制御が渡されることはない。代わりに、ロードされたプログラムのエントリーポイントが計算され、擬似的なプログラムカウンタ()がその位置に設定される。擬似的なレジスタの内容は、対象のプログラムを直接実行する場合と同じように設定する。
ここで、ハードウェア構成やＯＳによっては、レジスタの一部が他の"制御ブロック"を示すように設定しておく必要がある。
その後、命令の実行は下記のように行われる。
テストやデバッグ目的のため、モニタプログラムはレジスタ、メモリ、プログラムの再開位置を取得/変更する機能、コアダンプの取得、現在のデータの値に対するプログラムのシンボル名を表示する機能、などを提供することができる。条件によって実行を「中断」する機能や、不要な中断箇所を取り除く機能などを備えることもできる。
命令セットシミュレータは、実行の条件がエラーによって破壊されてしまうようなエラーを命令の実行前に検出する機会を提供することができる。IBM System/360 での良い例として、命令シミュレータのモニタを使う以外にはデバッグが困難な命令列があった。
 LM R1,R15,12(R13) r13 が誤って X"00" が連続した記憶域を指している
 BR R14 PSW は X"0000002" を示し、"Operation Exception" を発生
 * 全レジスタはエラー時 0 になる.
利点・問題点.
オーバーヘッド.
上記のサイクル（フェッチ、実行、新しいアドレスの計算）という処理を行うために必要な命令数はハードウェアに依存するが、IBM System/360/370/390/ES9000 クラスのマシンでは 12～13命令で実現できる。正しいメモリ位置のチェックや、条件によってプログラムを中断する機能は、かなりのオーバーヘッドが必要であるが、最適化技法により許容できるレベルまでオーバーヘッドを削減することができる。、トレース、テスト用のエラールーチンへの意図的なジャンプ（エラーがない場合でも）などの
強力なデバッグ能力を提供できるので、テスト目的のためには十分許容できる。さらに、実行コード網羅率を測定するために、命令の完全なトレースを利用することもできる。
その他の利点.
対象プログラムの実行をモニタすることで、実環境はなくモニタ上で発生するランダムエラーを検出することに役立つ場合がある。
これは、シミュレーションの場合には同じアドレス空間にモニタプログラムが存在しているため、対象のプログラムが通常と異なる場所にロードされることで発生する場合がある。
対象のプログラムがメモリ上のランダムな位置の値を読み取った場合、たとえばヌル値(X"00") を読み取り、プログラムは正常に動作していたとする。モニタプログラムがプログラムをロードする番地をシフトさせると、それによりたとえばX"FF"を読み取るようになり、プログラムのロジックは比較の操作で異なる結果を返すかもしれない。あるいは、モニタプログラムそのものがロードされた番地が値を読み出す場所であった場合にも、同様の結果が生じうる。
再入性に関するバグ:静的変数を誤って"動的な"スレッド局所な記憶域の代わりに用いると、多くの場合再入性に関する問題が生じる。モニタプログラムを使用することでこうした問題をstorage protect keyを用いずに検出することができる。
無効な命令 オペレーティングシステム（あるいはハードウェア）は、アプリケーションプログラムがオペレーティングシステムの特定の機能を呼び出す際、正しい"モード"であることを要求する。命令セットシミュレータはこうした条件を実行前に検出することができる。
ホットスポットの解析・命令の使用状況の解析: シミュレーションの間に実行された命令を数えると（数は実際のプロセッサや、モニターを行わない実行の場合と一致するはずである）、シミュレータはアルゴリズムのバージョンによる性能の違いを計測したり、"ホットスポット"を検出してプログラマが最適化を行ったりできる。通常の実行時にはこうした情報を取得することが容易でなく、また特に高水準言語のプログラムは、そもそも機械語命令を抽象化してしまうため、特にその傾向が強い。この使い方では、ISS は性能解析の一形態として考えることができる。
トレース結果の例.
テストやデバッグのためにモニタプログラムを使用して行ったシミュレーションのトレースの例である。
 プログラム オフセット 命令 逆アセンブル レジスタ/ 記憶装置 (実行後)
 TEST001 000000 X'05C0' BALR R12,0 R12=002CE00A
 000002 X'47F0C00E' BC 15,X'00E'(R12) 
 00000E X'98ECD00C' STM R14,R12,X'00C'(R13) X'002E0008' ==> X'00004CE,002CE008..etc...'
 000012 X'45E0C122' BAL R14,X'122'(R12) R14=002C0016
 SUB1 000124 X'50E0C28A' ST R14,X'28A'(R12) X'002CE294' ==> X'002C0016'