コード例 #1
0
ファイル: DisassemblerHelpers.cs プロジェクト: jorik041/dnSpy
 public static void WriteTo(this Instruction instruction, ITextOutput writer, Func <OpCode, string> getOpCodeDocumentation)
 {
     writer.WriteDefinition(DnlibExtensions.OffsetToString(instruction.GetOffset()), instruction, TextTokenType.Label, false);
     writer.Write(':', TextTokenType.Operator);
     writer.WriteSpace();
     writer.WriteReference(instruction.OpCode.Name, instruction.OpCode, TextTokenType.OpCode);
     if (instruction.Operand != null)
     {
         writer.WriteSpace();
         if (instruction.OpCode == OpCodes.Ldtoken)
         {
             var member = instruction.Operand as IMemberRef;
             if (member != null && member.IsMethod)
             {
                 writer.Write("method", TextTokenType.Keyword);
                 writer.WriteSpace();
             }
             else if (member != null && member.IsField)
             {
                 writer.Write("field", TextTokenType.Keyword);
                 writer.WriteSpace();
             }
         }
         WriteOperand(writer, instruction.Operand);
     }
     if (getOpCodeDocumentation != null)
     {
         var doc = getOpCodeDocumentation(instruction.OpCode);
         if (doc != null)
         {
             writer.Write("\t", TextTokenType.Text);
             writer.Write("// " + doc, TextTokenType.Comment);
         }
     }
 }
コード例 #2
0
 public static void WriteTo(this Instruction instruction, MethodDef method, ITextOutput writer)
 {
     writer.WriteDefinition(DnlibExtensions.OffsetToString(instruction.Offset), instruction);
     writer.Write(": ");
     writer.WriteReference(instruction.OpCode.Name, instruction.OpCode);
     if (instruction.Operand != null)
     {
         writer.Write(' ');
         if (instruction.OpCode == OpCodes.Ldtoken)
         {
             MemberRef member = instruction.Operand as MemberRef;
             if ((member != null && member.IsMethodRef) || instruction.Operand is MethodDef || instruction.Operand is MethodSpec)
             {
                 writer.Write("method ");
             }
             else if ((member != null && member.IsFieldRef) || instruction.Operand is FieldDef)
             {
                 writer.Write("field ");
             }
         }
         WriteOperand(writer, instruction.Operand.ResolveGenericParams(method));
     }
 }
コード例 #3
0
 public static void WriteOffsetReference(ITextOutput writer, Instruction instruction)
 {
     writer.WriteReference(DnlibExtensions.OffsetToString(instruction.Offset), instruction);
 }
コード例 #4
0
        public static void WriteTo(this Instruction instruction, ITextOutput writer, DisassemblerOptions options, uint baseRva, long baseOffs, IInstructionBytesReader byteReader, MethodDef method)
        {
            if (options != null && (options.ShowTokenAndRvaComments || options.ShowILBytes))
            {
                writer.Write("/* ", TextTokenType.Comment);

                bool needSpace = false;

                if (options.ShowTokenAndRvaComments)
                {
                    ulong fileOffset = (ulong)baseOffs + instruction.Offset;
                    writer.WriteReference(string.Format("0x{0:X8}", fileOffset), new AddressReference(options.OwnerModule == null ? null : options.OwnerModule.Location, false, fileOffset, (ulong)instruction.GetSize()), TextTokenType.Comment, false);
                    needSpace = true;
                }

                if (options.ShowILBytes)
                {
                    if (needSpace)
                    {
                        writer.Write(' ', TextTokenType.Comment);
                    }
                    if (byteReader == null)
                    {
                        writer.Write("??", TextTokenType.Comment);
                    }
                    else
                    {
                        int size = instruction.GetSize();
                        for (int i = 0; i < size; i++)
                        {
                            var b = byteReader.ReadByte();
                            if (b < 0)
                            {
                                writer.Write("??", TextTokenType.Comment);
                            }
                            else
                            {
                                writer.Write(string.Format("{0:X2}", b), TextTokenType.Comment);
                            }
                        }
                        // Most instructions should be at most 5 bytes in length, but use 6 since
                        // ldftn/ldvirtftn are 6 bytes long. The longest instructions are those with
                        // 8 byte operands, ldc.i8 and ldc.r8: 9 bytes.
                        const int MIN_BYTES = 6;
                        for (int i = size; i < MIN_BYTES; i++)
                        {
                            writer.Write("  ", TextTokenType.Comment);
                        }
                    }
                }

                writer.Write(" */", TextTokenType.Comment);
                writer.WriteSpace();
            }
            writer.WriteDefinition(DnlibExtensions.OffsetToString(instruction.GetOffset()), new InstructionReference(method, instruction), TextTokenType.Label, false);
            writer.Write(':', TextTokenType.Operator);
            writer.WriteSpace();
            writer.WriteReference(instruction.OpCode.Name, instruction.OpCode, TextTokenType.OpCode);
            if (instruction.Operand != null)
            {
                int count = OPERAND_ALIGNMENT - instruction.OpCode.Name.Length;
                if (count <= 0)
                {
                    count = 1;
                }
                writer.Write(spaces[count], TextTokenType.Text);
                if (instruction.OpCode == OpCodes.Ldtoken)
                {
                    var member = instruction.Operand as IMemberRef;
                    if (member != null && member.IsMethod)
                    {
                        writer.Write("method", TextTokenType.Keyword);
                        writer.WriteSpace();
                    }
                    else if (member != null && member.IsField)
                    {
                        writer.Write("field", TextTokenType.Keyword);
                        writer.WriteSpace();
                    }
                }
                WriteOperand(writer, instruction.Operand, method);
            }
            if (options != null && options.GetOpCodeDocumentation != null)
            {
                var doc = options.GetOpCodeDocumentation(instruction.OpCode);
                if (doc != null)
                {
                    writer.Write("\t", TextTokenType.Text);
                    writer.Write("// " + doc, TextTokenType.Comment);
                }
            }
        }
コード例 #5
0
        public static void WriteOffsetReference(ITextOutput writer, Instruction instruction, MethodDef method, TextTokenType tokenType = TextTokenType.Label)
        {
            var r = instruction == null ? null : method == null ? (object)instruction : new InstructionReference(method, instruction);

            writer.WriteReference(DnlibExtensions.OffsetToString(instruction.GetOffset()), r, tokenType);
        }
コード例 #6
0
ファイル: DisassemblerHelpers.cs プロジェクト: jorik041/dnSpy
 public static void WriteOffsetReference(ITextOutput writer, Instruction instruction, TextTokenType tokenType = TextTokenType.Label)
 {
     writer.WriteReference(DnlibExtensions.OffsetToString(instruction.GetOffset()), instruction, tokenType);
 }
コード例 #7
0
 public void WriteTo(TextWriter writer)
 {
     foreach (Instruction prefix in this.Prefixes)
     {
         Disassembler.DisassemblerHelpers.WriteTo(prefix, new PlainTextOutput(writer));
         writer.WriteLine();
     }
     if (Instruction != null && Instruction.Offset >= 0)
     {
         writer.Write(DnlibExtensions.OffsetToString(Instruction.Offset));
         writer.Write(": ");
     }
     if (Target != null)
     {
         writer.Write(Target.ToString());
         writer.Write(" = ");
     }
     if (IsMoveInstruction)
     {
         writer.Write(Operands[0].ToString());
         if (Instruction != null)
         {
             writer.Write(" (" + Instruction.OpCode.Name + ")");
         }
     }
     else
     {
         if (Instruction == null)
         {
             writer.Write(SpecialOpCode.ToString());
         }
         else
         {
             writer.Write(Instruction.OpCode.Name);
             if (null != Instruction.Operand)
             {
                 writer.Write(' ');
                 Disassembler.DisassemblerHelpers.WriteOperand(new PlainTextOutput(writer), Instruction.Operand);
                 writer.Write(' ');
             }
         }
         if (TypeOperand != null)
         {
             writer.Write(' ');
             writer.Write(TypeOperand.ToString());
             writer.Write(' ');
         }
         if (Operands.Length > 0)
         {
             writer.Write('(');
             for (int i = 0; i < Operands.Length; i++)
             {
                 if (i > 0)
                 {
                     writer.Write(", ");
                 }
                 writer.Write(Operands[i].ToString());
             }
             writer.Write(')');
         }
     }
 }