1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

エミュレータをつくりたい

Last updated at Posted at 2020-04-28

はじめに

x86 CPUエミュレータを作ろうとしています。
エミュレータ作成を通し、
CPUの動き、機械語やアセンブリ言語など、低レイヤーの知識をつけることを目的としています。
今回はまともなプログラムは動かせません。
"Hello, World"もできません。

参考書籍

自作エミュレータで学ぶx86アーキテクチャ

前提知識

レジスタ

レジスタは、CPUに組み込まれている作業領域です。
汎用レジスタと特殊レジスタがあります。

(ESP、EBPを汎用レジスタって言う本があったり、
特殊レジスタって言う本があったり結局どっちなの?という気持ちになる。)

汎用レジスタ

x86環境下では汎用レジスタは以下の8つがあります。

  1. EAX
  2. ECX
  3. EDX
  4. EBX
  5. ESP
  6. EBP
  7. ESI
  8. 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の範囲内を飛ぶことができます。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?