2011-08-27 8 views
7

C'è qualche documentazione o c'è una parte del codice sorgente di Cecil che posso consultare per avere una visione completa delle quali Operand tipi Cecil utilizzerà per una data Code valore? Ad esempio: posso spigolare da MethodBodyRocks che Ldloc prende un Operand di tipo VariableDefinition, ma non sono stato in grado di rintracciare questo verso il basso per alcuni degli altri codici di istruzioni.cecil: tipi Instruction.Operand corrispondenti al valore Instruction.OpCode.Code

risposta

5

È possibile esaminare la definizione di ciascun codice operativo nel file OpCodes.cs.

E.g. per Ldloc si vedrebbe OperandType.InlineVar

17

Per aggiungere alla risposta di poupou, OpCodes.cs mostra quali OperandType viene assegnato per ciascun codice di istruzione. Usando questo OperandType puoi consultare CodeReader.ReadOperand per vedere come questi OperandType s sono usati per determinare quale tipo di oggetto concreto è costruito. Si noti inoltre che CodeReader.ReadCode utilizza CodeReader.ResolveBranches per trasformare alcuni operandi dagli offset di istruzione negli oggetti Instruction prima di tornare.

Ho creato questo tavolo che era molto più conveniente poi scavare attraverso la fonte ogni volta (qualsiasi cosa che non rientrano in questa tabella dovrebbe avere un InlineNone OperandType):

Instruction.OpCode.Code|Instruction.OpCode.OperandType|Instruction.Operand class 
Ldarg_S    |ShortInlineArg    |ParameterDefinition 
Ldarga_S    |ShortInlineArg    |ParameterDefinition 
Starg_S    |ShortInlineArg    |ParameterDefinition 
Ldloc_S    |ShortInlineVar    |VariableDefinition 
Ldloca_S    |ShortInlineVar    |VariableDefinition 
Stloc_S    |ShortInlineVar    |VariableDefinition 
Ldc_I4_S    |ShortInlineI     |sbyte <===== NOTE: special case 
Ldc_I4     |InlineI      |int32 
Ldc_I8     |InlineI8      |int64 
Ldc_R4     |ShortInlineR     |single 
Ldc_R8     |InlineR      |float (64 bit) 
Jmp     |InlineMethod     |MethodReference 
Call     |InlineMethod     |MethodReference 
Calli     |InlineSig      |CallSite 
Br_S     |ShortInlineBrTarget   |Instruction 
Brfalse_S    |ShortInlineBrTarget   |Instruction 
Brtrue_S    |ShortInlineBrTarget   |Instruction 
Beq_S     |ShortInlineBrTarget   |Instruction 
Bge_S     |ShortInlineBrTarget   |Instruction 
Bgt_S     |ShortInlineBrTarget   |Instruction 
Ble_S     |ShortInlineBrTarget   |Instruction 
Blt_S     |ShortInlineBrTarget   |Instruction 
Bne_Un_S    |ShortInlineBrTarget   |Instruction 
Bge_Un_S    |ShortInlineBrTarget   |Instruction 
Bgt_Un_S    |ShortInlineBrTarget   |Instruction 
Ble_Un_S    |ShortInlineBrTarget   |Instruction 
Blt_Un_S    |ShortInlineBrTarget   |Instruction 
Br      |InlineBrTarget    |Instruction 
Brfalse    |InlineBrTarget    |Instruction 
Brtrue     |InlineBrTarget    |Instruction 
Beq     |InlineBrTarget    |Instruction 
Bge     |InlineBrTarget    |Instruction 
Bgt     |InlineBrTarget    |Instruction 
Ble     |InlineBrTarget    |Instruction 
Blt     |InlineBrTarget    |Instruction 
Bne_Un     |InlineBrTarget    |Instruction 
Bge_Un     |InlineBrTarget    |Instruction 
Bgt_Un     |InlineBrTarget    |Instruction 
Ble_Un     |InlineBrTarget    |Instruction 
Blt_Un     |InlineBrTarget    |Instruction 
Switch     |InlineSwitch     |Instruction array 
Callvirt    |InlineMethod     |MethodReference 
Cpobj     |InlineType     |TypeReference 
Ldobj     |InlineType     |TypeReference 
Ldstr     |InlineString     |string 
Newobj     |InlineMethod     |MethodReference 
Castclass    |InlineType     |TypeReference 
Isinst     |InlineType     |TypeReference 
Unbox     |InlineType     |TypeReference 
Ldfld     |InlineField     |FieldReference 
Ldflda     |InlineField     |FieldReference 
Stfld     |InlineField     |FieldReference 
Ldsfld     |InlineField     |FieldReference 
Ldsflda    |InlineField     |FieldReference 
Stsfld     |InlineField     |FieldReference 
Stobj     |InlineType     |TypeReference 
Box     |InlineType     |TypeReference 
Newarr     |InlineType     |TypeReference 
Ldelema    |InlineType     |TypeReference 
Ldelem_Any    |InlineType     |TypeReference 
Stelem_Any    |InlineType     |TypeReference 
Unbox_Any    |InlineType     |TypeReference 
Refanyval    |InlineType     |TypeReference 
Mkrefany    |InlineType     |TypeReference 
Ldtoken    |InlineTok      |IMetadataTokenProvider 
Leave     |InlineBrTarget    |Instruction 
Leave_S    |ShortInlineBrTarget   |Instruction 
Ldftn     |InlineMethod     |MethodReference 
Ldvirtftn    |InlineMethod     |MethodReference 
Ldarg     |InlineArg      |ParameterDefinition 
Ldarga     |InlineArg      |ParameterDefinition 
Starg     |InlineArg      |ParameterDefinition 
Ldloc     |InlineVar      |VariableDefinition 
Ldloca     |InlineVar      |VariableDefinition 
Stloc     |InlineVar      |VariableDefinition 
Unaligned    |ShortInlineI     |byte 
Initobj    |InlineType     |TypeReference 
Constrained   |InlineType     |TypeReference 
No      |ShortInlineI     |byte 
Sizeof     |InlineType     |TypeReference 
+1

grande tavolo, grazie! – Alexus

Problemi correlati