示例#1
0
文件: disasm.py 项目: fraca7/dsremap
def execute(stacksize, bytecode):
    vm = VM(bytecode=bytecode, stacksize=stacksize)
    while True:
        disasm_one(bytecode, vm.offset)
        print('Stack: %s' % vm.get_stack())
        input('...')
        vm.step(Report())
示例#2
0
    def test_yield(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_FLOW_YIELD)

        vm, size = self.create()
        ret = vm.step(Report())

        self.assertEqual(vm.offset, size)
        self.assertTrue(ret)
示例#3
0
    def test_push_report_int(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_STACK_PUSH)
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_L2VALUE))

        vm, size = self.create(stack=struct.pack('<i', 1))
        vm.step(Report(L2Value=13))

        self.assertEqual(vm.get_stack(), struct.pack('<ii', 1, 13))
        self.assertEqual(vm.offset, size)
示例#4
0
    def test_push_report_float(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_STACK_PUSH)
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_IMUY))

        vm, size = self.create(stack=struct.pack('<i', 1))
        vm.step(Report(IMUY=13.5))

        self.assertEqual(vm.get_stack(), struct.pack('<if', 1, 13.5))
        self.assertEqual(vm.offset, size)
示例#5
0
    def test_call(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_FLOW_CALL)
        self.add(struct.pack('<H', 42))

        vm, size = self.create(stacksize=2)
        vm.step(Report())

        self.assertEqual(vm.offset, 42)
        self.assertEqual(vm.get_stack(), struct.pack('<H', 3))
示例#6
0
    def test_ret(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_FLOW_RET)

        vm, size = self.create(stack=struct.pack('<H', 42))
        ret = vm.step(Report())

        self.assertEqual(vm.offset, 42)
        self.assertEqual(vm.get_stack(), b'')
        self.assertFalse(ret)
示例#7
0
    def test_jump(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_FLOW_JUMP)
        self.add(struct.pack('<H', 42))

        vm, size = self.create()
        ret = vm.step(Report())

        self.assertEqual(vm.offset, 42)
        self.assertFalse(ret)
示例#8
0
    def test_pushf(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_STACK_PUSHF)
        self.add(struct.pack('<f', 42.5))

        vm, size = self.create(stack=struct.pack('<i', 1))
        vm.step(Report())

        self.assertEqual(vm.get_stack(), struct.pack('<if', 1, 42.5))
        self.assertEqual(vm.offset, size)
示例#9
0
    def test_reg_report(self):
        self.add_opcode()
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_TH))
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_IMUX))

        vm, size = self.create()
        vm.step(Report(IMUX=42.5))

        self.assertEqual(vm.TH, 42)
        self.assertEqual(vm.offset, size)
示例#10
0
    def test_reg_report(self):
        self.add_opcode(Opcodes.OPCODE_VARIANT_A)
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_SP))
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_L2VALUE))

        vm, size = self.create(stack=b'\x00\x00')
        vm.step(Report(L2Value=42))

        self.assertEqual(vm.SP, 44)
        self.assertEqual(vm.offset, size)
示例#11
0
    def test_jz_C_float_true(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_FLOW_JZ,
                        variant=Opcodes.OPCODE_VARIANT_CF)
        self.add(struct.pack('<fH', 0.0, 42))

        vm, size = self.create()
        ret = vm.step(Report())

        self.assertEqual(vm.offset, 42)
        self.assertFalse(ret)
示例#12
0
    def test_jz_C_int_false(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_FLOW_JZ,
                        variant=Opcodes.OPCODE_VARIANT_CI)
        self.add(struct.pack('<iH', 1, 42))

        vm, size = self.create()
        ret = vm.step(Report())

        self.assertEqual(vm.offset, size)
        self.assertFalse(ret)
示例#13
0
    def test_not_reg_true(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_UNARY_NOT)
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_TH))

        vm, size = self.create()
        vm.TH = 42
        vm.step(Report())

        self.assertEqual(vm.TH, 0)
        self.assertEqual(vm.offset, size)
示例#14
0
    def test_push_reg(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_STACK_PUSH)
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_TH))

        vm, size = self.create(stack=struct.pack('<i', 1))
        vm.TH = 42
        vm.step(Report())

        self.assertEqual(vm.get_stack(), struct.pack('<ii', 1, 42))
        self.assertEqual(vm.offset, size)
示例#15
0
    def test_reg_C(self):
        self.add_opcode(Opcodes.OPCODE_VARIANT_C)
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_SP))
        self.add(struct.pack('<i', 42))

        vm, size = self.create(stack=b'\x00\x00')
        vm.step(Report())

        self.assertEqual(vm.SP, 44)
        self.assertEqual(vm.offset, size)
示例#16
0
    def test_report_C(self):
        self.add_opcode(Opcodes.OPCODE_VARIANT_C)
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_L2VALUE))
        self.add(struct.pack('<i', 42))

        vm, size = self.create()
        report = Report(L2Value=9)
        vm.step(report)

        self.assertEqual(report.L2Value, 9 + 42)
        self.assertEqual(vm.offset, size)
示例#17
0
    def test_neg_regoff_float(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_UNARY_NEG)
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8,
                                     Opcodes.ADDR_VALTYPE_FLOAT))

        vm, size = self.create(stack=struct.pack('<ifi', 1, 2.5, 3))
        vm.step(Report())

        self.assertEqual(vm.get_stack(), struct.pack('<ifi', 1, -2.5, 3))
        self.assertEqual(vm.offset, size)
示例#18
0
    def test_not_constaddr_float_false(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_UNARY_NOT)
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 4,
                                     Opcodes.ADDR_VALTYPE_FLOAT))

        vm, size = self.create(stack=struct.pack('<ifi', 1, 0.0, 3))
        vm.step(Report())

        self.assertEqual(vm.get_stack(), struct.pack('<ifi', 1, 1.0, 3))
        self.assertEqual(vm.offset, size)
示例#19
0
    def test_reg_reg(self):
        self.add_opcode(Opcodes.OPCODE_VARIANT_A)
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_SP))
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_TH))

        vm, size = self.create(stack=b'\x00\x00')
        vm.TH = 42
        vm.step(Report())

        self.assertEqual(vm.SP, 2 + 42)
        self.assertEqual(vm.offset, size)
示例#20
0
    def test_jz_report_false(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_FLOW_JZ,
                        variant=Opcodes.OPCODE_VARIANT_A)
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_L2VALUE))
        self.add(struct.pack('<H', 42))

        vm, size = self.create()
        ret = vm.step(Report(L2Value=1))

        self.assertEqual(vm.offset, size)
        self.assertFalse(ret)
示例#21
0
    def test_report_report(self):
        self.add_opcode(Opcodes.OPCODE_VARIANT_A)
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_L2VALUE))
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_R2VALUE))

        vm, size = self.create()
        report = Report(L2Value=9, R2Value=42)
        vm.step(report)

        self.assertEqual(report.L2Value, 9 + 42)
        self.assertEqual(vm.offset, size)
示例#22
0
    def test_report_int_report_float(self):
        self.add_opcode()
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_L2VALUE))
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_IMUX))

        vm, size = self.create()
        report = Report(IMUX=42.5)
        vm.step(report)

        self.assertEqual(report.L2Value, 42)
        self.assertEqual(vm.offset, size)
示例#23
0
    def test_push_report_constaddr_int(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_STACK_PUSH)
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 4,
                                     Opcodes.ADDR_VALTYPE_INT))

        vm, size = self.create(stack=struct.pack('<iii', 1, 42, 3))
        vm.step(Report())

        self.assertEqual(vm.get_stack(), struct.pack('<iiii', 1, 42, 3, 42))
        self.assertEqual(vm.offset, size)
示例#24
0
    def test_not_regoff_int_false(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_UNARY_NOT)
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8,
                                     Opcodes.ADDR_VALTYPE_INT))

        vm, size = self.create(stack=struct.pack('<iii', 1, 0, 3))
        vm.step(Report())

        self.assertEqual(vm.get_stack(), struct.pack('<iii', 1, 1, 3))
        self.assertEqual(vm.offset, size)
示例#25
0
    def test_regoff_report_int(self):
        self.add_opcode(Opcodes.OPCODE_VARIANT_A)
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8,
                                     Opcodes.ADDR_VALTYPE_INT))
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_L2VALUE))

        vm, size = self.create(stack=struct.pack('<iii', 1, 2, 3))
        vm.step(Report(L2Value=42))

        self.assertEqual(vm.get_stack(), struct.pack('<iii', 1, 2 + 42, 3))
        self.assertEqual(vm.offset, size)
示例#26
0
    def test_push_report_regoff_float(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_STACK_PUSH)
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8,
                                     Opcodes.ADDR_VALTYPE_FLOAT))

        vm, size = self.create(stack=struct.pack('<ifi', 1, 42.5, 3))
        vm.step(Report())

        self.assertEqual(vm.get_stack(), struct.pack('<ifif', 1, 42.5, 3,
                                                     42.5))
        self.assertEqual(vm.offset, size)
示例#27
0
    def test_reg_regoff(self):
        self.add_opcode(Opcodes.OPCODE_VARIANT_A)
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_SP))
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8,
                                     Opcodes.ADDR_VALTYPE_INT))

        vm, size = self.create(stack=struct.pack('<iii', 1, 42, 3))
        vm.step(Report())

        self.assertEqual(vm.SP, 12 + 42)
        self.assertEqual(vm.offset, size)
示例#28
0
    def test_jz_reg_true(self):
        self.add_opcode(Opcodes.OPCODE_SUBTYPE_FLOW_JZ,
                        variant=Opcodes.OPCODE_VARIANT_A)
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_TH))
        self.add(struct.pack('<H', 42))

        vm, size = self.create()
        vm.TH = 0
        ret = vm.step(Report())

        self.assertEqual(vm.offset, 42)
        self.assertFalse(ret)
示例#29
0
    def test_regoff_report_float(self):
        self.add_opcode(Opcodes.OPCODE_VARIANT_A)
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_SP, -8,
                                     Opcodes.ADDR_VALTYPE_FLOAT))
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_IMUY))

        vm, size = self.create(stack=struct.pack('<ifi', 1, 2.5, 3))
        vm.step(Report(IMUY=42.5))

        self.assertEqual(vm.get_stack(), struct.pack('<ifi', 1, 2.5 + 42.5, 3))
        self.assertEqual(vm.offset, size)
示例#30
0
    def test_reg_int_regoff_float(self):
        self.add_opcode()
        self.add(Opcodes.make_addr_reg(Opcodes.REGINDEX_TH))
        self.add(
            Opcodes.make_addr_regoff(Opcodes.REGINDEX_ZR, 4,
                                     Opcodes.ADDR_VALTYPE_FLOAT))

        vm, size = self.create(stack=struct.pack('<if', 1, 42.5))
        vm.step(Report())

        self.assertEqual(vm.TH, 42)
        self.assertEqual(vm.offset, size)