SHOEISHA iD

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

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

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

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

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

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

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

Setのロジックの説明

 Register構造体のプロパティは値を共有しています。そのため、簡単な値のGet/Setをするプロパティとは違い、注意するべき点として「Setする前に前の値を消す必要があること」が挙げられます。

 先程説明したように、無視したい(消したい)桁を0にしたビットごとのAnd論理演算を使用すれば、その桁の値は必ず0になります。今回の場合、前の値を消したいのですから、Getの反対のビットごとのAnd論理演算をすればいいことになります。

 それでは、また電卓で確認してみましょう。EAXに2,359,271,448(16進数で8C9F A018)が代入されている時、AXの値を0にしたい場合は値が8C9F 0000になればよいわけです。ということは、8C9F A018 And FFFF 0000の計算をすればよいことになります。電卓で実際に計算してみてください。望む計算結果が得られたはずです。これでGetとSetのロジックを組むための知識が揃いました。

 それでは、その知識を元にプロパティの実装を順次行っていきましょう。

ValueU16プロパティ(AXレジスタ)の実装

 ValueU16プロパティとしてAXレジスタを実装します。

 ポイントは、VBでは16進の値を「&H~」で表現することです。例えば、10進数で「15」は、16進では「&HF」と表現します。後は、これまでの説明を参考にロジックを実装していけばよいでしょう。

 この記事の目的は、読者の皆さんにバイナリプログラミングを楽しんで頂くことです。答えを先に聞いてしまったら面白さが半減してしまいます。まずは自分で実装してみてください。

 その際は、繰り返しテストプログラムを実行して、自分が実装したプログラムが正しいか確認する手順を忘れずに。ValueU16プロパティに関するエラーが表示されなくなれば成功です。

 では、著者の実装例を紹介します。

'16ビットレジスタの値
Public Property ValueU16() As UShort
    Get
        Dim val As UShort = CUShort(Me.m_value And &HFFFF)
        Return val
    End Get
        Set(ByVal value As UShort)

        '以前の値を消す
        Dim val As UInteger = Me.m_value And &HFFFF0000

        '新しい値をセットする
        Me.m_value = val + value
    End Set
End Property

 これでAXレジスタに該当する処理が行えるようになりました。テストプログラムを実行してみてください。ValueU16プロパティに関するエラーは表示されなくなったはずです。これでテスト成功です。次はValueHighByteプロパティを実装しましょう。

ValueHighByteプロパティ(AHレジスタ)を実装

 ValueHighByteプロパティとして、AHレジスタを実装します。こちらもこれまでの説明を参考に、まずは自分で考えて実装してみてください。ValueHighByteプロパティに関するエラーが表示されなくなれば成功です。

 著者の実装例を紹介します。

'16ビットレジスタの右半分(high)
Public Property ValueHighByte() As Byte
    Get
        Dim tmp As UShort = CUShort(Me.m_value And &HFF00)
        Dim val As Byte = CType((tmp >> 8), Byte)
        Return val
    End Get
    Set(ByVal value As Byte)

        '以前の値を消す
        Dim val As ULong = CULng(Me.m_value And &HFFFF00FF)

        '1ワードの右部分だけ取得する(桁を合わしつつ計算しよう)
        Dim hi As UShort = CUShort(CUShort(value) << 8)

        '新しい値をセットする
        Me.m_value = val + hi
    End Set
End Property

 これでAHレジスタに該当する処理が行えるようになりました。テストプログラムを実行してみてください。ValueHighByteプロパティに関するエラーは表示されなくなったはずです。これでテスト成功です。残りのValueLowByteプロパティについては宿題とします。記事添付のサンプルファイルに答えが載っていますので、ぜひ挑戦してください。

まとめ

 いかがだったでしょうか? バイナリプログラミングには数字を使ったパズルのような面白さがあると筆者は思います。バイナリプログラミングの面白さが少しでも伝わっていれば幸いです。次回はCPUの動作を実装して、画面で確認できるようにする方法を解説しますので、お楽しみに。

修正履歴

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

  • 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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー

アクセスランキング

アクセスランキング