def compute(asm, inputstate={}, debug=False): loc_db = LocationDB() sympool = dict(regs_init) sympool.update({k: ExprInt(v, k.size) for k, v in viewitems(inputstate)}) ir_tmp = ir_arch(loc_db) ircfg = ir_tmp.new_ircfg() symexec = SymbolicExecutionEngine(ir_tmp, sympool) instr = mn.fromstring(asm, loc_db, "b") code = mn.asm(instr)[0] instr = mn.dis(code, "b") instr.offset = inputstate.get(PC, 0) lbl = ir_tmp.add_instr_to_ircfg(instr, ircfg) symexec.run_at(ircfg, lbl) if debug: for k, v in viewitems(symexec.symbols): if regs_init.get(k, None) != v: print(k, v) out = {} for k, v in viewitems(symexec.symbols): if k in EXCLUDE_REGS: continue elif regs_init.get(k, None) == v: continue elif isinstance(v, ExprInt): out[k] = int(v) else: out[k] = v return out
('b', "XXXXXXXX SUBFIC R0, R2, 0xFFFFFFE0", "2002ffe0"), ('b', "XXXXXXXX SUBFIC R11, R31, 0x0", "217f0000"), ('b', "XXXXXXXX TW 0x5, R0, R3", "7ca01808"), ('b', "XXXXXXXX TWI 0x5, R0, 0x12", "0ca00012"), ('b', "XXXXXXXX XORI R9, R0, 0x62", "68090062"), ('b', "XXXXXXXX XORIS R10, R10, 0x8000", "6d4a8000"), ] ts = time.time() for mode, s, l, in reg_tests: print("-" * 80) s = s[12:] b = h2i(l) print("fromstring %r" % s) l = mn_ppc.fromstring(s, None, mode) for x in mn_ppc.asm(l): print('(%r, "XXXXXXXX %s", "%s"),' % (mode, l, encode_hex(x))) print("%s %r" % (mode, b)) mn = mn_ppc.dis(b, mode) print("dis args %s" % [(str(x), x.size) for x in mn.args]) print(s) print(mn) assert(str(mn).strip() == s) print('fromstring %r' % s) l = mn_ppc.fromstring(s, None, mode) print('str args %s' % [(str(x), x.size) for x in l.args]) assert(str(l).strip(' ') == s) a = mn_ppc.asm(l) print('asm result %s' % [x for x in a]) print(repr(b)) print(l.to_html())