コード例 #1
0
ファイル: Instructions.cs プロジェクト: uPD71054/x86Emulator
        // opcode 0x83
        public static void code_83(Emulator emu)
        {
            emu.eip += 1;
            ModRM modrm = new ModRM();

            modrm.Parse(emu);

            switch (modrm.opcode)
            {
            case 0:
                add_rm32_imm8(emu, modrm);
                break;

            case 5:
                sub_rm32_imm8(emu, modrm);
                break;

            case 7:
                cmp_rm32_imm8(emu, modrm);
                break;

            default:
                Console.WriteLine("not implemented: 83 /%d", modrm.opcode);
                System.Environment.Exit(0);
                break;
            }
        }
コード例 #2
0
ファイル: Instructions.cs プロジェクト: uPD71054/x86Emulator
        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);
        }
コード例 #3
0
ファイル: Instructions.cs プロジェクト: uPD71054/x86Emulator
        // opcode 0x8B
        public static void mov_r32_rm32(Emulator emu)
        {
            emu.eip += 1;
            ModRM modrm = new ModRM();

            modrm.Parse(emu);
            UInt32 rm32 = modrm.get_rm32(emu);

            modrm.set_r32(emu, rm32);
        }
コード例 #4
0
ファイル: Instructions.cs プロジェクト: uPD71054/x86Emulator
        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);
        }
コード例 #5
0
ファイル: Instructions.cs プロジェクト: uPD71054/x86Emulator
        // opcode 0xB8~0xBF
        public static void mov_rm32_imm32(Emulator emu)
        {
            emu.eip++;
            ModRM modrm = new ModRM();

            modrm.Parse(emu);
            UInt32 value = emu.getCode32(0);

            emu.eip += 4;
            modrm.set_rm32(emu, value);
        }
コード例 #6
0
ファイル: Instructions.cs プロジェクト: uPD71054/x86Emulator
        // opcode 0x3B
        public static void cmp_r32_rm32(Emulator emu)
        {
            emu.eip += 1;
            ModRM modrm = new ModRM();

            modrm.Parse(emu);
            UInt32 r32    = modrm.get_r32(emu);
            UInt32 rm32   = modrm.get_rm32(emu);
            UInt64 result = (UInt64)r32 - (UInt64)rm32;

            emu.update_eflags_sub(r32, rm32, result);
        }
コード例 #7
0
ファイル: Instructions.cs プロジェクト: uPD71054/x86Emulator
        // opcode 0xFF
        public static void code_ff(Emulator emu)
        {
            emu.eip += 1;
            ModRM modrm = new ModRM();

            modrm.Parse(emu);

            switch (modrm.opcode)
            {
            case 0:
                inc_rm32(emu, modrm);
                break;

            default:
                Console.WriteLine("not implemented: 83 /%d", modrm.opcode);
                System.Environment.Exit(1);
                break;
            }
        }
コード例 #8
0
ファイル: Instructions.cs プロジェクト: uPD71054/x86Emulator
        private static void inc_rm32(Emulator emu, ModRM modrm)
        {
            UInt32 value = modrm.get_rm32(emu);

            modrm.set_rm32(emu, value + 1);
        }