SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

VB.NETで学ぶ機械語の基礎

VB.NETで仮想CPUを作ろう (2) - レジスタの実装

VB.NETで学ぶ機械語の基礎 第2回

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード VirtualCPU.zip (98.2 KB)

本稿では、VB.NETを利用し、簡単な機械語で動く仮想CPUを作ることでバイナリプログラミングを満喫します。実際の業務で直接使えるケースは少ないと思いますが、デバッグやプログラミングの地力向上に役立つでしょう。今回はレジスタの実装を解説します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 本記事はVB.NETの初歩的な記法だけを使って、簡単な機械語で動く仮想CPUの実装法を解説します(※CPUにもいろいろありますが、この記事ではIntel社が製造しているCPUを対象とします)。その過程を通じて、初心者でもバイナリプログラミングが楽しめることや、バイナリプログラミングの魅力を伝えられればと思います。前回は、仮想CPUを実装するために必要な基礎知識を解説しました。今回は、いよいよ仮想CPUをVB.NETで実装していきます。一緒に楽しみましょう。

下準備

 まずは下準備をしましょう。新規プロジェクトで「VirtualCPU」という名前のクラスライブラリを作成してください。仮想CPUを実装するための準備はこれだけです。

CPUに絶対必要なもの

 Intel社のCPUをシミュレートする際、実装しなくてはならないのが「レジスタ」です。まずはレジスタを実装することから始めましょう。

レジスタの実装について

 前回筆者は、「EAX」「EBX」「ECX」「EDX」の4つのレジスタを使用すると述べました。そのため真っ先に、それら4つのレジスタと同名のプロパティの実装を思い浮かべるかもしれません。

 しかし、IntelのCPUはレジスタが入れ子状態で定義されており、それでは駄目なのです。分かりにくいと思いますので具体例を挙げます。

 例えば、EAXレジスタの値に2,359,271,448(16進数で8C9F A018)の値を代入した場合、各レジスタは次の値でなければなりません。このように、AX、AH、ALの各レジスタの値がEAXレジスタの値のサブセットとなる、といった入れ子関係が存在します。

EAX = 2,359,271,448(16進数で 8C9F A018)
AX  =        40,984(16進数で      A018)
AH  =           160(16進数で        A0)
AL  =            24(16進数で        18)

 つまり、レジスタは単純にプロパティとして定義するだけでは再現できない仕組みになっています。そこで今回はRegister構造体を定義することにします。では早速、プロジェクトに「Register.vb」ファイルを追加し、次のプログラムを入力してみましょう。

'レジスタの動きをエミュレートする構造体
Public Structure Register

    '共有する値
    Private m_value As UInteger

    '32ビットレジスタの値
    Public Property ValueU32() As UInteger
        Get
            Return m_value
        End Get
        Set(ByVal value As UInteger)
            m_value = value
        End Set
    End Property

    '16ビットレジスタの値
    Public Property ValueU16() As UShort
        Get
            Return 0
        End Get
        Set(ByVal value As UShort)

        End Set
    End Property

    '16ビットレジスタの左半分(high)
    Public Property ValueHighByte() As Byte
        Get
            Return 0
        End Get
        Set(ByVal value As Byte)

        End Set
    End Property

    '16ビットアドレスの右半分(low)
    Public Property ValueLowByte() As Byte
        Get
            Return 0
        End Get
        Set(ByVal value As Byte)

        End Set
    End Property

End Structure

次のページ
テストファースト

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
VB.NETで学ぶ機械語の基礎連載記事一覧

もっと読む

この記事の著者

インドリ(インドリ)

分析・設計・実装なんでもありのフリーエンジニア。ブログ「無差別に技術をついばむ鳥(http://indori.blog32.fc2.com/)」の作者です。アドバイザーをしたり、システム開発したり、情報処理技術を研究したりと色々しています。座右の銘は温故知新で、新旧関係なく必要だと考えたものは全て学...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2745 2010/04/27 12:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング