private static Instruction GetStlocInstructionFromRegister(X86Register register, CilBody body) { switch (register) { case X86Register.EAX: return(new Instruction(OpCodes.Stloc_0)); case X86Register.ECX: return(new Instruction(OpCodes.Stloc_1)); case X86Register.EDX: return(new Instruction(OpCodes.Stloc_2)); case X86Register.EBX: return(new Instruction(OpCodes.Stloc_3)); case X86Register.ESI: return(new Instruction(OpCodes.Stloc_S, body.Variables[6])); case X86Register.EDI: return(new Instruction(OpCodes.Stloc_S, body.Variables[7])); default: throw new Exception("Not implemented"); } }
/// <summary> /// Create an X86 Memory Operand Value. /// </summary> /// <param name="disassembler"> /// A disassembler. /// </param> /// <param name="nativeMemoryOperandValue"> /// A native X86 memory operand value. /// </param> internal X86MemoryOperandValue(CapstoneDisassembler disassembler, ref NativeX86MemoryOperandValue nativeMemoryOperandValue) { this.Base = X86Register.TryCreate(disassembler, nativeMemoryOperandValue.Base); this.Displacement = nativeMemoryOperandValue.Displacement; this.Index = X86Register.TryCreate(disassembler, nativeMemoryOperandValue.Index); this.Scale = nativeMemoryOperandValue.Scale; this.Segment = X86Register.TryCreate(disassembler, nativeMemoryOperandValue.Segment); }
/// <summary> /// Constructor /// </summary> /// <param name="name">Name or null</param> /// <param name="index">Argument/local index or < 0</param> /// <param name="isLocal">true if it's a local, false if it's an argument</param> /// <param name="liveAddress">Start address in the code where this variable is live</param> /// <param name="liveLength">Length of the live range</param> /// <param name="locationKind">Variable kind</param> /// <param name="register">Register or memory base register</param> /// <param name="memoryOffset">Offset relative to <paramref name="register"/> if it's a memory location (<see cref="X86VariableLocationKind.Memory"/>)</param> public X86Variable(string name, int index, bool isLocal, ulong liveAddress, uint liveLength, X86VariableLocationKind locationKind, X86Register register, int memoryOffset) { Name = name; Index = index; IsLocal = isLocal; LiveAddress = liveAddress; LiveLength = liveLength; LocationKind = locationKind; Register = register; MemoryOffset = memoryOffset; }
public static X86RegisterSize GetRegisterSize(this X86Register register) { var value = (int)register; if (value > (int)X86Register.Eax) { return(X86RegisterSize.Dword); } if (value > (int)X86Register.Ax) { return(X86RegisterSize.Word); } return(X86RegisterSize.Byte); }
/// <summary> /// Create an X86 Register. /// </summary> /// <param name="disassembler"> /// A disassembler. /// </param> /// <param name="id"> /// The register's unique identifier. /// </param> /// <returns> /// An X86 register. A null reference if the register's unique identifier is equal to /// <see cref="X86RegisterId.Invalid" />. /// </returns> /// <exception cref="System.ObjectDisposedException"> /// Thrown if the disassembler is disposed. /// </exception> internal static X86Register TryCreate(CapstoneDisassembler disassembler, X86RegisterId id) { X86Register @object = null; if (id != X86RegisterId.Invalid) { // ... // // Throws an exception if the operation fails. var name = NativeCapstone.GetRegisterName(disassembler.Handle, (int)id); @object = new X86Register(id, name); } return(@object); }
public X86ScaledIndex(X86Register register, int multiplier) { Register = register; Multiplier = multiplier; }
static bool TryGetRegisterX86(DbgMachine machine, CorDebugRegister corReg, out X86Register register) { switch (machine) { case DbgMachine.X86: switch (corReg) { case CorDebugRegister.REGISTER_X86_EIP: register = X86Register.EIP; return(true); case CorDebugRegister.REGISTER_X86_ESP: register = X86Register.ESP; return(true); case CorDebugRegister.REGISTER_X86_EBP: register = X86Register.EBP; return(true); case CorDebugRegister.REGISTER_X86_EAX: register = X86Register.EAX; return(true); case CorDebugRegister.REGISTER_X86_ECX: register = X86Register.ECX; return(true); case CorDebugRegister.REGISTER_X86_EDX: register = X86Register.EDX; return(true); case CorDebugRegister.REGISTER_X86_EBX: register = X86Register.EBX; return(true); case CorDebugRegister.REGISTER_X86_ESI: register = X86Register.ESI; return(true); case CorDebugRegister.REGISTER_X86_EDI: register = X86Register.EDI; return(true); case CorDebugRegister.REGISTER_X86_FPSTACK_0: register = X86Register.ST0; return(true); case CorDebugRegister.REGISTER_X86_FPSTACK_1: register = X86Register.ST1; return(true); case CorDebugRegister.REGISTER_X86_FPSTACK_2: register = X86Register.ST2; return(true); case CorDebugRegister.REGISTER_X86_FPSTACK_3: register = X86Register.ST3; return(true); case CorDebugRegister.REGISTER_X86_FPSTACK_4: register = X86Register.ST4; return(true); case CorDebugRegister.REGISTER_X86_FPSTACK_5: register = X86Register.ST5; return(true); case CorDebugRegister.REGISTER_X86_FPSTACK_6: register = X86Register.ST6; return(true); case CorDebugRegister.REGISTER_X86_FPSTACK_7: register = X86Register.ST7; return(true); default: Debug.Fail($"Unknown register number {(int)corReg}"); register = default; return(false); } case DbgMachine.X64: switch (corReg) { case CorDebugRegister.REGISTER_AMD64_RIP: register = X86Register.RIP; return(true); case CorDebugRegister.REGISTER_AMD64_RSP: register = X86Register.RSP; return(true); case CorDebugRegister.REGISTER_AMD64_RBP: register = X86Register.RBP; return(true); case CorDebugRegister.REGISTER_AMD64_RAX: register = X86Register.RAX; return(true); case CorDebugRegister.REGISTER_AMD64_RCX: register = X86Register.RCX; return(true); case CorDebugRegister.REGISTER_AMD64_RDX: register = X86Register.RDX; return(true); case CorDebugRegister.REGISTER_AMD64_RBX: register = X86Register.RBX; return(true); case CorDebugRegister.REGISTER_AMD64_RSI: register = X86Register.RSI; return(true); case CorDebugRegister.REGISTER_AMD64_RDI: register = X86Register.RDI; return(true); case CorDebugRegister.REGISTER_AMD64_R8: register = X86Register.R8; return(true); case CorDebugRegister.REGISTER_AMD64_R9: register = X86Register.R9; return(true); case CorDebugRegister.REGISTER_AMD64_R10: register = X86Register.R10; return(true); case CorDebugRegister.REGISTER_AMD64_R11: register = X86Register.R11; return(true); case CorDebugRegister.REGISTER_AMD64_R12: register = X86Register.R12; return(true); case CorDebugRegister.REGISTER_AMD64_R13: register = X86Register.R13; return(true); case CorDebugRegister.REGISTER_AMD64_R14: register = X86Register.R14; return(true); case CorDebugRegister.REGISTER_AMD64_R15: register = X86Register.R15; return(true); case CorDebugRegister.REGISTER_AMD64_XMM0: register = X86Register.XMM0; return(true); case CorDebugRegister.REGISTER_AMD64_XMM1: register = X86Register.XMM1; return(true); case CorDebugRegister.REGISTER_AMD64_XMM2: register = X86Register.XMM2; return(true); case CorDebugRegister.REGISTER_AMD64_XMM3: register = X86Register.XMM3; return(true); case CorDebugRegister.REGISTER_AMD64_XMM4: register = X86Register.XMM4; return(true); case CorDebugRegister.REGISTER_AMD64_XMM5: register = X86Register.XMM5; return(true); case CorDebugRegister.REGISTER_AMD64_XMM6: register = X86Register.XMM6; return(true); case CorDebugRegister.REGISTER_AMD64_XMM7: register = X86Register.XMM7; return(true); case CorDebugRegister.REGISTER_AMD64_XMM8: register = X86Register.XMM8; return(true); case CorDebugRegister.REGISTER_AMD64_XMM9: register = X86Register.XMM9; return(true); case CorDebugRegister.REGISTER_AMD64_XMM10: register = X86Register.XMM10; return(true); case CorDebugRegister.REGISTER_AMD64_XMM11: register = X86Register.XMM11; return(true); case CorDebugRegister.REGISTER_AMD64_XMM12: register = X86Register.XMM12; return(true); case CorDebugRegister.REGISTER_AMD64_XMM13: register = X86Register.XMM13; return(true); case CorDebugRegister.REGISTER_AMD64_XMM14: register = X86Register.XMM14; return(true); case CorDebugRegister.REGISTER_AMD64_XMM15: register = X86Register.XMM15; return(true); default: Debug.Fail($"Unknown register number {(int)corReg}"); register = default; return(false); } case DbgMachine.Arm: case DbgMachine.Arm64: default: Debug.Fail($"Unsupported machine: {machine}"); register = default; return(false); } }
public X86ScaledIndex(X86Register register) : this(register, 1) { }
private static Operand Gpr(X86Register register, OperandType type) { return(Register((int)register, RegisterType.Integer, type)); }
private static Operand Xmm(X86Register register, OperandType type) { return(Register((int)register, RegisterType.Vector, type)); }
public static Register ToIcedRegister(this X86Register register) { switch (register) { case X86Register.None: return(Register.None); case X86Register.AL: return(Register.AL); case X86Register.CL: return(Register.CL); case X86Register.DL: return(Register.DL); case X86Register.BL: return(Register.BL); case X86Register.AH: return(Register.AH); case X86Register.CH: return(Register.CH); case X86Register.DH: return(Register.DH); case X86Register.BH: return(Register.BH); case X86Register.SPL: return(Register.SPL); case X86Register.BPL: return(Register.BPL); case X86Register.SIL: return(Register.SIL); case X86Register.DIL: return(Register.DIL); case X86Register.R8L: return(Register.R8L); case X86Register.R9L: return(Register.R9L); case X86Register.R10L: return(Register.R10L); case X86Register.R11L: return(Register.R11L); case X86Register.R12L: return(Register.R12L); case X86Register.R13L: return(Register.R13L); case X86Register.R14L: return(Register.R14L); case X86Register.R15L: return(Register.R15L); case X86Register.AX: return(Register.AX); case X86Register.CX: return(Register.CX); case X86Register.DX: return(Register.DX); case X86Register.BX: return(Register.BX); case X86Register.SP: return(Register.SP); case X86Register.BP: return(Register.BP); case X86Register.SI: return(Register.SI); case X86Register.DI: return(Register.DI); case X86Register.R8W: return(Register.R8W); case X86Register.R9W: return(Register.R9W); case X86Register.R10W: return(Register.R10W); case X86Register.R11W: return(Register.R11W); case X86Register.R12W: return(Register.R12W); case X86Register.R13W: return(Register.R13W); case X86Register.R14W: return(Register.R14W); case X86Register.R15W: return(Register.R15W); case X86Register.EAX: return(Register.EAX); case X86Register.ECX: return(Register.ECX); case X86Register.EDX: return(Register.EDX); case X86Register.EBX: return(Register.EBX); case X86Register.ESP: return(Register.ESP); case X86Register.EBP: return(Register.EBP); case X86Register.ESI: return(Register.ESI); case X86Register.EDI: return(Register.EDI); case X86Register.R8D: return(Register.R8D); case X86Register.R9D: return(Register.R9D); case X86Register.R10D: return(Register.R10D); case X86Register.R11D: return(Register.R11D); case X86Register.R12D: return(Register.R12D); case X86Register.R13D: return(Register.R13D); case X86Register.R14D: return(Register.R14D); case X86Register.R15D: return(Register.R15D); case X86Register.RAX: return(Register.RAX); case X86Register.RCX: return(Register.RCX); case X86Register.RDX: return(Register.RDX); case X86Register.RBX: return(Register.RBX); case X86Register.RSP: return(Register.RSP); case X86Register.RBP: return(Register.RBP); case X86Register.RSI: return(Register.RSI); case X86Register.RDI: return(Register.RDI); case X86Register.R8: return(Register.R8); case X86Register.R9: return(Register.R9); case X86Register.R10: return(Register.R10); case X86Register.R11: return(Register.R11); case X86Register.R12: return(Register.R12); case X86Register.R13: return(Register.R13); case X86Register.R14: return(Register.R14); case X86Register.R15: return(Register.R15); case X86Register.EIP: return(Register.EIP); case X86Register.RIP: return(Register.RIP); case X86Register.ST0: return(Register.ST0); case X86Register.ST1: return(Register.ST1); case X86Register.ST2: return(Register.ST2); case X86Register.ST3: return(Register.ST3); case X86Register.ST4: return(Register.ST4); case X86Register.ST5: return(Register.ST5); case X86Register.ST6: return(Register.ST6); case X86Register.ST7: return(Register.ST7); case X86Register.MM0: return(Register.MM0); case X86Register.MM1: return(Register.MM1); case X86Register.MM2: return(Register.MM2); case X86Register.MM3: return(Register.MM3); case X86Register.MM4: return(Register.MM4); case X86Register.MM5: return(Register.MM5); case X86Register.MM6: return(Register.MM6); case X86Register.MM7: return(Register.MM7); case X86Register.XMM0: return(Register.XMM0); case X86Register.XMM1: return(Register.XMM1); case X86Register.XMM2: return(Register.XMM2); case X86Register.XMM3: return(Register.XMM3); case X86Register.XMM4: return(Register.XMM4); case X86Register.XMM5: return(Register.XMM5); case X86Register.XMM6: return(Register.XMM6); case X86Register.XMM7: return(Register.XMM7); case X86Register.XMM8: return(Register.XMM8); case X86Register.XMM9: return(Register.XMM9); case X86Register.XMM10: return(Register.XMM10); case X86Register.XMM11: return(Register.XMM11); case X86Register.XMM12: return(Register.XMM12); case X86Register.XMM13: return(Register.XMM13); case X86Register.XMM14: return(Register.XMM14); case X86Register.XMM15: return(Register.XMM15); case X86Register.XMM16: return(Register.XMM16); case X86Register.XMM17: return(Register.XMM17); case X86Register.XMM18: return(Register.XMM18); case X86Register.XMM19: return(Register.XMM19); case X86Register.XMM20: return(Register.XMM20); case X86Register.XMM21: return(Register.XMM21); case X86Register.XMM22: return(Register.XMM22); case X86Register.XMM23: return(Register.XMM23); case X86Register.XMM24: return(Register.XMM24); case X86Register.XMM25: return(Register.XMM25); case X86Register.XMM26: return(Register.XMM26); case X86Register.XMM27: return(Register.XMM27); case X86Register.XMM28: return(Register.XMM28); case X86Register.XMM29: return(Register.XMM29); case X86Register.XMM30: return(Register.XMM30); case X86Register.XMM31: return(Register.XMM31); case X86Register.YMM0: return(Register.YMM0); case X86Register.YMM1: return(Register.YMM1); case X86Register.YMM2: return(Register.YMM2); case X86Register.YMM3: return(Register.YMM3); case X86Register.YMM4: return(Register.YMM4); case X86Register.YMM5: return(Register.YMM5); case X86Register.YMM6: return(Register.YMM6); case X86Register.YMM7: return(Register.YMM7); case X86Register.YMM8: return(Register.YMM8); case X86Register.YMM9: return(Register.YMM9); case X86Register.YMM10: return(Register.YMM10); case X86Register.YMM11: return(Register.YMM11); case X86Register.YMM12: return(Register.YMM12); case X86Register.YMM13: return(Register.YMM13); case X86Register.YMM14: return(Register.YMM14); case X86Register.YMM15: return(Register.YMM15); case X86Register.YMM16: return(Register.YMM16); case X86Register.YMM17: return(Register.YMM17); case X86Register.YMM18: return(Register.YMM18); case X86Register.YMM19: return(Register.YMM19); case X86Register.YMM20: return(Register.YMM20); case X86Register.YMM21: return(Register.YMM21); case X86Register.YMM22: return(Register.YMM22); case X86Register.YMM23: return(Register.YMM23); case X86Register.YMM24: return(Register.YMM24); case X86Register.YMM25: return(Register.YMM25); case X86Register.YMM26: return(Register.YMM26); case X86Register.YMM27: return(Register.YMM27); case X86Register.YMM28: return(Register.YMM28); case X86Register.YMM29: return(Register.YMM29); case X86Register.YMM30: return(Register.YMM30); case X86Register.YMM31: return(Register.YMM31); case X86Register.ZMM0: return(Register.ZMM0); case X86Register.ZMM1: return(Register.ZMM1); case X86Register.ZMM2: return(Register.ZMM2); case X86Register.ZMM3: return(Register.ZMM3); case X86Register.ZMM4: return(Register.ZMM4); case X86Register.ZMM5: return(Register.ZMM5); case X86Register.ZMM6: return(Register.ZMM6); case X86Register.ZMM7: return(Register.ZMM7); case X86Register.ZMM8: return(Register.ZMM8); case X86Register.ZMM9: return(Register.ZMM9); case X86Register.ZMM10: return(Register.ZMM10); case X86Register.ZMM11: return(Register.ZMM11); case X86Register.ZMM12: return(Register.ZMM12); case X86Register.ZMM13: return(Register.ZMM13); case X86Register.ZMM14: return(Register.ZMM14); case X86Register.ZMM15: return(Register.ZMM15); case X86Register.ZMM16: return(Register.ZMM16); case X86Register.ZMM17: return(Register.ZMM17); case X86Register.ZMM18: return(Register.ZMM18); case X86Register.ZMM19: return(Register.ZMM19); case X86Register.ZMM20: return(Register.ZMM20); case X86Register.ZMM21: return(Register.ZMM21); case X86Register.ZMM22: return(Register.ZMM22); case X86Register.ZMM23: return(Register.ZMM23); case X86Register.ZMM24: return(Register.ZMM24); case X86Register.ZMM25: return(Register.ZMM25); case X86Register.ZMM26: return(Register.ZMM26); case X86Register.ZMM27: return(Register.ZMM27); case X86Register.ZMM28: return(Register.ZMM28); case X86Register.ZMM29: return(Register.ZMM29); case X86Register.ZMM30: return(Register.ZMM30); case X86Register.ZMM31: return(Register.ZMM31); default: Debug.Fail($"Unknown register: {register}"); return(Register.None); } }
public override string FormatRegister(X86Register value) { return value.ToString().ToLowerInvariant(); }
public override string FormatRegister(X86Register value) { return(value.ToString().ToLowerInvariant()); }
private static byte ComputeRegisterToken(X86Register register) { return((byte)((byte)(register) & 7)); }
/// <summary> /// Formats a x86 register to a readable string. /// </summary> /// <param name="value">The register to format.</param> /// <returns>The formatted register.</returns> public abstract string FormatRegister(X86Register value);
public X86RegisterOperand(X86Register reg) { this.Register = reg; }
public X86RegisterOperand(X86Register reg) { Register = reg; }
private static byte ComputeRegisterToken(X86Register register) { return (byte)((byte)(register) & 7); }