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; } }
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); } } }
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); }
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()); } }
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); }
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; } }
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); }
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)); } }