x86エミュレータを作り直している途中で、前はどう作ればいいのかわからず、ビット演算とか思いついたまま書いていた。しかし、ビット演算がいろんなところにでてきてしまうので、なんとか整理しようと思い、変更。メソッドの名前がまだ適切な感じではないが、ちょっとすっきりした。以下、修正前と修正後のコード
前のコード
public class MoveReg16SReg implements Instruction{ public void execute(byte[] buff, int[] registers, VMManager manager){ int op1 = buff[registers[CS] * 16 + registers[EIP] + 1] & 0xFF; int mod = (op1 & 0xC0) >> 6; int reg = (op1 & 0x38) >> 3; int rm = op1 & 0x07; int seg = reg + 9; /* 省略(微妙に長いコード) */ registers[EIP] += 2; } }
今のコード
public class MoveRM16SReg implements Instruction{ public void execute(VM vm){ int modrm = vm.getCode8(1); int index = VMUtil.getRegOp(modrm); int value = vm.getSegReg(index); VMUtil.setModRMData(vm, modrm, value); vm.nextEIP(2); } }