2011-06-30 27 views
10

Khi bạn nhìn thấy một dòng trong IL như:gì 'mã kích thước' trong MSIL nghĩa

// Code size  25 (0x19) 

gì nit thực sự nghĩa là gì? Là nó nói về việc sử dụng bộ nhớ (byte)? Tất cả những gì tôi có thể thu thập được là nó nhiều hơn số dòng IL. Dưới đây là IL đầy đủ.

.method private hidebysig static void Execute(string y) cil managed 
{ 
    // Code size  25 (0x19) 
    .maxstack 8 
    IL_0000: nop 
    IL_0001: ldstr  "string" 
    IL_0006: call  void [mscorlib]System.Console::WriteLine(string) 
    IL_000b: nop 
    IL_000c: ldarg.0 
    IL_000d: callvirt instance class [mscorlib]System.Type [mscorlib]System.Object::GetType() 
    IL_0012: call  void [mscorlib]System.Console::WriteLine(object) 
    IL_0017: nop 
    IL_0018: ret 
} // 

Khi tôi xem tài liệu ECMA_335, nó xác định kích thước mã là: Kích thước của đoạn mã (văn bản) hoặc tổng của tất cả các phần mã nếu có nhiều phần. (huh?)

Trả lời

9

Không phải tất cả các mã opcode của IL đều có cùng kích thước và mã hóa các đối số cho các mã khác nhau cũng chiếm nhiều không gian khác nhau. "Kích thước mã" là kích thước của tất cả các mã mở cộng với kích thước của toán hạng của chúng. Ví dụ:

Ví dụ, mã vạch nop là một byte đơn (được xem bởi OpCodes.Nop.Size) và không dùng bất kỳ toán hạng nào (như được xem bởi OpCodes.Nop.OperandType), do đó dòng đầu tiên yêu cầu một byte đơn (đó là lý do dòng thứ hai được dán nhãn với IL_0001). Ngoài ra, ldstr cũng là một byte đơn, nhưng đối số chuỗi được biểu diễn bằng IL bằng một bảng chuỗi bù, mất 4 byte (quan trọng là, nội dung của chuỗi không tính đến tính toán này), do đó, lệnh IL thứ hai của bạn có tổng số 5 byte (và dòng thứ ba được gắn nhãn với IL_0006).

Và cứ tiếp tục như vậy.

Các vấn đề liên quan