/// <summary> /// Formats a single instruction /// </summary> /// <param name="src">The source instruction</param> /// <param name="pad"></param> public static string Format(this AsmInstructionInfo src, int?pad = null) { var address = src.Offset.FormatHex(true, true, false, false); var content = src.Display.PadRight(pad ?? 24, AsciSym.Space); var encodingKind = !string.IsNullOrWhiteSpace(src.EncodingKind) ? $"{src.EncodingKind}, " : string.Empty; var encodingLen = concat( src.Encoding.Length.ToString(), AsciSym.Space, src.Encoding.Length > 1 ? "bytes" : "byte " ); var encoding = $" encoding({encodingKind}{encodingLen}) = " + src.Encoding.FormatHex(AsciSym.Space, true, false); var operands = src.FormatOperands(); var title = concat(src.Mnemonic, AsciSym.LParen, src.OpCode, AsciSym.RParen); return((address + AsciSym.Space + content + "; " + title + " " + operands).PadRight(90, AsciSym.Space) + encoding); }
/// <summary> /// Formats the operands contained in an instruction /// </summary> /// <param name="src">The instruction description</param> /// <param name="sep">The operand separator</param> public static string FormatOperands(this AsmInstructionInfo src, char?sep = null) { var count = src.Operands.Length; if (count == 0) { return(string.Empty); } var sb = sbuild(); for (var i = 0; i < src.Operands.Length; i++) { sb.Append(src.Operands[i].Format()); if (i != src.Operands.Length - 1) { sb.Append(sep ?? AsciSym.Comma); } } return(bracket(sb.ToString())); }
public static AsmFuncInfo DistillAsm(this MethodDisassembly src) { var asm = src.AsmBody; var inxcount = asm.Instructions.Length; var code = asm.NativeBlocks.Single().Data; Span <byte> codespan = code; var inxs = new AsmInstructionInfo[inxcount]; var inxsfmt = asm.FormatInstructions(); for (var i = 0; i < asm.Instructions.Length; i++) { var inx = asm.Instructions[i]; var operands = inx.DistillOperands(asm); var offset = (ushort)(inx.IP - asm.StartAddress); var encoded = codespan.Slice(offset, inx.ByteLength).ToArray(); var mnemonic = inx.Mnemonic.ToString().ToUpper(); var opcode = inx.Code.ToString(); var enckind = inx.Encoding == EncodingKind.Legacy ? string.Empty : inx.Encoding.ToString(); inxs[i] = new AsmInstructionInfo(offset, inxsfmt[i], mnemonic, opcode, operands, enckind, encoded); } return(new AsmFuncInfo(asm.StartAddress, asm.EndAddress, src.MethodSig, inxs, code)); }