예제 #1
0
파일: Dumper.cs 프로젝트: qcyb/reko
        public void DumpAssembler(SegmentMap map, IProcessorArchitecture arch, Address addrStart, Address addrLast, Formatter formatter)
        {
            if (!map.TryFindSegment(addrStart, out var segment))
            {
                return;
            }
            var dasm = arch.CreateDisassembler(arch.CreateImageReader(segment.MemoryArea, addrStart));

            try
            {
                var writer  = new InstrWriter(formatter);
                var options = new MachineInstructionRendererOptions(
                    flags: MachineInstructionRendererFlags.ResolvePcRelativeAddress,
                    syntax: "");
                foreach (var instr in dasm)
                {
                    if (instr.Address ! >= addrLast)
                    {
                        break;
                    }
                    if (!DumpAssemblerLine(segment.MemoryArea, arch, instr, writer, options))
                    {
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                formatter.WriteLine(ex.Message);
                formatter.WriteLine();
            }
        }
예제 #2
0
        public void DumpAssembler(SegmentMap map, Address addrStart, Address addrLast, TextWriter writer)
        {
            ImageSegment segment;

            if (!map.TryFindSegment(addrStart, out segment))
            {
                return;
            }
            var dasm = arch.CreateDisassembler(arch.CreateImageReader(segment.MemoryArea, addrStart));

            try
            {
                foreach (var instr in dasm)
                {
                    if (instr.Address >= addrLast)
                    {
                        break;
                    }
                    if (!DumpAssemblerLine(segment.MemoryArea, instr, writer))
                    {
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                writer.WriteLine(ex.Message);
                writer.WriteLine();
            }
        }
예제 #3
0
파일: Dumper.cs 프로젝트: nemerle/reko
        public void DumpAssembler(
            IProcessorArchitecture arch,
            MemoryArea mem,
            Address addrStart,
            long cbBytes,
            Formatter formatter)
        {
            var dasm = arch.CreateDisassembler(arch.CreateImageReader(mem, addrStart));

            try
            {
                var writer  = new InstrWriter(formatter);
                var options = new MachineInstructionRendererOptions(
                    flags: MachineInstructionRendererFlags.ResolvePcRelativeAddress,
                    syntax: "");
                foreach (var instr in dasm)
                {
                    if (cbBytes <= 0)
                    {
                        break;
                    }
                    if (!DumpAssemblerLine(mem, arch, instr, writer, options))
                    {
                        break;
                    }

                    cbBytes -= instr.Length;
                }
            }
            catch (Exception ex)
            {
                formatter.WriteLine(ex.Message);
                formatter.WriteLine();
            }
        }
예제 #4
0
        public void DumpAssembler(SegmentMap map, IProcessorArchitecture arch, Address addrStart, Address addrLast, Formatter formatter)
        {
            if (!map.TryFindSegment(addrStart, out var segment))
            {
                return;
            }
            var dasm = arch.CreateDisassembler(arch.CreateImageReader(segment.MemoryArea, addrStart));

            try
            {
                var writer = new InstrWriter(formatter);
                foreach (var instr in dasm)
                {
                    if (instr.Address >= addrLast)
                    {
                        break;
                    }
                    if (!DumpAssemblerLine(segment.MemoryArea, arch, instr, writer))
                    {
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                formatter.WriteLine(ex.Message);
                formatter.WriteLine();
            }
        }
예제 #5
0
 public IEnumerable <MachineInstruction> CreateDisassembler(IProcessorArchitecture arch, Address addr)
 {
     if (!SegmentMap.TryFindSegment(addr, out var segment))
     {
         throw new ArgumentException(string.Format("The address {0} is invalid.", addr));
     }
     return(arch.CreateDisassembler(
                arch.CreateImageReader(segment.MemoryArea, addr)));
 }
예제 #6
0
        private static void AssertEqual(IProcessorArchitecture arch, string sExpected, string hexString)
        {
            var bytes   = BytePattern.FromHexBytes(hexString);
            var mem     = new ByteMemoryArea(Address.Ptr32(0x0010_0000), bytes);
            var rdr     = mem.CreateLeReader(0);
            var dasm    = arch.CreateDisassembler(rdr);
            var instr   = (X86Instruction)dasm.First();
            var sActual = instr.ToString("A");

            Assert.AreEqual(sExpected, sActual);
        }
예제 #7
0
        public Sifter(string[] args)
        {
            this.cfgSvc       = RekoConfigurationService.Load("reko/reko.config");
            this.processInstr = new Action <byte[], MachineInstruction?>(ProcessInstruction);
            (this.arch, this.instrRenderer) = ProcessArgs(args);
            var baseAddress = Address.Ptr32(0x00000000);    //$TODO allow customization?

            this.mem      = new MemoryArea(baseAddress, new byte[100]);
            this.rdr      = arch.CreateImageReader(mem, 0);
            this.dasm     = arch.CreateDisassembler(rdr);
            this.progress = new Progress();
        }
예제 #8
0
        private long PerformanceTest_A32Dasm(IProcessorArchitecture arch, byte[] buf)
        {
            var       mem  = new MemoryArea(Address.Ptr32(0x00100000), buf);
            var       rdr  = arch.CreateImageReader(mem, mem.BaseAddress);
            var       dasm = arch.CreateDisassembler(rdr);
            Stopwatch sw   = new Stopwatch();

            sw.Start();
            foreach (var instr in dasm)
            {
            }
            sw.Stop();
            var time = sw.ElapsedMilliseconds;

            return(time);
        }
예제 #9
0
파일: Dumper.cs 프로젝트: mmyydd/reko
        public void DumpAssembler(LoadedImage image, Address addrStart, Address addrLast, TextWriter writer)
        {
            var dasm = arch.CreateDisassembler(arch.CreateImageReader(image, addrStart));

            try
            {
                foreach (var instr in dasm)
                {
                    if (instr.Address >= addrLast)
                    {
                        break;
                    }
                    if (!DumpAssemblerLine(image, instr, writer))
                    {
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                writer.WriteLine(ex.Message);
                writer.WriteLine();
            }
        }
예제 #10
0
 protected virtual IEnumerator <MachineInstruction> CreateDisassembler(IProcessorArchitecture arch, EndianImageReader rdr)
 {
     return(arch.CreateDisassembler(rdr).GetEnumerator());
 }
예제 #11
0
 protected virtual IEnumerator<MachineInstruction> CreateDisassembler(IProcessorArchitecture arch, ImageReader rdr)
 {
     return arch.CreateDisassembler(rdr).GetEnumerator();
 }
예제 #12
0
 private void InitializeRekoDisassembler()
 {
     this.rdr  = arch.CreateImageReader(mem, 0);
     this.dasm = arch.CreateDisassembler(rdr);
 }