2012-04-21 5 views
19

이 IL 코드는 내가 더 많이 본 것을 코드화하므로, 올바르게 해석하는 법을 배우기를 좋아합니다.CLR에서 IL을 배우는 방법

나는 C# 컴파일러 또는 그래서 나는이 일반적인 것들 배우고 후에 내가 꽤 많이 알아서 할 수 있다고 생각 다른 같은 문서를 찾을 수 없습니다

:

아래

내가 필요로하는 것을 포함하는 몇 가지 예제 IL 코드입니다을 알고 :

샘플 1 :

.method private hidebysig static void Main(string[] args) cil managed 
{ 
    .entrypoint 
    // Code size  15 (0xf) 
    .maxstack 1 
    .locals init ([0] class EnumReflection.DerivedClass derivedClass) 
    IL_0000: nop 
    IL_0001: newobj  instance void EnumReflection.DerivedClass::.ctor() 
    IL_0006: stloc.0 
    IL_0007: ldloc.0 
    IL_0008: callvirt instance void EnumReflection.DerivedClass::WriteOutput() 
    IL_000d: nop 
    IL_000e: ret 
} // end of method Program::Main 

샘플 2 :

.method public hidebysig specialname rtspecialname 
     instance void .ctor() cil managed 
{ 
    // Code size  38 (0x26) 
    .maxstack 8 
    IL_0000: ldarg.0 
    IL_0001: ldstr  "Hello" 
    IL_0006: stfld  string EnumReflection.DerivedClass::hello 
    IL_000b: ldarg.0 
    IL_000c: ldstr  "World" 
    IL_0011: stfld  string EnumReflection.DerivedClass::world 
    IL_0016: ldarg.0 
    IL_0017: ldc.i4.s 123 
    IL_0019: stfld  int32 EnumReflection.DerivedClass::age 
    IL_001e: ldarg.0 
    IL_001f: call  instance void EnumReflection.BaseClass::.ctor() 
    IL_0024: nop 
    IL_0025: ret 
} // end of method DerivedClass::.ctor 

나는이 코드들이 내가 제작 한 이후에 무엇을하는지 알고있다. 그러나 나는 대응하는 일리노이 코드에 대해 더 알고 싶다.

이러한 샘플에는 과 같은 IL 코드가 포함되어 있으며 물음표로 명령을 설명해주십시오. 그리고 그 명령은 무엇을 의미합니까? 그래서 우리는 쉽게 암기 할 수 있습니다.

  • NOP (디버깅 - 어떤 동작을)
  • NEWOBJ
  • stloc.0 (힙에서 새로운 개체를 만드는 것)?
  • ldloc.0?
  • ret?
  • ldarg.0?
  • ldstr?
  • stfld?
  • ldc.i4.s?
  • .ctor -이 컴파일러는 특정 경우에 코드와 행동을 생산하는 방법을 특정 노출로 생성자

IL 이해가 중요하다.

그러나 일리노이에 대한 예제가 포함 된 멋진 문서를 찾을 수 없습니다. C# 3.0이있는 CLR은 좋은 책이지만 결국 IL 책이 아니기 때문에 IL에 대한 모든 것을 설명하지는 못합니다.

편집 :

내가 사양을 발견 한 그들은이 말씀 : 덕분에 @usr 할 수 있습니다.

  • NOP (디버깅 -없는 오퍼레이션)
  • NEWOBJ -
  • ldloc.0 로컬 변수 스택에서 팝 값 - 새로운 객체
  • stloc.0를 작성? - 로컬 변수를 스택에로드하십시오.
  • 메소드에서 복귀 -
  • ldarg.0 - 스택에 인수 0을로드하십시오.
  • ldstr는 - 리터럴 스트링을
  • stfld로드 - 스토어 오브젝트
  • ldc.i4.s의 필드 - 푸시 NUM INT32 짧은 형태로 스택에.
  • .ctor - 생성자
+1

를 가까운 유권자에 :.. 나는이 제목을 변경 내 질문에 ... – Tarik

+0

편집 I를. 이것이 완전히 유효한 질문이라고 생각하십시오. – usr

+0

@usr : 제목을 바꾸셔서 고맙습니다. 다시 좋아 보인다. – Tarik

답변

7

Microsoft standardized the CLR and published those standards. 파티션 III은 IL/CIL에 대한 풍부한 정보를 포함하고 있으며 학습에 적합합니다. 그것은 훌륭한 문서입니다.

예를 통해 IL을 배울 수도 있습니다. C#에서 몇 가지 간단한 메소드를 컴파일하고 리플렉터 (IL 모드가 있음)에서 IL을 봅니다.

+0

그것은 내가 한 일이지만 나는이 명령들이 의미하는 것을 너무 좋아할 것입니다. – Tarik

+0

예, 스펙을 살펴 보시기 바랍니다. 파티션 III은 실제로 꽤 좋고 이해할 만합니다. – usr

+0

나는 실제로이 PDF 파일의 사양에서 찾고있는 것을 찾았습니다. http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-335.pdf – Tarik

7

각 opcode의 간단한 개요를 보려면 System.Reflection.Emit 네임 스페이스를 검사하는 것보다 더 나쁠 수 있습니다.

예를 들어, 각 opcode에 정적 필드가있는 OpCodes 클래스가 있습니다. 이들 각각은 그 스택 동작의 관점에서 더 자세히 기술된다. 예 : Ldarg_0 :

ldarg.0 명령 계산 스택 상 0 인덱스 인수 푸시. ldarg.0 명령어는 들어오는 인수에서 값 유형이나 프리미티브 값을 복사하여 스택에로드하는 데 사용할 수 있습니다.

8
  • NOP - 어떤 조합을
  • NEWOBJ을 - 객체를 생성하고 생성자를 호출합니다.
  • stloc.0은 - 스택으로부터 값을 팝하고, 제 1 로컬 변수
  • ldloc.0를 저장할 -
  • ldarg.0 반납 - 스택으로
  • RET을 제 로컬 변수 푸시 -
  • ldstr - 문자열을 스택에 푸시
  • stfld - 스택의 데이터를 사용하여 필드를 설정합니다.
  • ldc.i4.s - 지정된 숫자를 정수로 푸시하십시오.
  • .ctor - 생성자

난 당신이 System.Reflection.Emit에 대한 문서는 상당히 자세한 설명서가 있습니다 (하지만 :(위키 백과가 최고 일 수 있음)이 옵 코드에 대한 문서의 좋은 소스를 찾을 것이 좋습니다. . 옵 코드에 대한

그리고 무엇보다도

, 작은 프로그램을 구축하고 IL 출력을 검사 즉, 배울 수있는 가장 좋은 방법입니다