SHOEISHA iD

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

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

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

VB.NETで仮想CPUを作ろう (8) - SUB命令実装

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

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

リファクタリングー総仕上げ

 これでbeforeフィールドの必要性がなくなりました。早速削除して下さい。すると当然、TestForm_Loadメソッド、CmdExeButton_Clickメソッド、RegisterValueChangedメソッドからエラー発生します。このうち、CmdExeButton_Clickメソッド以外の該当コードは削除してください。具体的な部分については、「リファクタリングー分析」の項に書いてあります。

 CmdExeButton_Clickメソッドの該当コードについてはRegisterValueChangedメソッドへ移動させてから修正を加えます。理由はこのコードは「レジスタを変更した際の処理」だからです。ですから、レジスタ変更時のイベントへ移動させることは自然だと言えます。移動後は下記のように修正します。

修正後のRegisterValueChangedイベント
Private Sub RegisterValueChanged(ByVal sender As Object, ByVal e As RegisterValueChangedEventArgs)
    Select Case e.Gruop
        Case RegisterGruop.A
            Me.ShowEaxRegisters(e.AfterValue)
            '情報欄を更新する
            Select Case CmdCombo.SelectedIndex
                Case CommandName.Mov
                    If Me.RegisterCombo.SelectedIndex = RegisterName.EAX Then
                        ResultLabel.Text = "値が" & e.AfterValue.ValueU32.ToString() & "に初期化されました。"
                    ElseIf Me.RegisterCombo.SelectedIndex = RegisterName.AL Then
                        ResultLabel.Text = "値が" & e.AfterValue.ValueLowByte.ToString() & "に初期化されました。"
                    End If
                Case CommandName.Add
                    If Me.RegisterCombo.SelectedIndex = RegisterName.EAX Then
                        ResultLabel.Text = e.BeforeValue.ValueU32.ToString() & _
                            " + " & _
                            UInteger.Parse(ValueText.Text).ToString("N", Me.format) & _
                            " = " & e.AfterValue.ValueU32.ToString()
                    Else : Me.RegisterCombo.SelectedIndex = RegisterName.AL
                        ResultLabel.Text = e.BeforeValue.ValueLowByte.ToString() & _
                            " + " & _
                            UInteger.Parse(ValueText.Text).ToString("N", Me.format) & _
                            " = " & e.AfterValue.ValueLowByte.ToString()
                    End If
            End Select
        Case RegisterGruop.B
            Me.ShowEbxRegisters(e.AfterValue)
        Case RegisterGruop.C
            Me.ShowEcxRegisters(e.AfterValue)
        Case RegisterGruop.D
            Me.ShowEdxRegisters(e.AfterValue)
    End Select
End Sub

 コードの内容については前回と変わりません。MOV命令とADD命令を実行した後に「変更前の数値 + 入力した値 = 現在の値」を画面に表示しているだけです。同じことをしていますが、分散しているコードが一か所に集中して、以前よりだいぶすっきりしたのが分かると思います。

 整理整頓が終わりましたので、減算演算をするSUB命令を実装することにします。

SUB命令の実装手順

 まずはSUB命令の実装順序を確認します。手順は次のとおりです。

  1. CommandName列挙体に「Subtract」を追加(SubはVBの予約語ですので使えません)
  2. SearchOpeCodeMapメソッドにSUB命令に関する処理を追加
  3. GetBinaryメソッドにSUB命令に関する処理を追加
  4. Subtractメソッドを実装
  5. ExecuteCommandメソッドにSUB命令に関する処理を追加
  6. テストドライバの修正

 作業が簡単過ぎて説明不要だと思われるCommandName列挙体の修正を飛ばして、以降順を追って簡潔に説明します。

SearchOpeCodeMapメソッドの修正

 まずはコードを掲載します。

SearchOpeCodeMapメソッドの修正部分の抜粋
'行と列から命令を割り出す
Select Case row
    Case 0
        Select Case col
            Case 4
                result.Name = CommandName.Add
                result.Destination = RegisterName.AL
                result.BitCount = 8
            Case 5
                result.Name = CommandName.Add
                result.Destination = RegisterName.EAX
                result.BitCount = 32
        End Select
    Case 2
        Select Case col
            Case 12
                result.Name = CommandName.Subtract
                result.Destination = RegisterName.AL
                result.BitCount = 8
            Case 13
                result.Name = CommandName.Subtract
                result.Destination = RegisterName.EAX
                result.BitCount = 32
        End Select

ADD命令と同じ要領でSUB命令に関する情報を設定します。数値さえ気をつければ特に問題はありません。

次のページ
GetBinaryメソッドの修正

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

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

もっと読む

この記事の著者

インドリ(インドリ)

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

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング