リファクタリングー総仕上げ
これでbefore
フィールドの必要性がなくなりました。早速削除して下さい。すると当然、TestForm_Load
メソッド、CmdExeButton_Click
メソッド、RegisterValueChanged
メソッドからエラー発生します。このうち、CmdExeButton_Click
メソッド以外の該当コードは削除してください。具体的な部分については、「リファクタリングー分析」の項に書いてあります。
CmdExeButton_Click
メソッドの該当コードについては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命令の実装順序を確認します。手順は次のとおりです。
CommandName
列挙体に「Subtract」を追加(SubはVBの予約語ですので使えません)SearchOpeCodeMap
メソッドにSUB命令に関する処理を追加GetBinary
メソッドにSUB命令に関する処理を追加Subtract
メソッドを実装ExecuteCommand
メソッドにSUB命令に関する処理を追加- テストドライバの修正
作業が簡単過ぎて説明不要だと思われるCommandName
列挙体の修正を飛ばして、以降順を追って簡潔に説明します。
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命令に関する情報を設定します。数値さえ気をつければ特に問題はありません。