def machine_reinit(wasm_machine_init_status = True): intel_machine.re_init() mips_machine.re_init() riscv_machine.re_init() if wasm_machine_init_status: wasm_machine.re_init()
def test_call(self): """ Tests call. At the time of writing this test blank lines are skipped by the tokenizer. In order to have emu jump to the location of label_addr, we have to make no-op lines to assign the correct locations to the lines we test. """ for i in range(NUM_TESTS): intel_machine.re_init() intel_machine.base = "dec" call_instr_addr = random.randint(FIRST_INST_ADDRESS, MAX_INSTRUCTIONS) label_addr = random.randint(FIRST_INST_ADDRESS, MAX_INSTRUCTIONS) code_to_run = [NO_OP] * (MAX_INSTRUCTIONS + 1) code_to_run[call_instr_addr] = "call " + TEST_LABEL + "\n" prev_label_info = code_to_run[label_addr] code_to_run[label_addr] = TEST_LABEL + ": " + prev_label_info intel_machine.labels[TEST_LABEL] = label_addr intel_machine.set_ip(call_instr_addr) # We step once through the code, executing only `call`. assemble("".join(code_to_run), 'att', intel_machine, step=True) self.assertEqual(intel_machine.get_ip(), label_addr)
def welcome(request): global intel_machine global mips_machine intel_machine.re_init() mips_machine.re_init() intel_machine.flavor = None mips_machine.flavor = None site_hdr = get_hdr() return render(request, 'welcome.html', {HEADER: site_hdr})
def help(request): intel_machine.re_init() mips_machine.re_init() riscv_machine.re_init() intel_machine.flavor = None mips_machine.flavor = None riscv_machine.flavor = None site_hdr = get_hdr() return render(request, 'help.html', {HEADER: site_hdr})
def reset_vms(): intel_machine.re_init() mips_machine.re_init() riscv_machine.re_init() intel_machine.flavor = None mips_machine.flavor = None riscv_machine.flavor = None intel_machine.base = None mips_machine.base = None riscv_machine.base = None
def test_jmp(self): """ Jump to a random location from 1 to MAX_INSTRUCTIONS. Assert IP is set to that location by jump. """ for i in range(NUM_TESTS): intel_machine.re_init() label_addr = random.randint(FIRST_INST_ADDRESS, MAX_INSTRUCTIONS) intel_machine.labels["test_label"] = label_addr assemble("jmp test_label", intel_machine) self.assertEqual(intel_machine.get_ip(), label_addr)
def feedback(request): intel_machine.re_init() mips_machine.re_init() riscv_machine.re_init() intel_machine.flavor = None mips_machine.flavor = None riscv_machine.flavor = None site_hdr = get_hdr() email_list = AdminEmail.objects.all() comma_del_emails = "" for email in email_list: comma_del_emails = comma_del_emails + email.email_addr + "," comma_del_emails = comma_del_emails[:-1] return render(request, 'feedback.html', {'emails': comma_del_emails, HEADER: site_hdr})
def test_jge(self): """ Jump iff sign flag is 0. """ for i in range(NUM_TESTS): intel_machine.re_init() label_addr = random.randint(FIRST_INST_ADDRESS, MAX_INSTRUCTIONS) intel_machine.labels["test_label"] = label_addr sign_flag = random.getrandbits(1) intel_machine.flags["SF"] = sign_flag assemble("jge test_label", intel_machine) if (not sign_flag): self.assertEqual(intel_machine.get_ip(), label_addr) else: self.assertEqual(intel_machine.get_ip(), 1)
def test_je(self): """ Jump iff zero flag is 1. """ for i in range(NUM_TESTS): intel_machine.re_init() label_addr = random.randint(FIRST_INST_ADDRESS, MAX_INSTRUCTIONS) intel_machine.labels["test_label"] = label_addr zero_flag = random.getrandbits(1) intel_machine.flags["ZF"] = zero_flag assemble("je test_label", 'intel', intel_machine) if (zero_flag): self.assertEqual(intel_machine.get_ip(), label_addr) else: self.assertEqual(intel_machine.get_ip(), 1)
def test_jg(self): """ Jump iff both sign flag and zero flag are 0. """ for i in range(NUM_TESTS): intel_machine.re_init() label_addr = random.randint(FIRST_INST_ADDRESS, MAX_INSTRUCTIONS) intel_machine.labels["test_label"] = label_addr sign_flag = random.getrandbits(1) zero_flag = random.getrandbits(1) intel_machine.flags["SF"] = sign_flag intel_machine.flags["ZF"] = zero_flag assemble("jg test_label", 'att', intel_machine) if ((not zero_flag) and (not sign_flag)): self.assertEqual(intel_machine.get_ip(), label_addr) else: self.assertEqual(intel_machine.get_ip(), 1)
def test_jle(self): """ Jump iff either sign flag or zero flag are 1. """ for i in range(NUM_TESTS): intel_machine.re_init() intel_machine.base = "dec" label_addr = random.randint(FIRST_INST_ADDRESS, MAX_INSTRUCTIONS) intel_machine.labels["test_label"] = label_addr sign_flag = random.getrandbits(1) zero_flag = random.getrandbits(1) intel_machine.flags["SF"] = sign_flag intel_machine.flags["ZF"] = zero_flag assemble("jle test_label", 'att', intel_machine) if (zero_flag or sign_flag): self.assertEqual(intel_machine.get_ip(), label_addr) else: self.assertEqual(intel_machine.get_ip(), 1)
def main_page(request): last_instr = "" error = "" site_hdr = get_hdr() if request.method == 'GET': if intel_machine.flavor == None and mips_machine.flavor == None: return render(request, 'main_error.html', {HEADER: site_hdr}) intel_machine.re_init() mips_machine.re_init() form = MainForm() else: if 'language' in request.POST: intel_machine.re_init() mips_machine.re_init() form = MainForm() lang = request.POST['language'] print(lang) if lang == "mips": intel_machine.flavor = None mips_machine.flavor = "mips" return render( request, 'main.html', { 'form': form, HEADER: site_hdr, 'last_instr': "", 'error': "", 'unwritable': mips_machine.unwritable, 'debug': mips_machine.debug, NXT_KEY: mips_machine.nxt_key, 'registers': mips_machine.registers, 'memory': mips_machine.memory, 'stack': mips_machine.stack, 'flags': mips_machine.flags, 'flavor': mips_machine.flavor }) else: mips_machine.flavor = None if lang == "att": intel_machine.flavor = "att" else: intel_machine.flavor = "intel" return render( request, 'main.html', { 'form': form, HEADER: site_hdr, 'last_instr': "", 'error': "", 'unwritable': intel_machine.unwritable, 'debug': intel_machine.debug, NXT_KEY: intel_machine.nxt_key, 'registers': intel_machine.registers, 'memory': intel_machine.memory, 'stack': intel_machine.stack, 'flags': intel_machine.flags, 'flavor': intel_machine.flavor }) form = MainForm(request.POST) if 'flavor' in request.POST: language = request.POST['flavor'] if language == "intel" or language == "att": intel_machine.flavor = language mips_machine.flavor = None elif language == "mips": intel_machine.flavor = None mips_machine.flavor = language if CLEAR in request.POST: intel_machine.re_init() mips_machine.re_init() else: step = (STEP in request.POST) intel_machine.nxt_key = 0 mips_machine.nxt_key = 0 if step: if intel_machine.flavor != None: add_debug("Getting next key", intel_machine) try: intel_machine.nxt_key = int( request.POST.get(NXT_KEY, 0)) except Exception: intel_machine.nxt_key = 0 else: add_debug("Getting next key", mips_machine) try: mips_machine.nxt_key = int(request.POST.get( NXT_KEY, 0)) except Exception: mips_machine.nxt_key = 0 if intel_machine.flavor != None: get_reg_contents(intel_machine.registers, request) get_mem_contents(intel_machine.memory, request) get_stack_contents(intel_machine.stack, request) get_flag_contents(intel_machine.flags, request) else: get_reg_contents(mips_machine.registers, request) get_mem_contents(mips_machine.memory, request) get_stack_contents(mips_machine.stack, request) get_flag_contents(mips_machine.flags, request) if intel_machine.flavor == "intel": (last_instr, error) = assemble(request.POST[CODE], INTEL, intel_machine, step) elif intel_machine.flavor == "att": (last_instr, error) = assemble(request.POST[CODE], ATT, intel_machine, step) else: (last_instr, error) = assemble(request.POST[CODE], "mips", mips_machine, step) if mips_machine.flavor == "mips": return render( request, 'main.html', { 'form': form, HEADER: site_hdr, 'last_instr': last_instr, 'error': error, 'unwritable': mips_machine.unwritable, 'debug': mips_machine.debug, NXT_KEY: mips_machine.nxt_key, 'registers': mips_machine.registers, 'memory': mips_machine.memory, 'stack': mips_machine.stack, 'flags': mips_machine.flags, 'flavor': mips_machine.flavor }) return render( request, 'main.html', { 'form': form, HEADER: site_hdr, 'last_instr': last_instr, 'error': error, 'unwritable': intel_machine.unwritable, 'debug': intel_machine.debug, NXT_KEY: intel_machine.nxt_key, 'registers': intel_machine.registers, 'memory': intel_machine.memory, 'stack': intel_machine.stack, 'flags': intel_machine.flags, 'flavor': intel_machine.flavor })
def run_intel_test_code(self, filnm): intel_machine.re_init() intel_machine.base = "dec" intel_machine.flavor = "intel" test_code = self.read_test_code(filnm) assemble(test_code, intel_machine)
def main_page(request): last_instr = "" error = "" sample = "" bit_code = "" button = "" site_hdr = get_hdr() if request.method == 'GET': if (intel_machine.flavor is None and mips_machine.flavor is None and riscv_machine.flavor is None): return render(request, 'main_error.html', {HEADER: site_hdr}) intel_machine.re_init() mips_machine.re_init() riscv_machine.re_init() form = MainForm() else: base = request.POST['base'] if 'language' in request.POST: intel_machine.re_init() mips_machine.re_init() riscv_machine.re_init() form = MainForm() lang = request.POST['language'] curr_reg = getCurrRegister(request.POST) if lang in MIPS: intel_machine.flavor = None riscv_machine.flavor = None mips_machine.flavor = lang mips_machine.base = base site_hdr += ": " + MIPS[lang] + " " + mips_machine.base.upper() hex_conversion(mips_machine) r_reg, f_reg = processRegisters(mips_machine.registers) return render(request, 'main.html', {'form': form, HEADER: site_hdr, 'last_instr': "", 'error': "", 'unwritable': mips_machine.unwritable, 'debug': mips_machine.debug, NXT_KEY: mips_machine.nxt_key, 'registers': mips_machine.registers, 'r_registers': r_reg, 'f_registers': f_reg, 'memory': mips_machine.memory, 'stack': mips_machine.stack, 'symbols': mips_machine.symbols, 'cstack': mips_machine.c_stack, 'flags': mips_machine.flags, 'flavor': mips_machine.flavor, 'data_init': mips_machine.data_init, 'base': mips_machine.base, 'sample': 'none', 'start_ip': mips_machine.start_ip, 'bit_code': "", 'button_type': "", 'changes': [], 'stack_change': "", 'curr_reg': curr_reg }) if lang in INTEL: mips_machine.flavor = None riscv_machine.flavor = None intel_machine.base = base intel_machine.flavor = lang site_hdr += ": " + INTEL[lang] + " " site_hdr += intel_machine.base.upper() hex_conversion(intel_machine) return render(request, 'main.html', {'form': form, HEADER: site_hdr, 'last_instr': "", 'error': "", 'unwritable': intel_machine.unwritable, 'debug': intel_machine.debug, NXT_KEY: intel_machine.nxt_key, 'registers': intel_machine.registers, 'memory': intel_machine.memory, 'stack': intel_machine.stack, 'symbols': intel_machine.symbols, 'cstack': intel_machine.c_stack, 'flags': intel_machine.flags, 'flavor': intel_machine.flavor, DATA_INIT: intel_machine.data_init, 'base': intel_machine.base, 'sample': 'none', 'start_ip': intel_machine.start_ip, 'bit_code': "", 'button_type': "", 'changes': [], 'stack_change': "" }) if lang in RISCV: mips_machine.flavor = None intel_machine.flavor = None riscv_machine.flavor = lang riscv_machine.base = base site_hdr += ": " + RISCV[lang] + " " site_hdr += riscv_machine.base.upper() hex_conversion(riscv_machine) return render(request, 'main.html', {'form': form, HEADER: site_hdr, 'last_instr': "", 'error': "", 'unwritable': riscv_machine.unwritable, 'debug': riscv_machine.debug, NXT_KEY: riscv_machine.nxt_key, 'registers': riscv_machine.registers, 'memory': riscv_machine.memory, 'stack': riscv_machine.stack, 'symbols': riscv_machine.symbols, 'cstack': riscv_machine.c_stack, 'flags': riscv_machine.flags, 'flavor': riscv_machine.flavor, 'data_init': riscv_machine.data_init, 'base': riscv_machine.base, 'sample': 'none', 'start_ip': riscv_machine.start_ip, 'bit_code': "", 'button_type': "", 'changes': [], 'stack_change': "" }) form = MainForm(request.POST) if 'flavor' in request.POST: language = request.POST['flavor'] if language in INTEL: intel_machine.flavor = language intel_machine.base = base mips_machine.flavor = None riscv_machine.flavor = None if language in MIPS: intel_machine.flavor = None mips_machine.flavor = language mips_machine.base = base riscv_machine.flavor = None if language in RISCV: intel_machine.flavor = None mips_machine.flavor = None riscv_machine.flavor = language riscv_machine.base = base sample = request.POST['sample'] button = request.POST['button_type'] if button == CLEAR: intel_machine.re_init() mips_machine.re_init() riscv_machine.re_init() else: intel_machine.changes_init() mips_machine.changes_init() riscv_machine.changes_init() step = (button == STEP) or (button == DEMO) intel_machine.nxt_key = 0 mips_machine.nxt_key = 0 riscv_machine.nxt_key = 0 if step: key = 0 try: key = int(request.POST.get(NXT_KEY, 0)) except Exception: key = 0 if intel_machine.flavor is not None: add_debug("Getting next key", intel_machine) intel_machine.nxt_key = key if mips_machine.flavor is not None: add_debug("Getting next key", mips_machine) mips_machine.nxt_key = key if riscv_machine.flavor is not None: add_debug("Getting next key", riscv_machine) riscv_machine.nxt_key = key if intel_machine.flavor is not None: get_reg_contents(intel_machine.registers, request) get_mem_contents(intel_machine.memory, request) get_stack_contents(intel_machine.stack, request) get_flag_contents(intel_machine.flags, request) intel_machine.data_init = request.POST[DATA_INIT] intel_machine.start_ip = int(request.POST['start_ip']) if mips_machine.flavor is not None: get_reg_contents(mips_machine.registers, request) get_mem_contents(mips_machine.memory, request) get_stack_contents(mips_machine.stack, request) get_flag_contents(mips_machine.flags, request) mips_machine.data_init = request.POST[DATA_INIT] mips_machine.start_ip = int(request.POST['start_ip']) if riscv_machine.flavor is not None: get_reg_contents(riscv_machine.registers, request) get_mem_contents(riscv_machine.memory, request) get_stack_contents(riscv_machine.stack, request) get_flag_contents(riscv_machine.flags, request) riscv_machine.data_init = request.POST[DATA_INIT] riscv_machine.start_ip = int(request.POST['start_ip']) if intel_machine.flavor in INTEL: (last_instr, error, bit_code) = assemble(request.POST[CODE], intel_machine.flavor, intel_machine, step) if mips_machine.flavor in MIPS: (last_instr, error, bit_code) = assemble(request.POST[CODE], mips_machine.flavor, mips_machine, step) if riscv_machine.flavor in RISCV: (last_instr, error, bit_code) = assemble(request.POST[CODE], riscv_machine.flavor, riscv_machine, step) if button == DEMO: if (last_instr == "Reached end of executable code." or last_instr.find("Exiting program") != -1): button = "" elif error != "": button = "" else: button = "" if mips_machine.flavor in MIPS: mips_machine.order_mem() site_hdr += ": " + MIPS[mips_machine.flavor] + " " site_hdr += mips_machine.base.upper() hex_conversion(mips_machine) r_reg, f_reg = processRegisters(mips_machine.registers) curr_reg = getCurrRegister(request.POST) return render(request, 'main.html', {'form': form, HEADER: site_hdr, 'last_instr': last_instr, 'error': error, 'unwritable': mips_machine.unwritable, 'debug': mips_machine.debug, NXT_KEY: mips_machine.nxt_key, 'registers': mips_machine.registers, 'r_registers': r_reg, 'f_registers': f_reg, 'memory': mips_machine.memory, 'stack': mips_machine.stack, 'symbols': mips_machine.symbols, 'cstack': mips_machine.c_stack, 'flags': mips_machine.flags, 'flavor': mips_machine.flavor, DATA_INIT: mips_machine.data_init, 'base': mips_machine.base, 'sample': sample, 'start_ip': mips_machine.start_ip, 'bit_code': bit_code, 'button_type': button, 'changes': mips_machine.changes, 'stack_change': mips_machine.stack_change, 'curr_reg': curr_reg }) if intel_machine.flavor in INTEL: intel_machine.order_mem() site_hdr += ": " + INTEL[intel_machine.flavor] + " " site_hdr += intel_machine.base.upper() hex_conversion(intel_machine) return render(request, 'main.html', {'form': form, HEADER: site_hdr, 'last_instr': last_instr, 'error': error, 'unwritable': intel_machine.unwritable, 'debug': intel_machine.debug, NXT_KEY: intel_machine.nxt_key, 'registers': intel_machine.registers, 'memory': intel_machine.memory, 'stack': intel_machine.stack, 'symbols': intel_machine.symbols, 'cstack': intel_machine.c_stack, 'flags': intel_machine.flags, 'flavor': intel_machine.flavor, DATA_INIT: intel_machine.data_init, 'base': intel_machine.base, 'sample': sample, 'start_ip': intel_machine.start_ip, 'bit_code': bit_code, 'button_type': button, 'changes': intel_machine.changes, 'stack_change': intel_machine.stack_change }) if riscv_machine.flavor in RISCV: riscv_machine.order_mem() site_hdr += ": " + RISCV[riscv_machine.flavor] + " " site_hdr += riscv_machine.base.upper() hex_conversion(riscv_machine) return render(request, 'main.html', {'form': form, HEADER: site_hdr, 'last_instr': last_instr, 'error': error, 'unwritable': riscv_machine.unwritable, 'debug': riscv_machine.debug, NXT_KEY: riscv_machine.nxt_key, 'registers': riscv_machine.registers, 'memory': riscv_machine.memory, 'stack': riscv_machine.stack, 'symbols': riscv_machine.symbols, 'cstack': riscv_machine.c_stack, 'flags': riscv_machine.flags, 'flavor': riscv_machine.flavor, DATA_INIT: riscv_machine.data_init, 'base': riscv_machine.base, 'sample': sample, 'start_ip': riscv_machine.start_ip, 'bit_code': bit_code, 'button_type': button, 'changes': riscv_machine.changes, 'stack_change': riscv_machine.stack_change })
def run_att_test_code(self, filnm): intel_machine.re_init() test_code = self.read_test_code(filnm) assemble(test_code, 'att', intel_machine)