Пример #1
0
        /// <summary>
        /// Write register mask. Bits are:
        ///  15  14  13  12  11  10   9   8   7   6   5   4   3   2   1   0
        ///  d0  d1  d2  d3  d4  d5  d6  d7  a0  a1  a2  a3  a4  a5  a6  a7
        /// </summary>
        /// <param name="data"></param>
        /// <param name="bitPos"></param>
        /// <param name="incr"></param>
        /// <param name="regType"></param>
        /// <param name="writer"></param>
        public void WriteRegisterSet(uint data, MachineInstructionWriter writer)
        {
            string sep    = "";
            int    maxReg = this.Width.Domain == Domain.Real ? 8 : 16;
            int    bitPos = maxReg - 1;

            for (int i = 0; i < maxReg; i++, --bitPos)
            {
                if (bit(data, bitPos))
                {
                    int first      = i;
                    int run_length = 0;
                    while (i != 7 && i != 15 && bit(data, bitPos - 1))
                    {
                        --bitPos;
                        ++i;
                        ++run_length;
                    }
                    writer.Write(sep);
                    writer.Write(GetRegister(first).ToString());
                    if (run_length > 0)
                    {
                        writer.Write("-{0}", GetRegister(first + run_length));
                    }
                    sep = "/";
                }
            }
        }
Пример #2
0
        public override void Write(bool fExplicit, MachineInstructionWriter writer)
        {
            writer.Write("#");
            long imm8 = Value.ToInt64();

            if (imm8 > 256 && ((imm8 & (imm8 - 1)) == 0))
            {
                /* only one bit set, and that later than bit 8.
                 * Represent as 1<<... .
                 */
                writer.Write("1<<");
                uint n = 0;
                while ((imm8 & 0xF) == 0)
                {
                    n += 4; imm8 = imm8 >> 4;
                }
                // Now imm8 is 1, 2, 4 or 8.
                n += (uint)((0x30002010 >> (int)(4 * (imm8 - 1))) & 15);
                writer.Write(n);
            }
            else
            {
                if (imm8 < 0 && imm8 > -100)
                {
                    writer.Write('-'); imm8 = -imm8;
                }
                writer.Write("&{0:X}", imm8);
            }
        }
Пример #3
0
        /// <summary>
        /// Write register mask. Bits are:
        ///  15  14  13  12  11  10   9   8   7   6   5   4   3   2   1   0
        ///  d0  d1  d2  d3  d4  d5  d6  d7  a0  a1  a2  a3  a4  a5  a6  a7
        /// </summary>
        /// <param name="data"></param>
        /// <param name="bitPos"></param>
        /// <param name="incr"></param>
        /// <param name="regType"></param>
        /// <param name="writer"></param>
        public void WriteRegisterSet(uint data, MachineInstructionWriter writer)
        {
            string sep    = "";
            int    bitPos = 15;

            for (int i = 0; i < 16; i++, --bitPos)
            {
                if (bit(data, bitPos))
                {
                    int first      = i;
                    int run_length = 0;
                    while (i != 7 && i != 15 && bit(data, bitPos - 1))
                    {
                        --bitPos;
                        ++i;
                        ++run_length;
                    }
                    writer.Write(sep);
                    writer.Write(Registers.GetRegister(first).ToString());
                    if (run_length > 0)
                    {
                        writer.Write("-{0}", Registers.GetRegister(first + run_length));
                    }
                    sep = "/";
                }
            }
        }
Пример #4
0
        public override void Write(MachineInstructionWriter writer, MachineInstructionWriterOptions options)
        {
            var s  = FormatValue(value);
            var pt = value.DataType as PrimitiveType;

            if (pt != null)
            {
                if (pt.Domain == Domain.Pointer)
                {
                    writer.WriteAddress(s, Address.FromConstant(value));
                }
                else
                {
                    writer.Write(s);
                }
            }
            else if (value.DataType is Pointer)
            {
                writer.WriteAddress(s, Address.FromConstant(value));
            }
            else
            {
                writer.Write(s);
            }
        }
Пример #5
0
 public void Write(MachineOperand op, MachineInstructionWriter writer)
 {
     var imm = op as ImmediateOperand;
     if (imm != null)
     {
         writer.Write("#");
         int imm8 = imm.Value.ToInt32();
         if (imm8 > 256 && ((imm8 & (imm8 - 1)) == 0))
         {
             /* only one bit set, and that later than bit 8.
              * Represent as 1<<... .
              */
             writer.Write("1<<");
             {
                 uint n = 0;
                 while ((imm8 & 15) == 0)
                 {
                     n += 4; imm8 = imm8 >> 4;
                 }
                 // Now imm8 is 1, 2, 4 or 8. 
                 n += (uint)((0x30002010 >> (int)(4 * (imm8 - 1))) & 15);
                 writer.Write(n);
             }
         }
         else
         {
             var fmt = (-9 <= imm8 && imm8 <= 9) ? "{0}{1}" : "&{0}{1:X}";
             var sign = "";
             if (((int)imm8) < 0 && ((int)imm8) > -100)
             {
                 imm8 = -imm8;
                 sign = "-";
             }
             writer.Write(fmt,sign,imm8);
         }
         return;
     }
     var adr = op as AddressOperand;
     if (adr != null)
     {
         adr.Write(false, writer);
         return;
     }
     var mem = op as ArmMemoryOperand;
     if (mem != null)
     {
         mem.Write(false, writer);
         return;
     }
     var sh = op as ShiftOperand;
     if (sh != null)
     {
         sh.Write(false, writer);
         return;
     }
     if (op == null)
         writer.Write("<null>");
     else 
         op.Write(false, writer);
 }
Пример #6
0
 public override void Write(bool fExplicit, MachineInstructionWriter writer)
 {
     if (Base != null)
     {
         if (Offset != null)
         {
             int offset = Offset.ToInt32();
             string fmt;
             if (offset > 0)
             {
                 fmt = "({0}+{1:X2})";
             } 
             else if (offset < 0)
             {
                 offset = -offset;
                 fmt = "({0}-{1:X2})";
             }
             else 
             {
                 fmt = "({0})";
             }
             writer.Write(string.Format(fmt, Base, offset));
         }
         else
         {
             writer.Write(string.Format("({0})", Base));
         }
     }
     else
     {
         writer.Write("(");
         writer.WriteAddress(string.Format("{0:X4}", Offset.ToUInt16()), Address.Ptr16(Offset.ToUInt16()));
         writer.Write(")");
     }
 }
Пример #7
0
 private void Write(MachineOperand op, MachineInstructionWriter writer)
 {
     var reg = op as RegisterOperand;
     if (reg != null)
     {
         writer.Write("%{0}", reg.Register.Name);
         return;
     }
     var imm = op as ImmediateOperand;
     if (imm != null)
     {
         writer.Write(imm.Value.ToString());
         return;
     }
     var mem = op as MemoryOperand;
     if (mem != null)
     {
         mem.Write(false, writer);
         return;
     }
     var idx = op as IndexedMemoryOperand;
     if (idx != null)
     {
         idx.Write(false, writer);
         return;
     }
     writer.Write(op.ToString());
 }
Пример #8
0
 public override void Render(MachineInstructionWriter writer)
 {
     if (code == Opcode.illegal && op1 != null && writer.Platform != null)
     {
         var imm = op1 as M68kImmediateOperand;
         // MacOS uses invalid opcodes to invoke Macintosh Toolbox services. 
         // We may have to generalize the Platform API to allow specifying 
         // the opcode of the invoking instruction, to disambiguate from 
         // "legitimate" TRAP calls.
         var svc = writer.Platform.FindService((int)imm.Constant.ToUInt32(), null);
         if (svc != null)
         {
             writer.Write(svc.Name);
             return;
         }
     }
     if (dataWidth != null)
     {
         writer.WriteOpcode(string.Format("{0}{1}", code, DataSizeSuffix(dataWidth)));
     }
     else
     {
         writer.WriteOpcode(code.ToString());
     }
     writer.Tab();
     if (op1 != null)
     {
         op1.Write(false, writer);
         if (op2 != null)
         {
             writer.Write(',');
             op2.Write(false, writer);
         }
     }
 }
Пример #9
0
        public override void Render(MachineInstructionWriter writer, MachineInstructionWriterOptions options)
        {
            var op = string.Format("{0}{1}",
                                   opcode,
                                   setsCR0 ? "." : "");

            writer.WriteOpcode(op);
            if (op1 != null)
            {
                writer.Tab();
                op1.Write(writer, options);
                if (op2 != null)
                {
                    writer.Write(',');
                    op2.Write(writer, options);
                    if (op3 != null)
                    {
                        writer.Write(',');
                        op3.Write(writer, options);
                        if (op4 != null)
                        {
                            writer.Write(",");
                            op4.Write(writer, options);
                            if (op5 != null)
                            {
                                writer.Write(",");
                                op5.Write(writer, options);
                            }
                        }
                    }
                }
            }
        }
Пример #10
0
 private void WriteImmShift(string op, int value, MachineInstructionWriter writer)
 {
     writer.Write(",");
     writer.WriteOpcode(op);
     writer.Write(" #");
     WriteImmediateValue(value, writer);
 }
Пример #11
0
 private void WriteRegShift(string op, int value, MachineInstructionWriter writer)
 {
     writer.Write(",");
     writer.WriteOpcode(op);
     writer.Write(' ');
     writer.Write(A32Registers.RegisterByCapstoneID[(ArmRegister)value].Name);
 }
Пример #12
0
 private static void WriteImmediateValue(long imm, MachineInstructionWriter writer)
 {
     writer.Write("#");
     if (imm > 256 && ((imm & (imm - 1)) == 0))
     {
         /* only one bit set, and that later than bit 8.
          * Represent as 1<<... .
          */
         writer.Write("1<<");
         uint n = 0;
         while ((imm & 0xF) == 0)
         {
             n += 4; imm = imm >> 4;
         }
         // Now imm8 is 1, 2, 4 or 8.
         n += (uint)((0x30002010 >> (int)(4 * (imm - 1))) & 15);
         writer.Write(n);
     }
     else
     {
         if (imm < 0 && imm > -100)
         {
             writer.Write('-'); imm = -imm;
         }
         writer.Write("&{0:X}", imm);
     }
 }
Пример #13
0
        public override void Render(MachineInstructionWriter writer, MachineInstructionWriterOptions options)
        {
            string name;

            if (!opcodeNames.TryGetValue(opcode, out name))
            {
                name = opcode.ToString();
            }
            writer.WriteOpcode(name);
            if (op1 == null)
            {
                return;
            }
            writer.Tab();
            WriteOp(op1, writer);
            if (op2 == null)
            {
                return;
            }
            writer.Write(',');
            WriteOp(op2, writer);
            if (op3 == null)
            {
                return;
            }
            writer.Write(',');
            WriteOp(op3, writer);
            if (op4 == null)
            {
                return;
            }
            writer.Write(',');
            WriteOp(op4, writer);
        }
Пример #14
0
        private void WriteOp(MachineOperand op, MachineInstructionWriter writer)
        {
            var rop = op as RegisterOperand;

            if (rop != null)
            {
                writer.Write(rop.Register.Name);
                return;
            }
            var immop = op as ImmediateOperand;

            if (immop != null)
            {
                writer.Write(immop.Value.ToString());
                return;
            }
            var addrop = op as AddressOperand;

            if (addrop != null)
            {
                //$TODO: 32-bit?
                writer.WriteAddress(string.Format("{0:X16}", addrop.Address.ToLinear()), addrop.Address);
                return;
            }
            throw new NotImplementedException();
        }
Пример #15
0
 private static void WriteImmediateValue(int imm8, MachineInstructionWriter writer)
 {
     if (imm8 > 256 && ((imm8 & (imm8 - 1)) == 0))
     {
         /* only one bit set, and that later than bit 8.
          * Represent as 1<<... .
          */
         writer.Write("1<<");
         {
             uint n = 0;
             while ((imm8 & 15) == 0)
             {
                 n += 4; imm8 = imm8 >> 4;
             }
             // Now imm8 is 1, 2, 4 or 8.
             n += (uint)((0x30002010 >> (int)(4 * (imm8 - 1))) & 15);
             writer.Write(n);
         }
     }
     else
     {
         var fmt  = (-9 <= imm8 && imm8 <= 9) ? "{0}{1}" : "&{0}{1:X}";
         var sign = "";
         if (((int)imm8) < 0 && ((int)imm8) > -100)
         {
             imm8 = -imm8;
             sign = "-";
         }
         writer.Write(fmt, sign, imm8);
     }
 }
Пример #16
0
 public override void Render(MachineInstructionWriter writer)
 {
     writer.WriteOpcode(string.Format("{0}{1}{2}",
                                      Opcode,
                                      Cond != Condition.al ? Cond.ToString() : "",
                                      OpFlags != OpFlags.None ? OpFlags.ToString().ToLower() : ""));
     if (Dst != null)
     {
         writer.Tab();
         Write(Dst, writer);
         if (Update)
         {
             writer.Write("!");
         }
         if (Src1 != null)
         {
             writer.Write(",");
             Write(Src1, writer);
             if (Src2 != null)
             {
                 writer.Write(",");
                 Write(Src2, writer);
                 if (Src3 != null)
                 {
                     writer.Write(",");
                     Write(Src3, writer);
                 }
             }
         }
     }
 }
Пример #17
0
        private void Write(MachineOperand op, MachineInstructionWriter writer, MachineInstructionWriterOptions options)
        {
            var memOp = op as MemoryOperand;

            if (memOp != null)
            {
                if (memOp.Base == Registers.rip)
                {
                    var addr = this.Address + this.Length + memOp.Offset.ToInt32();
                    if ((options & MachineInstructionWriterOptions.ResolvePcRelativeAddress) != 0)
                    {
                        writer.Write("[");
                        writer.WriteAddress(addr.ToString(), addr);
                        writer.Write("]");
                        writer.AddAnnotation(op.ToString());
                    }
                    else
                    {
                        op.Write(writer, options);
                        writer.AddAnnotation(addr.ToString());
                    }
                    return;
                }
            }
            op.Write(writer, options);
        }
Пример #18
0
        private void Write(Arm64InstructionOperand op, MachineInstructionWriter writer)
        {
            switch (op.Type)
            {
            case Arm64InstructionOperandType.Register:
                writer.Write(A64Registers.RegisterByCapstoneID[op.RegisterValue.Value].Name);
                return;

            case Arm64InstructionOperandType.Immediate:
                if (IsJump())
                {
                    writer.Write("${0:X16}", op.ImmediateValue.Value);
                }
                else
                {
                    WriteImmediateValue(op.ImmediateValue.Value, writer);
                    if (op.Shifter != null)
                    {
                        this.WriteShift(op, writer);
                    }
                }
                return;
            }
            throw new NotImplementedException(op.Type.ToString());
        }
Пример #19
0
        public override void Render(MachineInstructionWriter writer, MachineInstructionWriterOptions options)
        {
            writer.WriteOpcode(instruction.Mnemonic);
            var ops = Internal.ArchitectureDetail.Operands;

            if (ops.Length < 1)
            {
                return;
            }
            writer.Tab();
            Write(ops[0], writer);
            if (ops.Length < 2)
            {
                return;
            }
            writer.Write(",");
            Write(ops[1], writer);
            if (ops.Length < 3)
            {
                return;
            }
            writer.Write(",");
            Write(ops[2], writer);
            if (ops.Length < 4)
            {
                return;
            }
            writer.Write(",");
            Write(ops[3], writer);
        }
Пример #20
0
        public override void Render(MachineInstructionWriter writer)
        {
            writer.Write("{0} ", Address.ToLinear());
            bool inString = false;

            for (int i = 0; i < Line.Length; ++i)
            {
                int b = Line[i];
                if (inString)
                {
                    writer.Write(Encoding.UTF8.GetString(Line, i, 1));
                    inString = (b != 0x22);
                }
                else
                {
                    if (TokenMin <= b && b < TokenMax)
                    {
                        writer.Write(TokenStrs[b - TokenMin]);
                    }
                    else
                    {
                        writer.Write(Encoding.UTF8.GetString(Line, i, 1));
                    }
                    inString = (b == 0x22);
                }
            }
        }
Пример #21
0
 public override void Write(bool fExplicit, MachineInstructionWriter writer)
 {
     if (Base != null)
     {
         if (Offset != null)
         {
             int    offset = Offset.ToInt32();
             string fmt;
             if (offset > 0)
             {
                 fmt = "({0}+{1:X2})";
             }
             else if (offset < 0)
             {
                 offset = -offset;
                 fmt    = "({0}-{1:X2})";
             }
             else
             {
                 fmt = "({0})";
             }
             writer.Write(string.Format(fmt, Base, offset));
         }
         else
         {
             writer.Write(string.Format("({0})", Base));
         }
     }
     else
     {
         writer.Write("(");
         writer.WriteAddress(string.Format("{0:X4}", Offset.ToUInt16()), Address.Ptr16(Offset.ToUInt16()));
         writer.Write(")");
     }
 }
Пример #22
0
 public override void Render(MachineInstructionWriter writer)
 {
     writer.Write("{0} ", Address.ToLinear());
     bool inString = false;
     for (int i = 0; i < Line.Length; ++i)
     {
         int b = Line[i];
         if (inString)
         {
             writer.Write(Encoding.UTF8.GetString(Line, i, 1));
             inString = (b != 0x22);
         }
         else
         {
             if (TokenMin <= b && b < TokenMax)
             {
                 writer.Write(TokenStrs[b - TokenMin]);
             }
             else
             {
                 writer.Write(Encoding.UTF8.GetString(Line, i, 1));
             }
             inString = (b == 0x22);
         }
     }
 }
Пример #23
0
        public override void Render(MachineInstructionWriter writer, MachineInstructionWriterOptions options)
        {
            string name;

            if (!instrNames.TryGetValue(opcode, out name))
            {
                name = opcode.ToString();
            }
            writer.WriteOpcode(name);

            if (op1 != null)
            {
                writer.Tab();
                op1.Write(writer, options);
                if (op2 != null)
                {
                    writer.Write(',');
                    op2.Write(writer, options);
                    if (op3 != null)
                    {
                        writer.Write(',');
                        op3.Write(writer, options);
                    }
                }
            }
        }
Пример #24
0
 public override void Render(MachineInstructionWriter writer, MachineInstructionWriterOptions options)
 {
     writer.WriteOpcode(this.Opcode.ToString());
     writer.Tab();
     bool sep = false; 
     foreach (var op in Operands)
     {
         if (sep)
             writer.Write(',');
         sep = true;
         if (op is ImmediateOperand)
         {
             writer.Write('#');
             op.Write(writer, options);
         }
         else if (op is MemoryOperand && ((MemoryOperand)op).Base == Registers.pc)
         {
             var addr = this.Address + (this.Length + ((MemoryOperand)op).Offset.ToInt32());
             if ((options & MachineInstructionWriterOptions.ResolvePcRelativeAddress) != 0)
             {
                 writer.WriteAddress(addr.ToString(), addr);
                 writer.AddAnnotation(op.ToString());
             }
             else
             {
                 op.Write(writer, options);
                 writer.AddAnnotation(addr.ToString());
             }
         }
         else
         {
             op.Write(writer, options);
         }
     }
 }
Пример #25
0
 public override void Render(MachineInstructionWriter writer, MachineInstructionWriterOptions options)
 {
     if (code == Opcode.illegal && op1 != null && writer.Platform != null)
     {
         var imm = op1 as M68kImmediateOperand;
         // MacOS uses invalid opcodes to invoke Macintosh Toolbox services.
         // We may have to generalize the Platform API to allow specifying
         // the opcode of the invoking instruction, to disambiguate from
         // "legitimate" TRAP calls.
         var svc = writer.Platform.FindService((int)imm.Constant.ToUInt32(), null);
         if (svc != null)
         {
             writer.Write(svc.Name);
             return;
         }
     }
     if (dataWidth != null)
     {
         writer.WriteOpcode(string.Format("{0}{1}", code, DataSizeSuffix(dataWidth)));
     }
     else
     {
         writer.WriteOpcode(code.ToString());
     }
     writer.Tab();
     if (op1 != null)
     {
         WriteOperand(op1, writer, options);
         if (op2 != null)
         {
             writer.Write(',');
             WriteOperand(op2, writer, options);
         }
     }
 }
Пример #26
0
 public override void Render(MachineInstructionWriter writer)
 {
     writer.WriteOpcode(string.Format("{0}{1}{2}",
         Opcode,
         Cond != Condition.al ? Cond.ToString() : "",
         OpFlags != OpFlags.None ? OpFlags.ToString().ToLower() : ""));
     if (Dst != null)
     {
         writer.Tab();
         Write(Dst, writer);
         if (Update) writer.Write("!");
         if (Src1 != null)
         {
             writer.Write(",");
             Write(Src1, writer);
             if (Src2 != null)
             {
                 writer.Write(",");
                 Write(Src2, writer);
                 if (Src3 != null)
                 {
                     writer.Write(",");
                     Write(Src3, writer);
                 }
             }
         }
     }
 }
Пример #27
0
        private void Write(MachineOperand op, MachineInstructionWriter writer)
        {
            var reg = op as RegisterOperand;

            if (reg != null)
            {
                writer.Write("%{0}", reg.Register.Name);
                return;
            }
            var imm = op as ImmediateOperand;

            if (imm != null)
            {
                writer.Write(imm.Value.ToString());
                return;
            }
            var mem = op as MemoryOperand;

            if (mem != null)
            {
                mem.Write(false, writer);
                return;
            }
            var idx = op as IndexedMemoryOperand;

            if (idx != null)
            {
                idx.Write(false, writer);
                return;
            }
            writer.Write(op.ToString());
        }
Пример #28
0
 public override void Write(bool fExplicit, MachineInstructionWriter writer)
 {
     writer.Write("#");
     long imm8 = Value.ToInt64();
     if (imm8 > 256 && ((imm8 & (imm8 - 1)) == 0))
     {
         /* only one bit set, and that later than bit 8.
          * Represent as 1<<... .
          */
         writer.Write("1<<");
         uint n = 0;
         while ((imm8 & 0xF) == 0)
         {
             n += 4; imm8 = imm8 >> 4;
         }
         // Now imm8 is 1, 2, 4 or 8. 
         n += (uint)((0x30002010 >> (int)(4 * (imm8 - 1))) & 15);
         writer.Write(n);
     }
     else
     {
         if (imm8 < 0 && imm8 > -100)
         {
             writer.Write('-'); imm8 = -imm8;
         }
         writer.Write("&{0:X}", imm8);
     }
 }
Пример #29
0
 public override void Write(bool fExplicit, MachineInstructionWriter writer)
 {
     Operand.Write(fExplicit, writer);
     writer.Write(",");
     writer.WriteOpcode(Opcode.ToString());
     writer.Write(' ');
     Shift.Write(fExplicit, writer);
 }
Пример #30
0
 public override void Write(bool fExplicit, MachineInstructionWriter writer)
 {
     Operand.Write(fExplicit, writer);
     writer.Write(",");
     writer.WriteOpcode(Opcode.ToString());
     writer.Write(' ');
     Shift.Write(fExplicit, writer);
 }
Пример #31
0
 public override void Write(MachineInstructionWriter writer, MachineInstructionWriterOptions options)
 {
     writer.Write("[%{0}", Base.Name);
     if (!Offset.IsNegative)
     {
         writer.Write("+");
     }
     writer.Write(Offset.ToString());
     writer.Write("]");
 }
Пример #32
0
 public override void Write(bool fExplicit, MachineInstructionWriter writer)
 {
     writer.Write("[%{0}", Base.Name);
     if (!Offset.IsNegative)
     {
         writer.Write("+");
     }
     writer.Write(Offset.ToString());
     writer.Write("]");
 }
Пример #33
0
 public override void Write(MachineInstructionWriter writer, MachineInstructionWriterOptions options)
 {
     if (Offset != null)
     {
         writer.Write(MachineOperand.FormatValue(Offset, false, M68kDisassembler.HexStringFormat));
     }
     writer.Write("(");
     writer.Write(Base.Name);
     writer.Write(")");
 }
Пример #34
0
 public override void Write(bool fExplicit, MachineInstructionWriter writer)
 {
     writer.Write("[%{0}", Base.Name);
     if (!Offset.IsNegative)
     {
         writer.Write("+");
     }
     writer.Write(Offset.ToString());
     writer.Write("]");
 }
Пример #35
0
 public override void Write(bool fExplicit, MachineInstructionWriter writer)
 {
     writer.Write('[');
     writer.Write(this.Base.ToString());
     if (this.Offset != null)
     {
         if (this.Preindexed)
         {
             writer.Write(",");
             if (this.Subtract)
             {
                 writer.Write("-");
             }
             Offset.Write(false, writer);
             writer.Write("]");
             if (this.Writeback)
             {
                 writer.Write("!");
             }
         }
         else
         {
             writer.Write("],");
             if (this.Subtract)
             {
                 writer.Write("-");
             }
             Offset.Write(false, writer);
         }
     }
     else
     {
         writer.Write(']');
     }
 }
Пример #36
0
 public override void Write(bool fExplicit, MachineInstructionWriter writer)
 {
     writer.Write('[');
     writer.Write(this.Base.ToString());
     if (this.Offset != null)
     {
         if (this.Preindexed)
         {
             writer.Write(",");
             if (this.Subtract)
                 writer.Write("-");
             Offset.Write(false, writer);
             writer.Write("]");
             if (this.Writeback)
                 writer.Write("!");
         }
         else
         {
             writer.Write("],");
             if (this.Subtract)
                 writer.Write("-");
             Offset.Write(false, writer);
         }
     }
     else
         writer.Write(']');
 }
Пример #37
0
 private void OpToString(MachineOperand op, MachineInstructionWriter writer)
 {
     if (op is ImmediateOperand)
     {
         writer.Write("#" + op.ToString());
     }
     else
     {
         writer.Write(op.ToString());
     }
 }
Пример #38
0
        public override void Write(MachineInstructionWriter writer, MachineInstructionWriterOptions options)
        {
            writer.Write("#");
            var pt = Constant.DataType as PrimitiveType;

            if (pt == null || pt.Domain != Domain.Real)
            {
                writer.Write("$");
            }
            writer.Write(MachineOperand.FormatValue(Constant));
        }
Пример #39
0
 private void OpToString(MachineOperand op, MachineInstructionWriter writer)
 {
     if (op is ImmediateOperand)
     {
         writer.Write("#" + op.ToString());
     }
     else
     {
         writer.Write(op.ToString());
     }
 }
Пример #40
0
 public override void Write(bool fExplicit, MachineInstructionWriter writer)
 {
     if (Offset != null)
     {
         writer.Write(FormatSignedValue(Offset));
     }
     if (Base != null)
     {
         writer.Write("({0})", Base.Name);
     }
 }
Пример #41
0
        public override void Write(MachineInstructionWriter writer, MachineInstructionWriterOptions options)
        {
            int offset = Offset;

            if (offset < 0)
            {
                offset = -offset;
                writer.Write('-');
            }
            writer.Write("{0:X}(", offset);
            writer.Write(this.Base.Name);
            writer.Write(")");
        }
Пример #42
0
 public override void Render(MachineInstructionWriter writer)
 {
     writer.WriteOpcode(opcode.ToString());
     if (operands.Length > 0)
     {
         writer.Tab();
         writer.Write(operands[0].ToString());
         if (operands.Length > 1)
         {
             writer.Write(",");
             writer.Write(operands[1].ToString());
         }
     }
 }
Пример #43
0
 public override void Render(MachineInstructionWriter writer)
 {
     writer.WriteOpcode(this.Opcode.ToString());
     writer.Tab();
     bool sep = false; 
     foreach (var op in Operands)
     {
         if (sep)
             writer.Write(',');
         sep = true;
         if (op is ImmediateOperand)
             writer.Write('#');
         op.Write(false, writer);
     }
 }
Пример #44
0
 public override void Write(bool fExplicit, MachineInstructionWriter writer)
 {
     writer.Write('{');
     {
         uint w = instr & 0xFFFF;
         int i = 0;
         while (w != 0)
         {
             int j;
             while ((w & (1u << i)) == 0)
                 ++i;
             for (j = i + 1; (w & (1u << j)) != 0; ++j)
                 ;
             --j;
             // registers [i..j]
             writer.Write(A32Registers.GpRegs[i].Name);
             if (j - i != 0)
             {
                 writer.Write((j - i > 1) ? '-' : ',');
                 writer.Write(A32Registers.GpRegs[j].Name);
             }
             i = j; w = (w >> (j + 1)) << (j + 1);
             if (w != 0) writer.Write(',');
         }
     }
     writer.Write('}');
     if ((instr & (1 << 22)) != 0) writer.Write('^');
 }
Пример #45
0
 public override void Render(MachineInstructionWriter writer)
 {
     writer.WriteOpcode(Opcode.ToString());
     if (op1 == null)
         return;
     writer.Tab();
     op1.Write(false, writer);
     if (op2 == null)
         return;
     writer.Write(",");
     op2.Write(false, writer);
     if (op3 == null)
         return;
     writer.Write(",");
     op3.Write(false, writer);
 }
Пример #46
0
 public override void Render(MachineInstructionWriter writer)
 {
     if (instruction == null)
     {
         writer.Write("Invalid");
         return;
     }
     writer.WriteOpcode(instruction.Mnemonic);
     var ops = instruction.ArchitectureDetail.Operands;
     if (ops.Length < 1)
         return;
     writer.Tab();
     if (WriteRegisterSetInstruction(writer))
         return;
     Write(ops[0], writer);
     if (ops.Length < 2)
         return;
     writer.Write(",");
     Write(ops[1], writer);
     if (ops.Length < 3)
         return;
     writer.Write(",");
     Write(ops[2], writer);
     if (ops.Length < 4)
         return;
     writer.Write(",");
     Write(ops[3], writer);
 }
Пример #47
0
 public override void Render(MachineInstructionWriter writer)
 {
     writer.WriteOpcode(opcode.ToString());
     if (op1 != null)
     {
         writer.Tab();
         op1.Write(true, writer);
         if (op2 != null)
         {
             writer.Write(',');
             op2.Write(true, writer);
             if (op3 != null)
             {
                 writer.Write(',');
                 op3.Write(true, writer);
             }
         }
     }
 }
Пример #48
0
 public override void Render(MachineInstructionWriter writer)
 {
     writer.WriteOpcode(instruction.Mnemonic);
     var ops = Internal.ArchitectureDetail.Operands;
     if (ops.Length < 1)
         return;
     writer.Tab();
     Write(ops[0], writer);
     if (ops.Length < 2)
         return;
     writer.Write(",");
     Write(ops[1], writer);
     if (ops.Length < 3)
         return;
     writer.Write(",");
     Write(ops[2], writer);
     if (ops.Length < 4)
         return;
     writer.Write(",");
     Write(ops[3], writer);
 }
Пример #49
0
 public override void Render(MachineInstructionWriter writer)
 {
     if (Code == Opcode.ex_af)
     {
         writer.WriteOpcode("ex");
         writer.Tab();
         writer.Write("af,af'");
         return;
     }
     writer.WriteOpcode(Code.ToString());
     if (Op1 != null)
     {
         writer.Tab();
         Op1.Write(true, writer);
         if (Op2 != null)
         {
             writer.Write(",");
             Op2.Write(true, writer);
         }
     }
 }
Пример #50
0
 public override void Write(bool fExplicit, MachineInstructionWriter writer)
 {
     if (Offset != null)
     {
         writer.Write(FormatSignedValue(Offset));
     }
     if (AutoDecrement)
     {
         writer.Write("-");
     }
     if (Base != null)
     {
         writer.Write("({0})", Base.Name);
     }
     if (AutoIncrement)
     {
         writer.Write("+");
     }
     if (Index != null)
     {
         writer.Write("[{0}]", Index.Name);
     }
 }
Пример #51
0
 public override void Write(bool fExplicit, MachineInstructionWriter writer)
 {
     if (condition > 3)
         writer.Write("cr{0}+", condition >> 2);
     var s = "";
     switch (condition & 3)
     {
     case 0: s = "lt"; break;
     case 1: s = "gt"; break;
     case 2: s = "eq"; break;
     case 3: s = "so"; break;
     }
     writer.Write(s);
 }
Пример #52
0
 public override void Render(MachineInstructionWriter writer)
 {
     writer.WriteOpcode(Opcode.ToString());
     if (op1 != null)
     {
         writer.Tab();
         OpToString(op1, writer);
         if (op2 != null)
         {
             writer.Write(",");
             OpToString(op2, writer);
         }
     }
 }
Пример #53
0
        public override void Render(MachineInstructionWriter writer)
        {
            writer.WriteOpcode(
                string.Format("{0}{1}",
                Opcode.ToString(),
                Annul ? ",a" : ""));

            if (Op1 != null)
            {
                writer.Tab();
                Write(Op1, writer);
                if (Op2 != null)
                {
                    writer.Write(',');
                    Write(Op2, writer);
                    if (Op3 != null)
                    {
                        writer.Write(',');
                        Write(Op3, writer);
                    }
                }
            }
        }
Пример #54
0
 public override void Write(bool fExplicit, MachineInstructionWriter writer)
 {
     string fmt;
     switch (Mode)
     {
     case AddressMode.RegDef: fmt = "@{0}"; break;
     case AddressMode.AutoIncr: fmt = "({0})+"; break;
     case AddressMode.AutoDecr: fmt = "-({0})"; break;
     case AddressMode.Indexed: fmt = "{1:X4}({0})"; break;
     //case AddressMode.Immediate : fmt = "#{1:X4}"; break;
     case AddressMode.Absolute: fmt = "@#{1:X4}"; break;
     default: throw new NotImplementedException(string.Format("Unknown mode {0}.", Mode));
     }
     writer.Write(string.Format(fmt, Register, EffectiveAddress));
 }
Пример #55
0
 private void Write(Arm64InstructionOperand op, MachineInstructionWriter writer)
 {
     switch (op.Type)
     {
     case Arm64InstructionOperandType.Register:
         writer.Write(A64Registers.RegisterByCapstoneID[op.RegisterValue.Value].Name);
         return;
     case Arm64InstructionOperandType.Immediate:
         if (IsJump())
         {
             writer.Write("${0:X16}", op.ImmediateValue.Value);
         }
         else 
         {
             WriteImmediateValue(op.ImmediateValue.Value, writer);
             if (op.Shifter != null)
             {
                 this.WriteShift(op, writer);
             }
         }
         return;
     }
     throw new NotImplementedException(op.Type.ToString());
 }
Пример #56
0
 public override void Write(bool fExplicit, MachineInstructionWriter writer)
 {
     string fmt;
     int offset;
     if (Offset >= 0)
     {
         fmt = "{0:X4}({1})";
         offset = Offset;
     }
     else 
     {
         fmt = "-{0:X4}({1})";
         offset = -Offset;
     }
     writer.Write(string.Format(fmt, offset, Base));
 }
Пример #57
0
 public override void Render(MachineInstructionWriter writer)
 {
     string instrName;
     if (!instrNames.TryGetValue(Opcode, out instrName))
     {
         instrName = Opcode.ToString();
     }
     writer.WriteOpcode(instrName);
     writer.Tab();
     var sep = "";
     if (this.Operands != null)
     {
         foreach (var op in this.Operands)
         {
             writer.Write(sep);
             op.Write(false, writer);
             sep = ",";
         }
     }
 }
Пример #58
0
 public override void Write(bool fExplicit, MachineInstructionWriter writer)
 {
     int o = Offset != null ? Offset.ToUInt16() : 0;
     string fmt;
     switch (Mode)
     {
     case AddressMode.Accumulator: return;        // Implicit, never displayed
     case AddressMode.Immediate: fmt = "#${0:X2}"; break;
     case AddressMode.ZeroPage: fmt = "${0:X2}"; break;
     case AddressMode.ZeroPageX: 
     case AddressMode.ZeroPageY: fmt = "${0:X2},{1}"; break;
     case AddressMode.Relative:
     case AddressMode.Absolute: fmt = "${0:X4}"; break;
     case AddressMode.AbsoluteX:
     case AddressMode.AbsoluteY: fmt = "${0:X4},{1}"; break;
     case AddressMode.Indirect: fmt = "(${0:X4})"; break;
     case AddressMode.IndexedIndirect: fmt = "(${0:X2},{1})"; break;
     case AddressMode.IndirectIndexed: fmt = "(${0:X2}),{1}"; break;
     default: throw new NotSupportedException();
     }
     writer.Write(string.Format(fmt, o, Register));
 }
Пример #59
0
 public override void Write(bool fExplicit, MachineInstructionWriter writer)
 {
     writer.Write("st(" + fpuReg + ")");
 }
Пример #60
0
 public override void Write(bool fExplicit, MachineInstructionWriter writer)
 {
     var s = FormatValue(value);
     var pt = value.DataType as PrimitiveType;
     if (pt != null && pt.Domain == Domain.Pointer)
         writer.WriteAddress(s, Address.FromConstant(value));    //$TODO: add WriteAddress(string, Constant) to MachineINstructionWriter
     else if (value.DataType is Pointer)
         writer.WriteAddress(s, Address.FromConstant(value));
     else
         writer.Write(s);
 }