2015-03-07 4 views

ответ

1

Инструкции IL определены в стандартном документе ECMA-335 - Common Language Infrastucture (коды кодировки кода - стр. 295).
документ находится в открытом доступе и может быть загружен по следующей ссылке:
http://www.ecma-international.org/publications/standards/Ecma-335.htm

Однако опкоды которые определяют также в классе System.Reflection.Emit.OpCodes, который является частью типов mscorlib.dll ,
Ниже кода, который может быть использован для извлечения соответствующей информации из этого класса:

// Get the OpcCodes using Reflection 
Type opCodes = typeof(OpCodes); 
var opCodesList = opCodes.GetFields(BindingFlags.Public | BindingFlags.Static) 
.Where(f => f.FieldType == typeof(OpCode)) 
.Select(f => 
{ OpCode opCode = (OpCode)f.GetValue(null); 
    return new {Name=f.Name, Instruction = opCode.Name, Size = opCode.Size, OpCode = string.Format("0x{0:X2}", opCode.Value) }; 
}); 

// Print to the Console 
var opCodesStrings = opCodesList 
.Select(o => string.Format("{0,-10}{1,-15}{2,-10}{3,-10}", o.Name, o.Instruction, o.Size, o.OpCode)) 
.ToList(); 
opCodesStrings.Insert(0, string.Format("{0,-10}{1,-15}{2,-10}{3,-10}", "Name", "Instruction", "Size", "OpCode")); 
opCodesStrings.Insert(1, string.Format("{0,-10}{1,-15}{2,-10}{3,-10}", "----", "-----------", "----", "------")); 
opCodesStrings.ForEach(Console.WriteLine); 

Первые строки выпускаемой продукции являются:

 

    Name  Instruction Size  OpCode  
    ----  ----------- ----  ------  
    Nop  nop   1   0x00  
    Break  break   1   0x01  
    Ldarg_0 ldarg.0  1   0x02  
    Ldarg_1 ldarg.1  1   0x03  
    Ldarg_2 ldarg.2  1   0x04  
    Ldarg_3 ldarg.3  1   0x05  
    Ldloc_0 ldloc.0  1   0x06  
    Ldloc_1 ldloc.1  1   0x07  
    Ldloc_2 ldloc.2  1   0x08  
    Ldloc_3 ldloc.3  1   0x09  
    Stloc_0 stloc.0  1   0x0A  
    Stloc_1 stloc.1  1   0x0B  
    Stloc_2 stloc.2  1   0x0C  
    Stloc_3 stloc.3  1   0x0D  
    Ldarg_S ldarg.s  1   0x0E  
    Ldarga_S ldarga.s  1   0x0F  
    ... 

Следующие ссылка указывает на страницу MSDN, описывающие каждый OpCode: https://msdn.microsoft.com/it-it/library/System.Reflection.Emit.OpCodes(v=vs.110).aspx

+0

Если вы хотите получить их из класса OpCodes, вам нужно будет отфильтровать коды «Префикс [1-7]», поскольку они не относятся к реальным op-кодам. Кроме того, OpCodes не включает «нет». prefix op, поэтому вам нужно будет включить его вручную. –