今まではただオペコードをif文で分岐して、そこにコードを書いていたが、命令毎にクラスを作ろうと思った。こんな感じに
package vm.instruction.add; import vm.register.Registers; import vm.instruction.VMManager; import vm.instruction.Instruction; public class AddALImm implements Instruction{ public void execute(byte[] buff, Registers registers, VMManager manager){ int value = buff[registers.eip + 1] & 0xFF; registers.eax += value; registers.eip += 2; } }
ここにでてくるinterfaceのInstructionにexecuteメソッドを定義しておき、命令クラスで実装する。buffがメモリ上のバイナリで、Registersがレジスタの集合を表すクラス。VMManagerがメモリやレジスタなどの管理を行っているクラス。わざわざ引数を増やしたのは毎回メモリやレジスタのgetをするのはめんどいから。そしてこいつのオブジェクトはHashMapにオペコードを渡すと返ってくるようにして、そいつはInstruction型の変数で受け取りexecute実行という感じ。似たようなコードや同じコードが何度もでてくることになるが、仕方ないことだろう。多分