public ScanResults ScanInstructions(ScanResults sr) { var ranges = FindUnscannedRanges().ToList(); DumpRanges(ranges); var binder = new StorageBinder(); var shsc = new ShingledScanner(this.program, this.host, binder, sr, this.eventListener); bool unscanned = false; foreach (var range in ranges) { unscanned = true; try { shsc.ScanRange(range.Item1, range.Item2, range.Item3, range.Item3.ToLinear() - range.Item2.ToLinear()); } catch (AddressCorrelatedException aex) { host.Error(aex.Address, aex.Message); } } if (!unscanned) { // No unscanned blocks were found. return(null); } shsc.Dump("After shingle scan graph built"); return(sr); }
/// <summary> /// Given an image reader positioned at a Keil sparse switch table, generates /// an <see cref="RtlInstructionCluster" /> that implements the table as a /// sequence of RTL if-instructions. /// </summary> private RtlInstructionCluster MakeCluster(Address addrPatch, ImageReader rdr) { var binder = new StorageBinder(); var areg = binder.EnsureRegister(Registers.A); var m = new RtlEmitter(new List <RtlInstruction>()); while (rdr.TryReadBeUInt16(out ushort uAddrDst)) { if (uAddrDst == 0) { if (!rdr.TryReadBeUInt16(out uAddrDst)) { break; } m.Goto(Address.Ptr16(uAddrDst)); break; } if (!rdr.TryReadByte(out byte bValue)) { break; } var addrDst = Address.Ptr16(uAddrDst); m.BranchInMiddleOfInstruction(m.Eq(areg, bValue), addrDst, InstrClass.ConditionalTransfer); } int length = (int)(rdr.Address - addrPatch); var cluster = m.MakeCluster(addrPatch, length, InstrClass.Transfer); return(cluster); }
public void Stgb_Sequence() { var stgb = new StorageBinder(); var r1 = RegisterStorage.Reg32("r1", 1); var r2 = RegisterStorage.Reg32("r2", 2); var r3 = RegisterStorage.Reg32("r3", 3); var seqA = stgb.EnsureSequence(PrimitiveType.CreateWord(96), r1, r2, r3); var seqB = stgb.EnsureSequence(PrimitiveType.CreateWord(96), r1, r2, r3); Assert.AreSame(seqA, seqB); }
public void Stgb_FlagReg() { var stgb = new StorageBinder(); var flagReg1 = new RegisterStorage("flagreg1", 41, 0, PrimitiveType.Word32); var flagReg2 = new RegisterStorage("flagreg2", 42, 0, PrimitiveType.Word32); var grf = stgb.EnsureFlagGroup(flagReg1, 0x05, "CZ", PrimitiveType.Byte); var grf2 = stgb.EnsureFlagGroup(flagReg1, 0x05, "CZ", PrimitiveType.Byte); Assert.AreSame(grf, grf2); var grf3 = stgb.EnsureFlagGroup(flagReg2, 0x05, "cz", PrimitiveType.Byte); Assert.AreNotSame(grf, grf3); }
public void Setup() { arch = new FakeArchitecture(); program = new Program { Architecture = arch, SegmentMap = new SegmentMap( Address.Ptr32(0x00120000), new ImageSegment( ".text", new MemoryArea(Address.Ptr32(0x00120000), new byte[0x10000]), AccessMode.ReadExecute)) }; binder = new StorageBinder(); graph = new DiGraph <RtlBlock>(); host = new RtlBackwalkHost(program, graph); }