はじめに
x86 CPUエミュレータを作ろうとしています。
エミュレータ作成を通し、
CPUの動き、機械語やアセンブリ言語など、低レイヤーの知識をつけることを目的としています。
今回はまともなプログラムは動かせません。
"Hello, World"もできません。
参考書籍
前提知識
レジスタ
レジスタは、CPUに組み込まれている作業領域です。
汎用レジスタと特殊レジスタがあります。
(ESP、EBPを汎用レジスタって言う本があったり、
特殊レジスタって言う本があったり結局どっちなの?という気持ちになる。)
汎用レジスタ
x86環境下では汎用レジスタは以下の8つがあります。
- EAX
- ECX
- EDX
- EBX
- ESP
- EBP
- ESI
- EDI
アセンブリ言語で、なにかデータを指定する箇所では、
汎用レジスタは大体指定することができます。
演算結果を、EAXやEDXに暗黙的に入れられることもあります。
例えば、div ecx
とすると、
EAX ÷ ECX
の商がEAXに、余がEDXに入ります。
特殊レジスタ
EIPとEFLAGSがあります。
EIPには次に実行するアセンブリ命令のアドレスが入っています。
EFLAGSは条件判定に使うようなフラグが入っています。
アセンブリ言語
機械語と一対一で対応している言語です。
実装
処理の方針
1バイトのオペコードを読み込み、その値によって処理を振り分けていきます。
mov命令
mov命令のオペコードは0xB8
から 0xBF
までです。
オペコード自身に、レジスタの指定が含まれています。
4バイトの値を、指定したレジスタにコピーします。
short jump命令
short jump命令のオペコードは0xEB
です。
1バイトの符号付き整数を取り、eipに加算します。
つまり、-127から+128の範囲内を飛ぶことができます。