private static void add_rm32_imm8(Emulator emu, ModRM modrm) { UInt32 rm32 = modrm.get_rm32(emu); UInt32 imm8 = (UInt32)emu.getSignedCode8(0); emu.eip += 1; modrm.set_rm32(emu, rm32 + imm8); }
static void cmp_rm32_imm8(Emulator emu, ModRM modrm) { UInt32 rm32 = modrm.get_rm32(emu); UInt32 imm8 = (UInt32)emu.getSignedCode8(0); emu.eip += 1; UInt64 result = (UInt64)rm32 - (UInt64)imm8; emu.update_eflags_sub(rm32, imm8, result); }
// opcode 0xEB public static void short_jump(Emulator emu) { SByte diff = (SByte)emu.getSignedCode8(1); emu.eip += (UInt32)(diff + 2); }
// opcode 0x7E public static void jle(Emulator emu) { int diff = emu.eflags.HasFlag(Eflags.ZERO) || (emu.eflags.HasFlag(Eflags.SIGN) != emu.eflags.HasFlag(Eflags.OVERFLOW)) ? emu.getSignedCode8(1) : 0; emu.eip += (uint)(diff + 2); }
// opcode 0x79 public static void jns(Emulator emu) { int diff = emu.eflags.HasFlag(Eflags.SIGN) ? 0 : emu.getSignedCode8(1); emu.eip += (uint)(diff + 2); }
// opcode 0x74 public static void jz(Emulator emu) { int diff = emu.eflags.HasFlag(Eflags.ZERO) ? emu.getSignedCode8(1) : 0; emu.eip += (uint)(diff + 2); }