マイペースなプログラミング日記

DTMやプログラミングにお熱なd-kamiがマイペースに書くブログ

クラス分け

今まではただオペコードを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実行という感じ。似たようなコードや同じコードが何度もでてくることになるが、仕方ないことだろう。多分