背景情報:最終的には、オリジナルの任天堂やゲームボーイなどの実機のエミュレーターを書きたいと思います。しかし、私はどこか、もっと簡単なところから始める必要があると決めました。私のコンピュータサイエンスのアドバイザー/教授は、彼が最初にエミュレートするために作成した非常に単純な架空のプロセッサの仕様を私に提供してくれました。1つのレジスタ(アキュムレータ)と16のオペコードがあります。各命令は16ビットで構成され、最初の4ビットにはオペコードが含まれ、残りはオペランドです。命令は、バイナリ形式の文字列として提供されます(例: "0101 0101 0000 1111")。
私の質問: C ++では、処理のために命令を解析するための最良の方法は何ですか?私の究極の目標を念頭に置いてください。これが私が考慮したいくつかのポイントです:
コードは自己変更型であるため、命令を読みながら処理して実行することはできません。命令は後の命令を変更する可能性があります。これを回避するために私が見ることができる唯一の方法は、すべての変更を保存し、各命令に対して変更を適用する必要があるかどうかを確認することです。これは、各命令の実行との大量の比較につながる可能性がありますが、これは良くありません。そのため、命令を別の形式で再コンパイルする必要があると思います。
オペコードを文字列として解析して処理することはできますが、命令全体を数値として受け取らなければならない場合があります。たとえば、増分オペコードは、命令のオペコードセクションでさえも変更する可能性があります。
命令を整数に変換する場合、intのオペコードまたはオペランドセクションだけを解析する方法がわかりません。各命令をintとして、オペコードをintとして、オペランドをintとして3つの部分に再コンパイルしたとしても、命令全体をインクリメントする必要があるため、問題は解決しません。その後、影響を受けるオペコードまたはオペランドを解析します。さらに、この変換を実行する関数を作成する必要がありますか、それとも「バイナリ形式」の文字列を整数に変換する関数(JavaのInteger.parseInt(str1、2)など)を持つC ++用のライブラリがありますか?
また、ビットシフトなどの操作もできるようにしたいと思います。それをどのように達成できるかはわかりませんが、それがこの再コンパイルの実装方法に影響を与える可能性があります。
あなたが提供できる助けやアドバイスをありがとう!