Esempio n. 1
0
    def assert_ok(self, code, raises=None):

        code = textwrap.dedent(code)
        code = compile(code, "<%s>" % self.id(), "exec", 0, 1)


        # 使用myvm解释器运行
        real_stdout = sys.stdout

        vm_stdout = six.StringIO()
        if CAPTURE_STDOUT:             
            sys.stdout = vm_stdout
        vm = VirtualMachine()

        vm_value = vm_exc = None
        try:
            vm_value = vm.run_code(code)
        except VirtualMachineError:   
            raise
        except AssertionError:             
            raise
        except Exception as e:
            if not CAPTURE_EXCEPTION:       
                raise
            vm_exc = e
            sys.stderr.write("cat a exception in myvm")
        finally:
            real_stdout.write("-- stdout ----------\n")
            real_stdout.write(vm_stdout.getvalue())

        # 使用CPython解释器运行
        py_stdout = six.StringIO()
        sys.stdout = py_stdout

        py_value = py_exc = None
        globs = {}
        try:
            py_value = eval(code, globs, globs)
        except AssertionError:            
            raise
        except Exception as e:
            py_exc = e

        sys.stdout = real_stdout

        self.assert_same_exception(vm_exc, py_exc)
        self.assertEqual(vm_stdout.getvalue(), py_stdout.getvalue())
        self.assertEqual(vm_value, py_value)


        if raises:
            self.assertIsInstance(vm_exc, raises)
        else:
            self.assertIsNone(vm_exc)
Esempio n. 2
0
def part_two(data):
    to_check = []
    master = data
    for i, instruction in enumerate(data):
        if instruction[0] == VirtualMachine.OP_JUMP or instruction[
                0] == VirtualMachine.NOP:
            to_check.append(i)
    for i in to_check:
        data = master.copy()
        instruction = data[i][0]
        data[i] = (VirtualMachine.OP_JUMP if instruction == VirtualMachine.NOP
                   else VirtualMachine.NOP, data[i][1])
        vm = VirtualMachine(data)
        result = vm.run()
        if result != VirtualMachine.INFINITE_LOOP:
            return result
Esempio n. 3
0
def run():
    programs = [
        # These are sorted from roughly easiest first to most difficult.
        ["add", ["data", 1], ["data", 2]],
        ["add", ["data", [1, 2]], ["data", [3, 4]]],
        ["double", ["data", 13]],
        ["square", ["add", ["data", 3], ["data", 4]]],
        ["double", ["double", ["data", 5]]],
        ["tag", ["data", "td"], ["data", "hello world"]],
        ["range", ["data", 5], ["add", ["data", 5], ["data", 10]]],
        ["list", ["data", 5], ["data", 7], ["add", ["data", 8], ["data", 1]]],
        ["len", ["data", [0, 1, 2, 3, 4]]],
        ["deref", ["data", 2], ["data", ["apple", "banana", "carrot", "dog"]]],
        ["deref", ["data", "x"], ["data", {
            "x": 5,
            "y": 7
        }]],
        ["is_zero", ["data", 5]],
        ["is_zero", ["add", ["data", 3], ["data", -3]]],
        ["incr", ["data", 10]],
        ["decr", ["data", 10]],
        ["if", ["data", 1], ["data", "if-case"], ["data", "else-case"]],
        [
            "if", ["eq", ["data", "x"], ["data", "y"]], ["data", "if-case"],
            ["data", "else-case"]
        ],
        ["factorial", ["data", 5]],
        ["math_row", ["data", 7]],
        ["td", ["data", "hello"]],
        ["concat", ["data", ["a", "b", "c"]]],
        ["tr", ["list", ["td", ["data", "a"]], ["data", "<td>b</td>"]]],
        ["map", ["data", [1, 2, 3]], ["data", "double"]],
        ["math_tr", ["data", 7]],
        ["math_table_guts", ["range", ["data", 5], ["data", 12]]],
        ["table", ["data", "header_row"], ["data", ["foo", "bar"]]],
    ]

    for program in programs:
        vm = VirtualMachine(BOTS)

        def callback(answer):
            print '%s ->\n    %s\n' % (program, str(answer))

        vm.process_program(callback, program)

    def write_html(answer):
        open('foo.html', 'w').write(answer)

    vm = VirtualMachine(BOTS)
    vm.process_program(write_html,
                       ["math_table", ["range", ["data", 5], ["data", 15]]])
def gen_bytecode():
    '''
    Positions of different strings:

    heap_start:        8191
    first_bytes:       10239
    middle_bytes_hash: 10339
    last_bytes_hash:   10439
    enflag:            10539
    error_msg:         10639
    hardcoded:         10739
    enter_string:      10839
    memory_end:        24575
    '''

    code = ''
    with open('asm_code', 'r') as asmfile:
        code = asmfile.read()

    vm = VirtualMachine(bytearray(b''))
    inter = Interpreter({v.__name__: k for k, v in vm.opcode.items()})
    bytecode = inter.translate(code.split('\n'))

    return bytecode
Esempio n. 5
0
from flask import Flask
from flask import render_template
from flask import redirect
from flask import request
from vm import VirtualMachine

app = Flask(__name__)
vmachine = VirtualMachine(1)


@app.route("/")
def index():
    return render_template("index.html", vmachine=vmachine)


@app.route("/change_status/<new_status>")
def change_status(new_status):
    if new_status == "0":
        vmachine.stop()
    elif new_status == "1":
        vmachine.start()
    elif new_status == "2":
        vmachine.suspend()
    return redirect("/")


@app.route("/run_process", methods=["GET", "POST"])
def run_process():
    if request.method == "POST":
        pid = int(request.form["pid"])
        ram = float(request.form["ram"])
Esempio n. 6
0
from flask import Flask
from flask import render_template
from flask import redirect
from flask import request
from vm import VirtualMachine

app = Flask(__name__)
vmachine = VirtualMachine("Azkaban", 16, 3.7, 1000, "Debian")


@app.route("/")
def index():
    return render_template("index.html", vmachine=vmachine)


@app.route("/change_status/<new_status>")
def change_status(new_status):
    if new_status == "0":
        vmachine.stop()
    elif new_status == "1":
        vmachine.start()
    elif new_status == "2":
        vmachine.suspend()
    else:
        print("""
            Elija una opción correcta por favor:
            0 = Parar la máquina.
            1 = Iniciarla.
            2 = Suspenderla.
            """)
    return redirect("/")
Esempio n. 7
0
#!/usr/bin/env python3

from vm import VirtualMachine

c = VirtualMachine()
c.load_program("add_255_3.vef")
print(c.memory_offset)
print(c.memory)
c.load_program("sub_256_3.vef")
print(c.memory_offset)
print(c.memory)
c.run()

# assert c.output()[0] == 0x22

Esempio n. 8
0
from screen import SCREEN_SIZE, SCREEN_TOTAL_SIZE
from vm import VirtualMachine

import pygame
import sys
import os

if __name__ == "__main__":
    PATH = os.path.dirname(__file__)
    # get the code
    filename = os.path.join(PATH, sys.argv[1])
    with open(filename, "rb") as document:
        raw_code = document.read()
    # initialise the window
    display = pygame.display.set_mode(SCREEN_TOTAL_SIZE)
    # setup the vm
    vm = VirtualMachine(
        screen_size=SCREEN_SIZE,
        screen_surface=display,  # screen
        instruction_set=InstructionSet,
        register_set=RegisterSet(),  # cpu
        key_map=KEY_MAP  # keyboard
    )
    vm.load(raw_code)
    # pygame event loop
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
        next(vm)
Esempio n. 9
0
                arg = parse(machine.read_address(addr + 1 + i))
                args.append(arg)

            if op == 'jmp':
                forks.append(int(args[1]))
            if op in ['jt', 'jf']:
                forks.append(int(args[2]))
            elif op == 'out' and args[1][0] != 'R':
                args.append(chr(int(args[1])))
            memo[addr] = ' '.join(args)

            if op == 'ret':
                break
            addr += 1 + n_args
        else:
            addr += 1
    for fork in forks:
        trace(machine, fork, memo)
    return memo


if __name__ == '__main__':
    addr = int(sys.argv[1])
    machine = VirtualMachine('input/challenge.bin')
    machine.load_state('teleporter')

    output = trace(machine, addr)

    for key in sorted(output.keys()):
        print "{}: {}".format(key, output[key])
Esempio n. 10
0
rules = dict(X = "X+YF", Y = "FX-Y")

depth = 10
center_x = width / 2
center_y = height / 2
alf = 0.0
d_alf = 90.0
step = 10

args = (program, rules, depth, center_x, center_y, alf, d_alf, step)

vm = VirtualMachine(program=program,
                    rules=rules,
                    depth=depth,
                    start_x=center_x,
                    start_y=center_y,
                    start_angle=alf,
                    delta_angle=d_alf,
                    step=step
                    )

def drawCallback(cur_x, cur_y, new_x, new_y):
    pygame.draw.line(window, (255, 255, 255), (cur_x, cur_y), (new_x, new_y))
    pygame.display.update()

def eventCallback():
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit(0)
        else: 
Esempio n. 11
0
def part_one(data):
    vm = VirtualMachine(data)
    return vm.run()
Esempio n. 12
0
 def __init__(self):
     Cmd.__init__(self)
     self.vm = VirtualMachine()
     self.trace_file = None
     self.breakpoints = set()
Esempio n. 13
0
class DebugShell(Cmd):
    prompt = 'VM> '

    def __init__(self):
        Cmd.__init__(self)
        self.vm = VirtualMachine()
        self.trace_file = None
        self.breakpoints = set()

    def do_load(self, arg):
        """load <filename>
        Load the VM bytecode from <filename> to address 0"""
        args = shlex.split(arg)
        code_size = self.vm.load(args[0])
        print "Loaded %s words" % code_size
        self.vm.pc = 0
        self.print_current_instruction()

    def do_pc(self, arg):
        """pc <addr>
        Set the program counter to address <addr>"""
        args = shlex.split(arg)
        self.vm.pc = int(args[0])
        self.print_current_instruction()

    def do_reg(self, arg):
        """reg [<n> ...]
        Print the values of the specified (or all) registers"""
        args = shlex.split(arg)
        regs = map(int, args) if args else range(0, 8)
        for r in regs:
            print "R%s: %s" % (r, self.vm.registers[r])

    def do_set(self, arg):
        """set <reg> <value>
        Set register <reg> to <value>"""
        args = shlex.split(arg)
        reg = int(args[0])
        value = int(args[1])
        self.vm.registers[reg] = value

    def do_peek(self, arg):
        """peek <addr>
        Print value at memory address <addr>"""
        args = shlex.split(arg)
        addr = int(args[0])
        print "%s: %s" % (addr, self.vm.memory[addr])

    def do_poke(self, arg):
        """poke <addr> <value>
        Write <value> to memory address <addr>"""
        args = shlex.split(arg)
        addr = int(args[0])
        value = int(args[1])
        self.vm.memory[addr] = value

    def do_str(self, arg):
        """str <addr>
        Print the length-prefixed string at <addr>"""
        args = shlex.split(arg)
        addr = int(args[0])
        length = self.vm.memory[addr]
        return ''.join(map(chr, self.vm.memory[addr + 1:addr + 1 + length]))

    def do_step(self, arg):
        """step
        Execute only the next instruction"""
        self.vm.step()
        self.print_current_instruction()

    def do_break(self, arg):
        """break [<addr>]
        Set a breakpoint at <addr>, or list all breakpoints"""
        args = shlex.split(arg)
        if args:
            addr = int(args[0])
            self.breakpoints.add(addr)
            print "Breakpoint set at %s" % addr
        else:
            print "Breakpoints:"
            print '\n'.join(['%s: %s' % (a, self.disassemble_one(a)) for a in self.breakpoints])

    def do_unbreak(self, arg):
        """unbreak [<addr>]
        Remove breakpoint from <addr> or remove all breakpoints"""
        args = shlex.split(arg)
        if args:
            addr = int(args[0])
            self.breakpoints.remove(addr)
            print "Breakpoint removed from %s" % addr
        else:
            self.breakpoints.clear()
            print "All breakpoints removed"

    def do_run(self, arg):
        """run
        Execute from current PC"""
        try:
            while 1:
                if self.trace_file is not None:
                    self.trace()
                self.vm.step()
                if self.vm.pc in self.breakpoints:
                    raise BreakpointHit
        except KeyboardInterrupt:
            print "Stopped by ^C -- state may be weird"
            self.print_current_instruction()
        except BreakpointHit:
            print "Breakpoint hit at %s" % self.vm.pc
            self.print_current_instruction()
        except VmHalted:
            print "Halt"

    def do_next(self, arg):
        """next
        Execute next instruction without entering calls"""
        depth = len(self.vm.call_stack)
        try:
            while 1:
                if self.trace_file is not None:
                    self.trace()
                self.vm.step()
                if self.vm.pc in self.breakpoints:
                    raise BreakpointHit

                if depth == len(self.vm.call_stack):
                    self.print_current_instruction()
                    return
        except KeyboardInterrupt:
            print "Stopped by ^C -- state may be weird"
            self.print_current_instruction()
        except BreakpointHit:
            print "Breakpoint hit at %s" % self.vm.pc
            self.print_current_instruction()
        except VmHalted:
            print "Halt"

    def do_dis(self, arg):
        """dis <addr> [<count>]
        Disassemble one or <count> instructions starting at <addr>"""
        args = shlex.split(arg)
        addr = int(args[0])
        count = int(args[1]) if len(args) > 1 else 1
        self.disassemble(addr, count)

    def do_ss(self, arg):
        """ss <string>
        Search for <string> in memory"""
        args = shlex.split(arg)
        needle = ' '.join(args)
        # FIXME: This is probably horrendously inefficient
        mem = ''.join(map(lambda c: chr(c if c < 256 else 0), self.vm.memory.memory))
        index = mem.find(needle)
        print index

    def do_trace(self, arg):
        """ss off|<filename>
        Turn off tracing, or begin tracing to <filename>"""
        args = shlex.split(arg)
        filename = args[0]
        if self.trace_file is not None:
            self.trace_file.close()
        if filename == 'off':
            self.trace_file = None
            print "Tracing off"
        else:
            self.trace_file = file(filename, 'w')
            print "Tracing to file %s" % filename

    def do_dump(self, arg):
        """dump <filename>
        Dump memory contents into <filename>"""
        args = shlex.split(arg)
        filename = args[0]
        self.vm.memory.memory.tofile(file(filename, 'wb'))

    def do_sdump(self, arg):
        """sdump <filename>
        Dump the printable memory contents into <filename>"""
        args = shlex.split(arg)
        filename = args[0]
        printable = set(map(ord, string.printable))
        s = ''.join([chr(c) for c in self.vm.memory.memory if c in printable])
        with file(filename, 'w') as f:
            f.write(s)

    def do_calls(self, arg):
        """calls
        Show the addresses in the current call stack"""
        if len(self.vm.call_stack):
            print ' '.join(map(str, self.vm.call_stack))
        else:
            print "Empty call stack"

    def do_stack(self, arg):
        """stack
        Show the contents of the stack"""
        if len(self.vm.stack.stack) > 0:
            print ' '.join(map(str, self.vm.stack.stack))
        else:
            print "Empty stack"

    def do_out_locations(self, arg):
        locs = self.vm.out_locations.items()
        sorted_locs = sorted(locs, key=lambda x: x[0])
        for loc, chars in sorted_locs:
            print '%s: %s' % (loc, ''.join(chars))

    def do_write_calls(self, arg):
        args = shlex.split(arg)
        filename = args[0]
        with file(filename, 'w') as f:
            for dest, srcs in self.vm.calls.iteritems():
                for src in srcs:
                    f.write('%s, %s\n' % (dest, src))

    def do_EOF(self, arg):
        print
        return True

    def print_current_instruction(self):
        print '%s: %s' % (self.vm.pc, self.disassemble_one(self.vm.pc))

    def trace(self):
        self.trace_file.write('%s%s: %s (%s)\n' % (
            '  ' * len(self.vm.call_stack),
            self.vm.pc,
            self.disassemble_one(self.vm.pc),
            ', '.join(['R%s=%s' % (r, self.vm.registers[r]) for r in range(0, 8)])
        ))

    def disassemble(self, addr, count):
        while count:
            try:
                op_name, args = self.vm.fetch_instruction(addr)
                print '%s: %s' % (addr, self.disassemble_instruction(op_name, args))
                addr += 1 + len(args)
            except UndefinedOpcode:
                print '%s: ???' % addr
                addr += 1
            count -= 1

    def disassemble_one(self, addr):
        return self.disassemble_instruction(*self.vm.fetch_instruction(addr))

    def disassemble_instruction(self, op_name, args):
        return '%s %s' % (
            op_name,
            ', '.join(map(self.disassemble_operand, args))
        )

    def disassemble_operand(self, value):
        if 0 <= value <= 32767:
            if value < 128:
                return '%s (%s)' % (value, CHARS.get(value, chr(value)))
            else:
                return str(value)

        if 32768 <= value <= 32775:
            return 'R%s' % (value - 32768)

        return '%s (INVALID)' % value
Esempio n. 14
0
    elif len(sys.argv) == 4 and sys.argv[1] == 'assemble':
        input_file = Path(sys.argv[2])
        output_file = Path(sys.argv[3])

        bindata = AssembleFile(input_file)
        with output_file.open('wb') as f:
            bindata.tofile(f)

    elif len(sys.argv) == 2 and sys.argv[1] == 'benchmark':
        Benchmark('programs/conway_life.asm', 10.0, 1000000)

    elif len(sys.argv) == 3 and sys.argv[1] == 'run':

        sys.stdout.write(" [ ] Creating Virtual Machine...")
        sys.stdout.flush()
        c = VirtualMachine()
        sys.stdout.write("\r [+] Virtual Machine Created...\n")
        sys.stdout.flush()
        sys.stdout.write(" [ ] Assembling File...")
        sys.stdout.flush()
        program = AssembleFile(sys.argv[2])
        sys.stdout.write("\r [+] File Assembled...   \n")
        sys.stdout.flush()
        sys.stdout.write(" [ ] Loading Binary Data...")
        sys.stdout.flush()
        c.LoadProgramFromData(program)
        sys.stdout.write("\r [+] Binary Data Loaded...   \n")
        sys.stdout.flush()
        print(' [*] Running Program!')
        print('*' * 80 + '\n')
        while not c.halted:
Esempio n. 15
0
def run(source, args):
    program = parse(source)
    args = [int(arg) for arg in args]
    args.reverse()
    vm = VirtualMachine(program, args)
    return vm.mainloop()