無差別に技術をついばむ鳥

情報処理技術全般を気まぐれにつつくゆるいブログです

バイナリをつつく11−任務実行の概要

さあ、いよいよ命令を実際に実行するまでするピヨ。 話しの流れからいって、大概の人はADD命令を実装すると考えると思うけど、 残念ながらその前にレジスタを初期化しなくてはならないんだ。 そうしないと、どんなことが起こるかわからないんだ。だから今回はMOV命令(move EAX 即値)を実装するピヨ。
この命令を実装するには、CPUが命令を実行する流れをふまえなくちゃならない。
だからCPUが命令を実行する手順とそれに対応するメソッドをおさらいしよう。
1、マシン語で書かれた命令を読み込む=void ReadCommand(Byte[] code)
2、命令の意味を解析する=void AnalyzeCommand()
3、ついに命令を実行=void ExecuteCommand()
みんな準備はいいピヨね?さあ、ドキドキワクワクする実装にトライだー。
※これから説明する手順はmov EAX 32ビット値の手順です。

バサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサ

            【命令読み込み】

この動作は命令を読み込むだけなので簡単だ。
  • CPUオブジェクト内でQueue<byte> datasフィールドを宣言する。
  • コンストラクタ内でdatas変数を初期化する。
  • ReadCommandメソッド内で
    foreach(byte data in code) datas.Enqueue(data);
とすればいい(今のところは)
※ListじゃなくてQueueにしたわけは、そのほうが実際のCPUの動作に近いと判断したからです。

バサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサ
            【命令の意味解析】

  • CPUオブジェクト内でQueue<Command> cmdsフィールドを宣言する。
  • コンストラクタ内でcmds変数を初期化する。
※これ以降はvoid AnalyzeCommand()メソッド内の手順となります。
  • datas変数に保持している値をデキューして、その値を引数としてSearchOpeCodeメソッドを呼び出します。
  • 命令を表すCommand構造体を初期化します。
  • SearchOpeCodeメソッドの戻り値からディスティネーション・レジスタを確定し、Command構造体のDestinationRegisterプロパティに代入します。
  • datas変数から4回(32ビットだから)デキューします。
  • 値を32ビットの値へ変換します。
  • 先ほど取り出した値をCommand構造体に設定します。
  • cmds変数に先ほど生成したCommand構造体のインスタンスをエンキューします。

バサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサ
            【命令実行】

  • cmds変数から命令をひとつデキューします。
  • デキューしたCommand変数の値から実行する命令を決定する。
  • 各命令文を実際に実行するメソッドを呼び出す。
    今回の例の場合void Move(Command cmd)


はぁはぁはぁ、今回は一気にやったので疲れたよ。駆け足でひとまず概要を紹介したからわかりにくかったと思う。 だから次回からはそれぞれの手順を詳しく説明していくピヨ。楽しみにしててね。じゃぁ、また会おう♪
別窓 | バイナリ | コメント:0 | トラックバック:0 | ∧top | under∨
<<プログラム言語をつつく0−百花繚乱 | 無差別に技術をついばむ鳥 | バイナリをつつく10ー電波ソムリエ2>>

この記事のコメント

∧top | under∨

コメントの投稿

 

管理者だけに閲覧
 

この記事のトラックバック

∧top | under∨
| 無差別に技術をついばむ鳥 |