/// <summary> /// Gets the name of the operand as used in the manuals. /// </summary> /// <param name="operand">The operand.</param> /// <returns>The operand name.</returns> string GetOperandManualName(X86OperandSpec operand) { switch (operand.Type) { case X86OperandType.RegisterOperand: return "reg" + operand.Size.GetBitCount(); case X86OperandType.FixedRegister: return Enum.GetName(typeof(Register), operand.FixedRegister).ToUpperInvariant(); case X86OperandType.Immediate: return "imm" + operand.Size.GetBitCount(); case X86OperandType.MemoryOperand: return "mem" + operand.Size.GetBitCount(); case X86OperandType.MemoryOffset: return "moffset" + operand.Size.GetBitCount(); case X86OperandType.FarPointer: return "pntr16:" + operand.Size.GetBitCount(); case X86OperandType.RegisterOrMemoryOperand: return "reg/mem" + operand.Size.GetBitCount(); case X86OperandType.RelativeOffset: return "rel" + operand.Size.GetBitCount() + "off"; default: throw new NotSupportedException("The operand type is not supported."); } }
/// <inheritdoc /> public override OperandSpec CreateOperandSpec(string type, object defaultValue) { var operandSpec = new X86OperandSpec(); if (type.Equals("void")) { operandSpec.Type = X86OperandType.FixedRegister; operandSpec.FixedRegister = ToRegister(defaultValue); } else { DataSize size; if (type.EndsWith("128")) { size = DataSize.Bit128; type = type.Substring(0, type.Length - 3); } else if (type.EndsWith("64")) { size = DataSize.Bit64; type = type.Substring(0, type.Length - 2); } else if (type.EndsWith("32")) { size = DataSize.Bit32; type = type.Substring(0, type.Length - 2); } else if (type.EndsWith("16")) { size = DataSize.Bit16; type = type.Substring(0, type.Length - 2); } else if (type.EndsWith("8")) { size = DataSize.Bit8; type = type.Substring(0, type.Length - 1); } else throw new ScriptException(string.Format("Malformatted type {0}", type)); operandSpec.Size = size; switch (type) { case "reg/mem": operandSpec.Type = X86OperandType.RegisterOrMemoryOperand; break; case "reg": operandSpec.Type = X86OperandType.RegisterOperand; break; case "moffset": operandSpec.Type = X86OperandType.MemoryOffset; break; case "imm": operandSpec.Type = X86OperandType.Immediate; break; case "mem": operandSpec.Type = X86OperandType.MemoryOperand; break; case "reloff": operandSpec.Type = X86OperandType.RelativeOffset; break; case "pntr16:": operandSpec.Type = X86OperandType.FarPointer; break; default: throw new ScriptException(string.Format("Unknown operand type {0}", type)); } } return operandSpec; }