Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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()));
        }
Beispiel #3
0
        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));
        }