Ejemplo n.º 1
0
        protected override void RenderOperand(MachineOperand op, MachineInstructionWriter writer, MachineInstructionWriterOptions options)
        {
            switch (op)
            {
            case ImmediateOperand _:
                writer.WriteChar('#');
                op.Write(writer, options);
                return;

            case MemoryOperand mop when mop.Base == Registers.pc:
                var addr = this.Address + this.Length;
                if (mop.Offset != null)
                {
                    addr += mop.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());
                }
                return;

            default:
                op.Write(writer, options);
                return;
            }
        }
Ejemplo n.º 2
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);
         }
     }
 }
Ejemplo n.º 3
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);
        }
Ejemplo n.º 4
0
 protected override void RenderOperand(MachineOperand op, MachineInstructionWriter writer, MachineInstructionWriterOptions options)
 {
     if (op is MemoryOperand memOp && memOp.Base == Registers.rip)
     {
         var addr = this.Address + this.Length + memOp.Offset.ToInt32();
         if ((options & MachineInstructionWriterOptions.ResolvePcRelativeAddress) != 0)
         {
             writer.WriteString("[");
             writer.WriteAddress(addr.ToString(), addr);
             writer.WriteString("]");
             writer.AddAnnotation(op.ToString());
         }
         else
         {
             op.Write(writer, options);
             writer.AddAnnotation(addr.ToString());
         }
     }
Ejemplo n.º 5
0
 protected override void RenderOperand(MachineOperand op, MachineInstructionWriter writer, MachineInstructionWriterOptions options)
 {
     if (op is MemoryOperand memOp && memOp.Base == Registers.pc)
     {
         var uAddr = Address.ToUInt32() + memOp.Offset.ToInt32();
         var addr  = Address.Ptr32((uint)uAddr);
         if ((options & MachineInstructionWriterOptions.ResolvePcRelativeAddress) != 0)
         {
             writer.WriteAddress(addr.ToString(), addr);
             writer.AddAnnotation(op.ToString());
         }
         else
         {
             op.Write(writer, options);
             writer.AddAnnotation(addr.ToString());
         }
         return;
     }
     op.Write(writer, options);
 }
Ejemplo n.º 6
0
        private void Render(MachineOperand op, MachineInstructionWriter writer, MachineInstructionWriterOptions options)
        {
            switch (op)
            {
            case ImmediateOperand immOp:
                writer.WriteChar('#');
                immOp.Write(writer, options);
                return;

            case MemoryOperand memOp:
                if (memOp.mode == AddressingMode.PcRelativeDisplacement)
                {
                    uint uAddr = this.Address.ToUInt32();
                    if (memOp.Width.Size == 4)
                    {
                        uAddr &= ~3u;
                    }
                    uAddr += (uint)(memOp.disp + 4);
                    var addr = Core.Address.Ptr32(uAddr);
                    if ((options & MachineInstructionWriterOptions.ResolvePcRelativeAddress) != 0)
                    {
                        writer.WriteChar('(');
                        writer.WriteAddress(addr.ToString(), addr);
                        writer.WriteChar(')');
                        writer.AddAnnotation(op.ToString());
                    }
                    else
                    {
                        op.Write(writer, options);
                        writer.AddAnnotation(addr.ToString());
                    }
                    return;
                }
                goto default;

            default:
                op.Write(writer, options);
                break;
            }
        }
Ejemplo n.º 7
0
        private void Render(MachineOperand op, MachineInstructionWriter writer, MachineInstructionWriterOptions options)
        {
            var immOp = op as ImmediateOperand;

            if (immOp != null)
            {
                writer.Write('#');
                immOp.Write(writer, options);
                return;
            }
            var memOp = op as MemoryOperand;

            if (memOp != null && memOp.mode == AddressingMode.PcRelativeDisplacement)
            {
                uint uAddr = this.Address.ToUInt32();
                if (memOp.Width.Size == 4)
                {
                    uAddr &= ~3u;
                }
                uAddr += (uint)(memOp.disp + 4);
                var addr = Core.Address.Ptr32(uAddr);
                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);
        }
Ejemplo n.º 8
0
        public void Write(ArmInstructionOperand op, MachineInstructionWriter writer, MachineInstructionWriterOptions options)
        {
            switch (op.Type)
            {
            case ArmInstructionOperandType.Immediate:
                if (instruction.Id == Opcode.B ||
                    instruction.Id == Opcode.BL ||
                    instruction.Id == Opcode.BLX)
                {
                    writer.Write("$");
                    writer.WriteAddress(
                        string.Format("{0:X8}", op.ImmediateValue.Value),
                        Address.Ptr32((uint)op.ImmediateValue.Value));
                    break;
                }
                writer.Write("#");
                WriteImmediateValue(op.ImmediateValue.Value, writer);
                break;

            case ArmInstructionOperandType.CImmediate:
                writer.Write("c{0}", op.ImmediateValue);
                break;

            case ArmInstructionOperandType.PImmediate:
                writer.Write("p{0}", op.ImmediateValue);
                break;

            case ArmInstructionOperandType.Register:
                if (op.IsSubtracted)
                {
                    writer.Write('-');
                }
                writer.Write(A32Registers.RegisterByCapstoneID[op.RegisterValue.Value].Name);
                WriteShift(op, writer);
                break;

            case ArmInstructionOperandType.SysRegister:
                writer.Write(A32Registers.SysRegisterByCapstoneID[op.SysRegisterValue.Value].Name);
                break;

            case ArmInstructionOperandType.Memory:
                if (op.MemoryValue.BaseRegister == ArmRegister.PC)
                {
                    var uAddr = (uint)((int)this.Address.ToUInt32() + op.MemoryValue.Displacement) + 8u;
                    var addr  = Address.Ptr32(uAddr);
                    if (op.MemoryValue.IndexRegister == ArmRegister.Invalid &&
                        (options & MachineInstructionWriterOptions.ResolvePcRelativeAddress) != 0)
                    {
                        writer.Write('[');
                        writer.WriteAddress(addr.ToString(), addr);
                        writer.Write(']');
                        var sr = new StringRenderer();
                        WriteMemoryOperand(op, sr);
                        writer.AddAnnotation(sr.ToString());
                    }
                    else
                    {
                        WriteMemoryOperand(op, writer);
                        writer.AddAnnotation(addr.ToString());
                    }
                    return;
                }
                WriteMemoryOperand(op, writer);
                break;

            case ArmInstructionOperandType.SetEnd:
                writer.Write(op.SetEndValue.ToString().ToLowerInvariant());
                break;

            case ArmInstructionOperandType.FloatingPoint:
                var f = op.FloatingPointValue.Value.ToString("g", CultureInfo.InvariantCulture);
                if (f.IndexOfAny(nosuffixRequired) < 0)
                {
                    f += ".0";
                }
                writer.Write("#{0}", f);
                break;

            default:
                throw new NotImplementedException(string.Format(
                                                      "Can't disassemble {0} {1}. Unknown operand type: {2}",
                                                      instruction.Mnemonic,
                                                      instruction.Operand,
                                                      op.Type));
            }
        }