2012-04-21 49 views
19

Vì những mã IL này tôi thấy nhiều hơn, tôi thích tìm hiểu cách diễn giải chúng một cách chính xác.Cách tìm hiểu IL trên CLR

tôi không thể tìm thấy một tài liệu như C# Compiler hoặc bất kỳ khác vì vậy tôi nghĩ tôi khá nhiều có thể chăm sóc phần còn lại sau khi tôi học những phổ biến này:

Dưới đây là một số mã IL mẫu có chứa những gì tôi cần biết:

mẫu 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 

mẫu 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 

Tôi biết những gì các mã này làm kể từ khi tôi sản xuất chúng :-) tuy nhiên tôi muốn tìm hiểu thêm về mã IL tương ứng.

Các mẫu này chứa mã IL như, và bạn có thể giải thích lệnh bằng dấu hỏi không? và những lệnh đó cũng như thế nào? Vì vậy, chúng tôi có thể ghi nhớ chúng một cách dễ dàng.

  • nop (để gỡ lỗi - không hoạt động)
  • newobj (có vẻ như nó đang tạo ra đối tượng mới trong đống)
  • stloc.0?
  • ldloc.0?
  • ret?
  • ldarg.0?
  • ldstr?
  • stfld?
  • ldc.i4.s?
  • .ctor - constructor

Hiểu IL là quan trọng vì nó cho thấy cách đặc biệt trình biên dịch tạo ra mã số và hành động trong những trường hợp cụ thể.

Tuy nhiên, tôi không thể tìm thấy tài liệu hay có chứa các ví dụ về IL. CLR với C# 3.0 là một cuốn sách tốt tuy nhiên cuối cùng nó không phải là một cuốn sách IL vì vậy nó không giải thích tất cả mọi thứ về IL.

EDIT:

tôi đã tìm thấy các thông số kỹ thuật và họ nói với những: Nhờ @usr.

  • nop (để gỡ lỗi - không hoạt động)
  • newobj - tạo ra một đối tượng mới
  • stloc.0 - Giá trị pop từ ngăn xếp để biến địa phương
  • ldloc.0? - tải biến cục bộ lên ngăn xếp
  • ret - return từ phương thức
  • ldarg.0 - Tải đối số 0 lên ngăn xếp.
  • ldstr - tải một chuỗi chữ
  • stfld - cửa hàng vào một lĩnh vực của một đối tượng
  • ldc.i4.s - Đẩy num vào stack như int32, hình thức ngắn.
  • .ctor - constructor
+1

để cử tri gần:.. tôi thay đổi nội dung câu hỏi của tôi ... – Tarik

+0

tôi đã thay đổi tiêu đề tôi. nghĩ rằng đây là một câu hỏi hoàn toàn hợp lệ. – usr

+0

@usr: Cảm ơn bạn đã thay đổi tiêu đề, nó su lại có vẻ tốt bây giờ. – Tarik

Trả lời

7

Microsoft standardized the CLR and published those standards. Phân vùng III chứa nhiều thông tin về IL/CIL và phù hợp cho việc học tập. Nó là một tài liệu tuyệt vời.

Bạn cũng có thể tìm hiểu IL theo ví dụ. Biên dịch một vài phương pháp đơn giản trong C# và nhìn vào IL trong phản xạ (nó có một chế độ IL).

+0

Đó là những gì tôi đã làm tuy nhiên tôi rất thích những gì các lệnh này đứng cho quá. – Tarik

+0

Có, tôi khuyên bạn nên xem thông số kỹ thuật sau đó. Phân vùng III thực sự trông khá tốt và dễ hiểu. – usr

+0

Tôi đã tìm thấy những gì tôi đang tìm kiếm thực sự trong thông số kỹ thuật ở đây trong tệp pdf này: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-335.pdf – Tarik

7

Nếu bạn muốn tóm tắt ngắn gọn về từng mã vạch, bạn có thể làm tồi tệ hơn việc kiểm tra không gian tên System.Reflection.Emit. Ví dụ:

Ví dụ: có lớp OpCodes có trường tĩnh cho mỗi mã opcode. Mỗi một trong số này sau đó được mô tả chi tiết hơn, về hành vi ngăn xếp của nó. Ví dụ. Ldarg_0:

Các ldarg.0 hướng dẫn đẩy đối số được lập chỉ mục 0 vào stack đánh giá. Hướng dẫn ldarg.0 có thể được sử dụng để tải loại giá trị hoặc giá trị nguyên thủy lên ngăn xếp bằng cách sao chép nó từ một đối số đến.

8
  • nop - không-op
  • newobj - tạo một đối tượng và gọi constructor của nó.
  • stloc.0 - Pop một giá trị từ ngăn xếp và lưu trữ nó trong biến địa phương đầu tiên
  • ldloc.0 - Đẩy biến địa phương đầu tiên vào stack
  • ret - trở
  • ldarg.0 - Đẩy đối số đầu tiên (this trong các phương thức ví dụ) lên ngăn xếp
  • ldstr - Đẩy chuỗi vào ngăn xếp
  • stfld - đặt trường bằng cách sử dụng dữ liệu trên ngăn xếp.
  • ldc.i4.s - Đẩy số được chỉ định làm int.
  • .ctor - constructor

tôi khuyên bạn nên tìm một nguồn cung cấp tài liệu về những opcodes (Wikipedia có thể là tốt nhất, mặc dù :() Các tài liệu cho System.Reflection.Emit có tài liệu khá chi tiết. . cho opcodes

và trên tất cả, xây dựng chương trình nhỏ, kiểm tra việc sản xuất IL Đó là cách tốt nhất để học