リファクタリングー総仕上げ
これで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命令に関する情報を設定します。数値さえ気をつければ特に問題はありません。
この記事は参考になりましたか?
- この記事の著者
-
インドリ(インドリ)
分析・設計・実装なんでもありのフリーエンジニア。ブログ「無差別に技術をついばむ鳥(http://indori.blog32.fc2.com/)」の作者です。アドバイザーをしたり、システム開発したり、情報処理技術を研究したりと色々しています。座右の銘は温故知新で、新旧関係なく必要だと考えたものは全て学...
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
