これはprogrammers.stackexchange.comにより適していると思いますが、とにかく:
特別な知識が必要だとは言いません。マイクロプロセッサとメモリ管理がどのように機能するかを知ることは、アセンブラーの知識と同様に非常に役立ちます (基本的に、アセンブラーのようなコードのインタープリターを作成しているため)。ターゲット ハードウェアがどのように機能するかを既に知っていると仮定すると、基本的に必要なのは次のコンポーネントを実装することだけです (つまり、実際のハードウェアを偽装し、その動作を模倣/エミュレートします)。
- マシンコードを解析して実行する CPU をシミュレートします。
- 入力コンポーネントをシミュレートします (キーボード、マウス、ジョイスティックなどの入力を、CPU がアクセスできる「ピン信号」に変換します)。
- 出力コンポーネントをシミュレートします (画像と音声データを目に見えるものに変換します。たとえば、画面に何かを表示したり、実際のハードウェア コンポーネントのようにサウンドを生成したりします)。
- メモリ パック、内蔵バッテリー、カートリッジ、拡張チップなどの他のコンポーネントをシミュレートします。
一般的なアドバイスとして、今のところエミュレーターを作成することは忘れてください。代わりに、独自のバイト コード インタープリターを作成して、簡単なことから始めてください。
例として、単純な疑似コード シーケンスを使用できます。
x = 5
y = 10
print(x + y)
擬似アセンブラで記述すると、次のようになります。
mov x, 5
mov y, 10
add x, y // to be honest, this is essentially x += y; not just x + y
prt x
end
ここで、すべての指示を (コード) 番号に置き換えます。すべての変数は数値に置き換えられます。
0x01 0x00 0x05
0x01 0x01 0x0a
0x02 0x00 0x01
0x03 0x00
0x00
これは少し奇妙に見えるかもしれませんが、上記の順序と改行を維持しています。0x01
ではなく、最初の命令に使用したことに注意してください0x00
。これは便宜上のものなので0x00
、「NOOP/操作なし」またはターミネーターとして使用できます (この場合のように)。改行を削除するだけで、基本的にカスタムバイトコードになります。
char code[] = {0x01, 0x00, 0x05, 0x01, 0x01, 0x0a, 0x02, 0x00, 0x01, 0x03, 0x00, 0x00};
このコードを実行するには、単純な「エミュレーター」を作成します。限られた命令セットしかありませんが、動作します。私は実際にこのコードをテストしていません。ただし、どのように/何をすべきかについてのアイデアを提供するのに十分なはずです. この例では、データ メモリと命令メモリを分割していないことに注意してください。これにより、今のところ実際には必要ない複雑さが追加されます。
int pos = 0; // essentially being our "instruction pointer"
char registers[10];
while(code[pos]) { // still some instruction
switch(code[pos++]) { // determine what to do and move the instruction pointer
// 0x00 isn't handled here, as that's part of our loop already
case 0x01: // mov(e)
registers[code[pos++]] = code[pos++]; // read the value into the register
break;
case 0x02: // add
registers[code[pos++]] += registers[code[pos++]];
break;
case 0x03: // prn
printf("%d", registers[code[pos++]]);
break;
}
}
ここで私が何をしたかを理解したら、他のソースも同様に理解するのが簡単になるはずです. 面白い事実: 効率的なシミュレーターを作成するためだけでなく、教育目的でそれを行っている場合は、Java を使い始めることができます。最適ではなく遅くなりますが、本質的に同じことを行うことができ、途中で少なくともハードルを取り除くことさえできます.
簡単なメモ: 上記の例では、2 番目のスレッドが常にregisters[]
画面の内容を書き込んでいる可能性があります。このようにして、基本的にいくつかのビデオ ハードウェア (テレビ画面や LED など) をエミュレートできます。
読むソースをもっと探しているなら、単純なプロセッサーを手に入れて、アセンブラー・コードの学習を開始しようと思います。可能であれば、非常に単純なアーキテクチャを選択してください。概念は常に同じですが、命令セットやアドレス空間の仮想化などの増加により、状況が複雑になる可能性があります。