コード例 #1
0
 /// <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.");
     }
 }
コード例 #2
0
        /// <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;
        }